/ Hex Artifact Content
Login

Artifact 0cac72a676f4df029fc9fffd1223d6bf307e02c6:


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 6e 63 6c 75 64 65 20 3c 75  .h>.# include <u
11b0: 75 69 64 2f 75 75 69 64 2e 68 3e 0a 23 20 69 66  uid/uuid.h>.# if
11c0: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
11d0: 5f 5f 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f  __) && ((__MAC_O
11e0: 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f  S_X_VERSION_MIN_
11f0: 52 45 51 55 49 52 45 44 20 3e 20 31 30 35 30 29  REQUIRED > 1050)
1200: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 20 28 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56    (__IPHONE_OS_V
1230: 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49  ERSION_MIN_REQUI
1240: 52 45 44 20 3e 20 32 30 30 30 29 29 0a 23 20 20  RED > 2000)).#  
1250: 64 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48  define HAVE_GETH
1260: 4f 53 54 55 55 49 44 20 31 0a 23 20 65 6e 64 69  OSTUUID 1.# endi
1270: 66 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b  f.# if OS_VXWORK
1280: 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 65  S.#  include <se
1290: 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e  maphore.h>.#  in
12a0: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
12b0: 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75  .# else.#  inclu
12c0: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
12d0: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  #  include <sys/
12e0: 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66  param.h>.# endif
12f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1300: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1310: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
1320: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1330: 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41  ) || (SQLITE_ENA
1340: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1350: 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53  E && !OS_VXWORKS
1360: 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  ).# include <sys
1370: 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66  /mount.h>.#endif
1380: 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 54  ..#ifdef HAVE_UT
1390: 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  IME.# include <u
13a0: 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  time.h>.#endif..
13b0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61  /*.** Allowed va
13c0: 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65  lues of unixFile
13d0: 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  .fsFlags.*/.#def
13e0: 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  ine SQLITE_FSFLA
13f0: 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20  GS_IS_MSDOS     
1400: 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  0x1../*.** If we
1410: 20 61 72 65 20 74 6f 20 62 65 20 74 68 72 65 61   are to be threa
1420: 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20  d-safe, include 
1430: 74 68 65 20 70 74 68 72 65 61 64 73 20 68 65 61  the pthreads hea
1440: 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a  der and define.*
1450: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49  * the SQLITE_UNI
1460: 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e  X_THREADS macro.
1470: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
1480: 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c  HREADSAFE.# incl
1490: 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a  ude <pthread.h>.
14a0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
14b0: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23  UNIX_THREADS 1.#
14c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
14d0: 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  ault permissions
14e0: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
14f0: 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66   new file.*/.#if
1500: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  ndef SQLITE_DEFA
1510: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
1520: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
1530: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
1540: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36  E_PERMISSIONS 06
1550: 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  44.#endif../*. *
1560: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
1570: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
1580: 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79 20 64  ing auto proxy d
1590: 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ir. */.#ifndef S
15a0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
15b0: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
15c0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
15d0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
15e0: 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  DIR_PERMISSIONS 
15f0: 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0755.#endif../*.
1600: 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f  ** Maximum suppo
1610: 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68  rted path-length
1620: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58  ..*/.#define MAX
1630: 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f  _PATHNAME 512../
1640: 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68  *.** Only set th
1650: 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20 74  e lastErrno if t
1660: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
1670: 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61 6e   a real error an
1680: 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d  d not .** a norm
1690: 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74 75  al expected retu
16a0: 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54  rn code of SQLIT
16b0: 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45  E_BUSY or SQLITE
16c0: 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  _OK.*/.#define I
16d0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20  S_LOCK_ERROR(x) 
16e0: 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f   ((x != SQLITE_O
16f0: 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c 49  K) && (x != SQLI
1700: 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46 6f  TE_BUSY))../* Fo
1710: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
1720: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1730: 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78 53  ct unixShm unixS
1740: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
1750: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1760: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1770: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1780: 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69 78  unixShmNode unix
1790: 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f  ShmNode;       /
17a0: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
17b0: 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70 65  instance */.type
17c0: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 49  def struct unixI
17d0: 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e 6f  nodeInfo unixIno
17e0: 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e 20  deInfo;   /* An 
17f0: 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64 65  i-node */.typede
1800: 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75  f struct UnixUnu
1810: 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65 64  sedFd UnixUnused
1820: 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e  Fd;     /* An un
1830: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1840: 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ptor */../*.** S
1850: 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72 20  ometimes, after 
1860: 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 73  a file handle is
1870: 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69 74   closed by SQLit
1880: 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  e, the file desc
1890: 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74  riptor.** cannot
18a0: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
18b0: 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73 65  iately. In these
18c0: 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63 65   cases, instance
18d0: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
18e0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  ng.** structure 
18f0: 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  are used to stor
1900: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
1910: 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69 74  iptor while wait
1920: 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70  ing for an.** op
1930: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69 74  portunity to eit
1940: 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65 75  her close or reu
1950: 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  se it..*/.struct
1960: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b 0a   UnixUnusedFd {.
1970: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
1980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1990: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
19a0: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74  o close */.  int
19b0: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
19c0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
19d0: 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69  this file descri
19e0: 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ptor was opened 
19f0: 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  with */.  UnixUn
1a00: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20 20  usedFd *pNext;  
1a10: 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73      /* Next unus
1a20: 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
1a30: 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20  or on same file 
1a40: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
1a50: 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
1a60: 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20  ure is subclass 
1a70: 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  of sqlite3_file 
1a80: 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20  specific to the 
1a90: 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c  unix.** VFS impl
1aa0: 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a  ementations..*/.
1ab0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
1ac0: 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65  nixFile unixFile
1ad0: 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  ;.struct unixFil
1ae0: 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  e {.  sqlite3_io
1af0: 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
1b00: 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77  pMethod;  /* Alw
1b10: 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e  ays the first en
1b20: 74 72 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  try */.  unixIno
1b30: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
1b60: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
1b70: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1ba0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1bb0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1bc0: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1bd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1be0: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1bf0: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1c00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
1c10: 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  trlFlags;       
1c20: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1c30: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
1c40: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
1c50: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
1c80: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
1c90: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1ca0: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1cb0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1cc0: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1cd0: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1ce0: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1cf0: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1d10: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1d20: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1d40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d50: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1d60: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
1d70: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1da0: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1db0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1dc0: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de0: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1df0: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1e00: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1e10: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1e20: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1e30: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e50: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1e60: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1e70: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1e80: 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
1e90: 43 54 49 4f 4e 0a 20 20 69 6e 74 20 70 72 6f 74  CTION.  int prot
1ea0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1ec0: 61 74 61 20 70 72 6f 74 65 63 74 69 6f 6e 20 66  ata protection f
1ed0: 6c 61 67 73 20 66 72 6f 6d 20 75 6e 69 78 4f 70  lags from unixOp
1ee0: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  en */.#endif.#if
1ef0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1f00: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20  OCKING_STYLE || 
1f10: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1f20: 5f 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73  _).  unsigned fs
1f30: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68           /* cach
1f50: 65 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20  ed details from 
1f60: 73 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64  statfs() */.#end
1f70: 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  if.#if OS_VXWORK
1f80: 53 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  S.  int isDelete
1f90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fa0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
1fb0: 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72  e on close if tr
1fc0: 75 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76  ue */.  struct v
1fd0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
1fe0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  d;          /* U
1ff0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f  nique file ID */
2000: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
2010: 4e 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  NDEBUG.  /* The 
2020: 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61  next group of va
2030: 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64  riables are used
2040: 20 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65   to track whethe
2050: 72 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a  r or not the.  *
2060: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
2070: 75 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32  unter in bytes 2
2080: 34 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65  4-27 of database
2090: 20 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74   files are updat
20a0: 65 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72  ed.  ** whenever
20b0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
20c0: 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
20d0: 73 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  s.  An assertion
20e0: 20 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a   fault will.  **
20f0: 20 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65   occur if a file
2100: 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
2110: 6f 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e  out also updatin
2120: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
2130: 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20  n.  ** counter. 
2140: 20 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61   This test is ma
2150: 64 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20  de to avoid new 
2160: 70 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72  problems similar
2170: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65   to the.  ** one
2180: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69   described by ti
2190: 63 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a  cket #3584. .  *
21a0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
21b0: 72 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b  r transCntrChng;
21c0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
21d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
21e0: 75 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f  unter changed */
21f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2200: 20 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20   dbUpdate;      
2210: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
2220: 20 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73   part of databas
2230: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a  e file changed *
2240: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
2250: 72 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b  r inNormalWrite;
2260: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e     /* True if in
2270: 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
2280: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e  operation */.#en
2290: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
22a0: 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74  E_TEST.  /* In t
22b0: 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61  est mode, increa
22c0: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
22d0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20  his structure a 
22e0: 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a  bit so that .  *
22f0: 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74  * it is larger t
2300: 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43  han the struct C
2310: 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64  rashFile defined
2320: 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a   in test6.c..  *
2330: 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e  /.  char aPaddin
2340: 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b  g[32];.#endif.};
2350: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
2360: 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 75  values for the u
2370: 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67  nixFile.ctrlFlag
2380: 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64  s bitmask:.*/.#d
2390: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45  efine UNIXFILE_E
23a0: 58 43 4c 20 20 20 20 20 20 20 20 30 78 30 31 20  XCL        0x01 
23b0: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
23c0: 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63  ns from one proc
23d0: 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66  ess only */.#def
23e0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  ine UNIXFILE_RDO
23f0: 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20 20 20  NLY      0x02   
2400: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
2410: 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a  is read only */.
2420: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
2430: 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78 30  _PERSIST_WAL 0x0
2440: 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73 74  4     /* Persist
2450: 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a  ent WAL mode */.
2460: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
2470: 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 23  ISABLE_DIRSYNC.#
2480: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
2490: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 38  _DIRSYNC    0x08
24a0: 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
24b0: 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a 2f  y sync needed */
24c0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
24d0: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
24e0: 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66 0a      0x00.#endif.
24f0: 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63  ./*.** Include c
2500: 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d  ode that is comm
2510: 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63  on to all os_*.c
2520: 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75   files.*/.#inclu
2530: 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22  de "os_common.h"
2540: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
2550: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
2560: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
2570: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
2580: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
2590: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
25a0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
25b0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
25c0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
25d0: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
25e0: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
25f0: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
2600: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
2610: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
2620: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
2630: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
2640: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
2650: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
2660: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
2670: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
2680: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
2690: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
26a0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
26b0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
26c0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
26d0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
26e0: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
26f0: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
2700: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
2710: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 23  adid 0.#endif..#
2720: 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a  ifdef __APPLE__.
2730: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45  #define SQLITE_E
2740: 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f 43 4b 20  NABLE_SUPERLOCK 
2750: 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  1.#endif..#if SQ
2760: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55 50 45  LITE_ENABLE_SUPE
2770: 52 4c 4f 43 4b 0a 23 69 6e 63 6c 75 64 65 20 22  RLOCK.#include "
2780: 73 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c  sqlite3.h".#incl
2790: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 20 20  ude <string.h>  
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27b0: 6d 65 6d 73 65 74 28 29 2c 20 73 74 72 6c 65 6e  memset(), strlen
27c0: 28 29 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  () */.#include <
27d0: 61 73 73 65 72 74 2e 68 3e 20 20 20 20 20 20 20  assert.h>       
27e0: 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72          /* asser
27f0: 74 28 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20  t() */../*.** A 
2800: 73 74 72 75 63 74 75 72 65 20 74 6f 20 63 6f 6c  structure to col
2810: 6c 65 63 74 20 61 20 62 75 73 79 2d 68 61 6e 64  lect a busy-hand
2820: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64  ler callback and
2830: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 20   argument and a 
2840: 63 6f 75 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20  count.** of the 
2850: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
2860: 69 74 20 68 61 73 20 62 65 65 6e 20 69 6e 76 6f  it has been invo
2870: 6b 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ked..*/.struct S
2880: 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 7b 0a 20  uperlockBusy {. 
2890: 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f   int (*xBusy)(vo
28a0: 69 64 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20  id*,int);       
28b0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
28c0: 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
28d0: 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
28e0: 70 42 75 73 79 41 72 67 3b 20 20 20 20 20 20 20  pBusyArg;       
28f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2900: 73 74 20 61 72 67 20 74 6f 20 70 61 73 73 20 74  st arg to pass t
2910: 6f 20 78 42 75 73 79 20 2a 2f 0a 20 20 69 6e 74  o xBusy */.  int
2920: 20 6e 42 75 73 79 3b 20 20 20 20 20 20 20 20 20   nBusy;         
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2940: 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  Number of times 
2950: 78 42 75 73 79 20 68 61 73 20 62 65 65 6e 20 69  xBusy has been i
2960: 6e 76 6f 6b 65 64 20 2a 2f 0a 7d 3b 0a 74 79 70  nvoked */.};.typ
2970: 65 64 65 66 20 73 74 72 75 63 74 20 53 75 70 65  edef struct Supe
2980: 72 6c 6f 63 6b 42 75 73 79 20 53 75 70 65 72 6c  rlockBusy Superl
2990: 6f 63 6b 42 75 73 79 3b 0a 0a 2f 2a 0a 2a 2a 20  ockBusy;../*.** 
29a0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
29b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
29c0: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
29d0: 74 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74  ted for each act
29e0: 69 76 65 0a 2a 2a 20 73 75 70 65 72 6c 6f 63 6b  ive.** superlock
29f0: 2e 20 54 68 65 20 6f 70 61 71 75 65 20 68 61 6e  . The opaque han
2a00: 64 6c 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  dle returned by 
2a10: 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
2a20: 72 6c 6f 63 6b 28 29 20 69 73 0a 2a 2a 20 61 63  rlock() is.** ac
2a30: 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  tually a pointer
2a40: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
2a50: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
2a60: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 70  e..*/.struct Sup
2a70: 65 72 6c 6f 63 6b 20 7b 0a 20 20 73 71 6c 69 74  erlock {.  sqlit
2a80: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
2a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2aa0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 75 73  tabase handle us
2ab0: 65 64 20 74 6f 20 6c 6f 63 6b 20 64 62 20 2a 2f  ed to lock db */
2ac0: 0a 20 20 69 6e 74 20 62 57 61 6c 3b 20 20 20 20  .  int bWal;    
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64 62     /* True if db
2af0: 20 69 73 20 61 20 57 41 4c 20 64 61 74 61 62 61   is a WAL databa
2b00: 73 65 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66  se */.};.typedef
2b10: 20 73 74 72 75 63 74 20 53 75 70 65 72 6c 6f 63   struct Superloc
2b20: 6b 20 53 75 70 65 72 6c 6f 63 6b 3b 0a 0a 2f 2a  k Superlock;../*
2b30: 0a 2a 2a 20 54 68 65 20 70 43 74 78 20 70 6f 69  .** The pCtx poi
2b40: 6e 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 74  nter passed to t
2b50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2b60: 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74  actually a point
2b70: 65 72 20 74 6f 20 61 0a 2a 2a 20 53 75 70 65 72  er to a.** Super
2b80: 6c 6f 63 6b 42 75 73 79 20 73 74 72 75 63 74 75  lockBusy structu
2b90: 72 65 2e 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  re. Invoke the b
2ba0: 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
2bb0: 74 69 6f 6e 20 65 6e 63 61 70 73 75 6c 61 74 65  tion encapsulate
2bc0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 74 72 75  d.** by the stru
2bd0: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
2be0: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a   the result..*/.
2bf0: 73 74 61 74 69 63 20 69 6e 74 20 73 75 70 65 72  static int super
2c00: 6c 6f 63 6b 42 75 73 79 48 61 6e 64 6c 65 72 28  lockBusyHandler(
2c10: 76 6f 69 64 20 2a 70 43 74 78 2c 20 69 6e 74 20  void *pCtx, int 
2c20: 55 4e 55 53 45 44 29 7b 0a 20 20 53 75 70 65 72  UNUSED){.  Super
2c30: 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20  lockBusy *pBusy 
2c40: 3d 20 28 53 75 70 65 72 6c 6f 63 6b 42 75 73 79  = (SuperlockBusy
2c50: 20 2a 29 70 43 74 78 3b 0a 20 20 69 66 28 20 70   *)pCtx;.  if( p
2c60: 42 75 73 79 2d 3e 78 42 75 73 79 3d 3d 30 20 29  Busy->xBusy==0 )
2c70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
2c80: 75 72 6e 20 70 42 75 73 79 2d 3e 78 42 75 73 79  urn pBusy->xBusy
2c90: 28 70 42 75 73 79 2d 3e 70 42 75 73 79 41 72 67  (pBusy->pBusyArg
2ca0: 2c 20 70 42 75 73 79 2d 3e 6e 42 75 73 79 2b 2b  , pBusy->nBusy++
2cb0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
2cc0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
2cd0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
2ce0: 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
2cf0: 61 73 65 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a  ase file for .**
2d00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69   connection db i
2d10: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
2d20: 64 65 20 6f 72 20 6e 6f 74 2e 20 49 66 20 6e 6f  de or not. If no
2d30: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
2d40: 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
2d50: 65 20 66 69 6c 65 20 69 73 20 69 6e 20 57 41 4c  e file is in WAL
2d60: 20 6d 6f 64 65 2c 20 73 65 74 20 2a 70 62 57 61   mode, set *pbWa
2d70: 6c 20 74 6f 20 74 72 75 65 20 61 6e 64 20 72 65  l to true and re
2d80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
2d90: 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
2da0: 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74  in WAL mode, set
2db0: 20 2a 70 62 57 61 6c 20 74 6f 20 66 61 6c 73 65   *pbWal to false
2dc0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
2dd0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
2de0: 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
2df0: 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 76 61 6c  or code. The val
2e00: 75 65 20 6f 66 20 2a 70 62 57 61 6c 0a 2a 2a 20  ue of *pbWal.** 
2e10: 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
2e20: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
2e30: 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f  atic int superlo
2e40: 63 6b 49 73 57 61 6c 28 53 75 70 65 72 6c 6f 63  ckIsWal(Superloc
2e50: 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  k *pLock){.  int
2e60: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e80: 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2e90: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2ea0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
2eb0: 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 50 52 41   /* Compiled PRA
2ec0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
2ed0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20   statement */.. 
2ee0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
2ef0: 65 70 61 72 65 28 70 4c 6f 63 6b 2d 3e 64 62 2c  epare(pLock->db,
2f00: 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f   "PRAGMA main.jo
2f10: 75 72 6e 61 6c 5f 6d 6f 64 65 22 2c 20 2d 31 2c  urnal_mode", -1,
2f20: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
2f30: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f40: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
2f50: 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 30   pLock->bWal = 0
2f60: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52  ;.  if( SQLITE_R
2f70: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2f80: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 63  (pStmt) ){.    c
2f90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65  onst char *zMode
2fa0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
2fb0: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2fc0: 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  text(pStmt, 0);.
2fd0: 20 20 20 20 69 66 28 20 7a 4d 6f 64 65 20 26 26      if( zMode &&
2fe0: 20 73 74 72 6c 65 6e 28 7a 4d 6f 64 65 29 3d 3d   strlen(zMode)==
2ff0: 33 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  3 && sqlite3_str
3000: 6e 69 63 6d 70 28 22 77 61 6c 22 2c 20 7a 4d 6f  nicmp("wal", zMo
3010: 64 65 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20  de, 3)==0 ){.   
3020: 20 20 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d     pLock->bWal =
3030: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
3040: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
3050: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
3060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e  .}../*.** Obtain
3070: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 73 68   an exclusive sh
3080: 6d 2d 6c 6f 63 6b 20 6f 6e 20 6e 42 79 74 65 20  m-lock on nByte 
3090: 62 79 74 65 73 20 73 74 61 72 74 69 6e 67 20 61  bytes starting a
30a0: 74 20 6f 66 66 73 65 74 20 69 64 78 0a 2a 2a 20  t offset idx.** 
30b0: 6f 66 20 74 68 65 20 66 69 6c 65 20 66 64 2e 20  of the file fd. 
30c0: 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  If the lock cann
30d0: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 20 69  ot be obtained i
30e0: 6d 6d 65 64 69 61 74 65 6c 79 2c 20 69 6e 76 6f  mmediately, invo
30f0: 6b 65 0a 2a 2a 20 74 68 65 20 62 75 73 79 2d 68  ke.** the busy-h
3100: 61 6e 64 6c 65 72 20 75 6e 74 69 6c 20 65 69 74  andler until eit
3110: 68 65 72 20 69 74 20 69 73 20 6f 62 74 61 69 6e  her it is obtain
3120: 65 64 20 6f 72 20 74 68 65 20 62 75 73 79 2d 68  ed or the busy-h
3130: 61 6e 64 6c 65 72 0a 2a 2a 20 63 61 6c 6c 62 61  andler.** callba
3140: 63 6b 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2f  ck returns 0..*/
3150: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 70 65  .static int supe
3160: 72 6c 6f 63 6b 53 68 6d 4c 6f 63 6b 28 0a 20 20  rlockShmLock(.  
3170: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
3180: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3190: 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
31a0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
31b0: 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20   idx,           
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31d0: 4f 66 66 73 65 74 20 6f 66 20 73 68 6d 2d 6c 6f  Offset of shm-lo
31e0: 63 6b 20 74 6f 20 6f 62 74 61 69 6e 20 2a 2f 0a  ck to obtain */.
31f0: 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
3220: 6f 6e 73 65 63 74 69 76 65 20 62 79 74 65 73 20  onsective bytes 
3230: 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 53 75 70  to lock */.  Sup
3240: 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75 73  erlockBusy *pBus
3250: 79 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y            /* 
3260: 42 75 73 79 2d 68 61 6e 64 6c 65 72 20 77 72 61  Busy-handler wra
3270: 70 70 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  pper object */.)
3280: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
3290: 74 20 28 2a 78 53 68 6d 4c 6f 63 6b 29 28 73 71  t (*xShmLock)(sq
32a0: 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
32b0: 2c 20 69 6e 74 2c 20 69 6e 74 29 20 3d 20 66 64  , int, int) = fd
32c0: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
32d0: 4c 6f 63 6b 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  Lock;.  do {.   
32e0: 20 72 63 20 3d 20 78 53 68 6d 4c 6f 63 6b 28 66   rc = xShmLock(f
32f0: 64 2c 20 69 64 78 2c 20 6e 42 79 74 65 2c 20 53  d, idx, nByte, S
3300: 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 7c 53  QLITE_SHM_LOCK|S
3310: 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
3320: 49 56 45 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  IVE);.  }while( 
3330: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
3340: 26 26 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79  && superlockBusy
3350: 48 61 6e 64 6c 65 72 28 28 76 6f 69 64 20 2a 29  Handler((void *)
3360: 70 42 75 73 79 2c 20 30 29 20 29 3b 0a 20 20 72  pBusy, 0) );.  r
3370: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3380: 2a 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 65 78  ** Obtain the ex
3390: 74 72 61 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  tra locks on the
33a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 72   database file r
33b0: 65 71 75 69 72 65 64 20 66 6f 72 20 57 41 4c 20  equired for WAL 
33c0: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 49 6e  databases..** In
33d0: 76 6f 6b 65 20 74 68 65 20 73 75 70 70 6c 69 65  voke the supplie
33e0: 64 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 61  d busy-handler a
33f0: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
3400: 74 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c  tatic int superl
3410: 6f 63 6b 57 61 6c 4c 6f 63 6b 28 0a 20 20 73 71  ockWalLock(.  sq
3420: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3440: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
3450: 20 6f 70 65 6e 20 6f 6e 20 57 41 4c 20 64 61 74   open on WAL dat
3460: 61 62 61 73 65 20 2a 2f 0a 20 20 53 75 70 65 72  abase */.  Super
3470: 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20  lockBusy *pBusy 
3480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
3490: 73 79 20 68 61 6e 64 6c 65 72 20 77 72 61 70 70  sy handler wrapp
34a0: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  er object */.){.
34b0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
34e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
34f0: 6c 65 20 2a 66 64 20 3d 20 30 3b 20 20 20 20 20  le *fd = 0;     
3500: 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61        /* Main da
3510: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64  tabase file hand
3520: 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c  le */.  void vol
3530: 61 74 69 6c 65 20 2a 70 20 3d 20 30 3b 20 20 20  atile *p = 0;   
3540: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
3550: 65 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  er to first page
3560: 20 6f 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   of shared memor
3570: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  y */..  /* Obtai
3580: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
3590: 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
35a0: 6f 62 6a 65 63 74 20 6f 70 65 6e 20 6f 6e 20 74  object open on t
35b0: 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e  he main db file.
35c0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
35d0: 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
35e0: 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49  db, "main", SQLI
35f0: 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f  TE_FCNTL_FILE_PO
3600: 49 4e 54 45 52 2c 20 28 76 6f 69 64 20 2a 29 26  INTER, (void *)&
3610: 66 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  fd);.  if( rc!=S
3620: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
3630: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61  n rc;..  /* Obta
3640: 69 6e 20 74 68 65 20 22 72 65 63 6f 76 65 72 79  in the "recovery
3650: 22 20 6c 6f 63 6b 2e 20 4e 6f 72 6d 61 6c 6c 79  " lock. Normally
3660: 2c 20 74 68 69 73 20 6c 6f 63 6b 20 69 73 20 6f  , this lock is o
3670: 6e 6c 79 20 6f 62 74 61 69 6e 65 64 20 62 79 0a  nly obtained by.
3680: 20 20 2a 2a 20 63 6c 69 65 6e 74 73 20 72 75 6e    ** clients run
3690: 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 72 65  ning database re
36a0: 63 6f 76 65 72 79 2e 20 20 0a 20 20 2a 2f 0a 20  covery.  .  */. 
36b0: 20 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53   rc = superlockS
36c0: 68 6d 4c 6f 63 6b 28 66 64 2c 20 32 2c 20 31 2c  hmLock(fd, 2, 1,
36d0: 20 70 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72   pBusy);.  if( r
36e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
36f0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
3700: 5a 65 72 6f 20 74 68 65 20 73 74 61 72 74 20 6f  Zero the start o
3710: 66 20 74 68 65 20 66 69 72 73 74 20 73 68 61 72  f the first shar
3720: 65 64 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2e 20  ed-memory page. 
3730: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
3740: 61 6e 79 0a 20 20 2a 2a 20 63 6c 69 65 6e 74 73  any.  ** clients
3750: 20 74 68 61 74 20 6f 70 65 6e 20 72 65 61 64 20   that open read 
3760: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
3770: 74 69 6f 6e 73 20 66 72 6f 6d 20 74 68 69 73 20  tions from this 
3780: 70 6f 69 6e 74 20 6f 6e 20 77 69 6c 6c 0a 20 20  point on will.  
3790: 2a 2a 20 68 61 76 65 20 74 6f 20 72 75 6e 20 72  ** have to run r
37a0: 65 63 6f 76 65 72 79 20 62 65 66 6f 72 65 20 70  ecovery before p
37b0: 72 6f 63 65 65 64 69 6e 67 2e 20 53 69 6e 63 65  roceeding. Since
37c0: 20 74 68 65 79 20 6e 65 65 64 20 74 68 65 20 22   they need the "
37d0: 72 65 63 6f 76 65 72 79 22 0a 20 20 2a 2a 20 6c  recovery".  ** l
37e0: 6f 63 6b 20 74 68 61 74 20 74 68 69 73 20 70 72  ock that this pr
37f0: 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
3800: 20 74 6f 20 64 6f 20 74 68 61 74 2c 20 6e 6f 20   to do that, no 
3810: 6e 65 77 20 72 65 61 64 20 6f 72 20 77 72 69 74  new read or writ
3820: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
3830: 6f 6e 73 20 6d 61 79 20 6e 6f 77 20 62 65 20 6f  ons may now be o
3840: 70 65 6e 65 64 2e 20 4e 6f 72 20 63 61 6e 20 61  pened. Nor can a
3850: 20 63 68 65 63 6b 70 6f 69 6e 74 20 62 65 20 72   checkpoint be r
3860: 75 6e 2c 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  un, for the.  **
3870: 20 73 61 6d 65 20 72 65 61 73 6f 6e 2e 0a 20 20   same reason..  
3880: 2a 2f 0a 20 20 72 63 20 3d 20 66 64 2d 3e 70 4d  */.  rc = fd->pM
3890: 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28  ethods->xShmMap(
38a0: 66 64 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c 20  fd, 0, 32*1024, 
38b0: 31 2c 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63  1, &p);.  if( rc
38c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
38d0: 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65  turn rc;.  memse
38e0: 74 28 28 76 6f 69 64 20 2a 29 70 2c 20 30 2c 20  t((void *)p, 0, 
38f0: 33 32 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  32);..  /* Obtai
3900: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
3910: 73 20 6f 6e 20 61 6c 6c 20 74 68 65 20 22 72 65  s on all the "re
3920: 61 64 2d 6c 6f 63 6b 22 20 73 6c 6f 74 73 2e 20  ad-lock" slots. 
3930: 4f 6e 63 65 20 74 68 65 73 65 20 6c 6f 63 6b 73  Once these locks
3940: 0a 20 20 2a 2a 20 61 72 65 20 68 65 6c 64 2c 20  .  ** are held, 
3950: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
3960: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
3970: 6e 6f 20 61 63 74 69 76 65 20 72 65 61 64 65 72  no active reader
3980: 2c 20 77 72 69 74 65 72 20 6f 72 20 0a 20 20 2a  , writer or .  *
3990: 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 20 63  * checkpointer c
39a0: 6c 69 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 72  lients..  */.  r
39b0: 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d  c = superlockShm
39c0: 4c 6f 63 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49  Lock(fd, 3, SQLI
39d0: 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20  TE_SHM_NLOCK-3, 
39e0: 70 42 75 73 79 29 3b 0a 20 20 72 65 74 75 72 6e  pBusy);.  return
39f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
3a00: 6c 65 61 73 65 20 61 20 73 75 70 65 72 6c 6f 63  lease a superloc
3a10: 6b 20 68 65 6c 64 20 6f 6e 20 61 20 64 61 74 61  k held on a data
3a20: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
3a30: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
3a40: 6f 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  o .** this funct
3a50: 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 20 62 65  ion must have be
3a60: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
3a70: 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61   a successful ca
3a80: 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ll to.** sqlite3
3a90: 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 29  demo_superlock()
3aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3ab0: 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
3ac0: 65 72 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 70  erunlock(void *p
3ad0: 4c 6f 63 6b 29 7b 0a 20 20 53 75 70 65 72 6c 6f  Lock){.  Superlo
3ae0: 63 6b 20 2a 70 20 3d 20 28 53 75 70 65 72 6c 6f  ck *p = (Superlo
3af0: 63 6b 20 2a 29 70 4c 6f 63 6b 3b 0a 20 20 69 66  ck *)pLock;.  if
3b00: 28 20 70 2d 3e 62 57 61 6c 20 29 7b 0a 20 20 20  ( p->bWal ){.   
3b10: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b30: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
3b40: 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  */.    int flags
3b50: 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e   = SQLITE_SHM_UN
3b60: 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
3b70: 4d 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  M_EXCLUSIVE;.   
3b80: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
3b90: 64 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  d = 0;.    rc = 
3ba0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
3bb0: 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69  trol(p->db, "mai
3bc0: 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  n", SQLITE_FCNTL
3bd0: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2c 20 28  _FILE_POINTER, (
3be0: 76 6f 69 64 20 2a 29 26 66 64 29 3b 0a 20 20 20  void *)&fd);.   
3bf0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3c00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 64 2d 3e  OK ){.      fd->
3c10: 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f  pMethods->xShmLo
3c20: 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20 66 6c 61  ck(fd, 2, 1, fla
3c30: 67 73 29 3b 0a 20 20 20 20 20 20 66 64 2d 3e 70  gs);.      fd->p
3c40: 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63  Methods->xShmLoc
3c50: 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49 54 45 5f  k(fd, 3, SQLITE_
3c60: 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 66 6c 61  SHM_NLOCK-3, fla
3c70: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  gs);.    }.  }. 
3c80: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
3c90: 2d 3e 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->db);.  sqlite3
3ca0: 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(p);.}../*.
3cb0: 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73 75 70 65  ** Obtain a supe
3cc0: 72 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  rlock on the dat
3cd0: 61 62 61 73 65 20 66 69 6c 65 20 69 64 65 6e 74  abase file ident
3ce0: 69 66 69 65 64 20 62 79 20 7a 50 61 74 68 2c 20  ified by zPath, 
3cf0: 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 6c 6f 63  using the.** loc
3d00: 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  king primitives 
3d10: 70 72 6f 76 69 64 65 64 20 62 79 20 56 46 53 20  provided by VFS 
3d20: 7a 56 66 73 2e 20 49 66 20 73 75 63 63 65 73 73  zVfs. If success
3d30: 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
3d40: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
3d50: 64 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  d output variabl
3d60: 65 20 2a 70 70 4c 6f 63 6b 20 69 73 20 70 6f 70  e *ppLock is pop
3d70: 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 6f  ulated with an o
3d80: 70 61 71 75 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  paque handle.** 
3d90: 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64  that may be used
3da0: 20 77 69 74 68 20 73 71 6c 69 74 65 33 64 65 6d   with sqlite3dem
3db0: 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 29 20  o_superunlock() 
3dc0: 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 6c  to release the l
3dd0: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ock..**.** If an
3de0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
3df0: 70 70 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  ppLock is set to
3e00: 20 30 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65   0 and an SQLite
3e10: 20 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20   error code .** 
3e20: 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 42 55 53  (e.g. SQLITE_BUS
3e30: 59 29 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  Y) is returned..
3e40: 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 71 75 69  **.** If a requi
3e50: 72 65 64 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  red lock cannot 
3e60: 62 65 20 6f 62 74 61 69 6e 65 64 20 69 6d 6d 65  be obtained imme
3e70: 64 69 61 74 65 6c 79 20 61 6e 64 20 74 68 65 20  diately and the 
3e80: 78 42 75 73 79 20 70 61 72 61 6d 65 74 65 72 0a  xBusy parameter.
3e90: 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ** to this funct
3ea0: 69 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ion is not NULL,
3eb0: 20 74 68 65 6e 20 78 42 75 73 79 20 69 73 20 69   then xBusy is i
3ec0: 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 73 61  nvoked in the sa
3ed0: 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 61 20 62  me way.** as a b
3ee0: 75 73 79 2d 68 61 6e 64 6c 65 72 20 72 65 67 69  usy-handler regi
3ef0: 73 74 65 72 65 64 20 77 69 74 68 20 53 51 4c 69  stered with SQLi
3f00: 74 65 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65  te (using sqlite
3f10: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 29  3_busy_handler()
3f20: 29 0a 2a 2a 20 75 6e 74 69 6c 20 65 69 74 68 65  ).** until eithe
3f30: 72 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 20 62  r the lock can b
3f40: 65 20 6f 62 74 61 69 6e 65 64 20 6f 72 20 74 68  e obtained or th
3f50: 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  e busy-handler f
3f60: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a  unction returns.
3f70: 2a 2a 20 30 20 28 69 6e 64 69 63 61 74 69 6e 67  ** 0 (indicating
3f80: 20 22 67 69 76 65 20 75 70 22 29 2e 0a 2a 2f 0a   "give up")..*/.
3f90: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
3fa0: 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b  e3demo_superlock
3fb0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
3fc0: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
3fd0: 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 64      /* Path to d
3fe0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
3ff0: 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lock */.  const 
4000: 63 68 61 72 20 2a 7a 56 66 73 2c 20 20 20 20 20  char *zVfs,     
4010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
4020: 20 74 6f 20 75 73 65 20 74 6f 20 61 63 63 65 73   to use to acces
4030: 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
4040: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e       /* Addition
4070: 61 6c 20 66 6c 61 67 73 20 74 6f 20 70 61 73 73  al flags to pass
4080: 20 74 6f 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e   to sqlite3_open
4090: 5f 76 32 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  _v2 */.  int (*x
40a0: 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29  Busy)(void*,int)
40b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73 79  ,        /* Busy
40c0: 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63   handler callbac
40d0: 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  k */.  void *pBu
40e0: 73 79 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  syArg,          
40f0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
4100: 74 20 61 72 67 20 66 6f 72 20 62 75 73 79 20 68  t arg for busy h
4110: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 76 6f 69 64  andler */.  void
4120: 20 2a 2a 70 70 4c 6f 63 6b 20 20 20 20 20 20 20   **ppLock       
4130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4140: 55 54 3a 20 43 6f 6e 74 65 78 74 20 74 6f 20 70  UT: Context to p
4150: 61 73 73 20 74 6f 20 73 75 70 65 72 75 6e 6c 6f  ass to superunlo
4160: 63 6b 28 29 20 2a 2f 0a 29 7b 0a 20 20 53 75 70  ck() */.){.  Sup
4170: 65 72 6c 6f 63 6b 42 75 73 79 20 62 75 73 79 20  erlockBusy busy 
4180: 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 20 2f 2a 20  = {0, 0, 0}; /* 
4190: 42 75 73 79 20 68 61 6e 64 6c 65 72 20 77 72 61  Busy handler wra
41a0: 70 70 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  pper object */. 
41b0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41d0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
41e0: 2a 2f 0a 20 20 53 75 70 65 72 6c 6f 63 6b 20 2a  */.  Superlock *
41f0: 70 4c 6f 63 6b 3b 0a 0a 20 20 70 4c 6f 63 6b 20  pLock;..  pLock 
4200: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
4210: 28 73 69 7a 65 6f 66 28 53 75 70 65 72 6c 6f 63  (sizeof(Superloc
4220: 6b 29 29 3b 0a 20 20 69 66 28 20 21 70 4c 6f 63  k));.  if( !pLoc
4230: 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  k ) return SQLIT
4240: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65  E_NOMEM;.  memse
4250: 74 28 70 4c 6f 63 6b 2c 20 30 2c 20 73 69 7a 65  t(pLock, 0, size
4260: 6f 66 28 53 75 70 65 72 6c 6f 63 6b 29 29 3b 0a  of(Superlock));.
4270: 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 64 61 74  .  /* Open a dat
4280: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 6e 20  abase handle on 
4290: 74 68 65 20 66 69 6c 65 20 74 6f 20 73 75 70 65  the file to supe
42a0: 72 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 63 20 3d  rlock. */.  rc =
42b0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
42c0: 28 0a 20 20 20 20 20 20 7a 50 61 74 68 2c 20 26  (.      zPath, &
42d0: 70 4c 6f 63 6b 2d 3e 64 62 2c 20 53 51 4c 49 54  pLock->db, SQLIT
42e0: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
42f0: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
4300: 41 54 45 7c 66 6c 61 67 73 2c 20 7a 56 66 73 0a  ATE|flags, zVfs.
4310: 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 74 61    );..  /* Insta
4320: 6c 6c 20 61 20 62 75 73 79 2d 68 61 6e 64 6c 65  ll a busy-handle
4330: 72 20 61 6e 64 20 65 78 65 63 75 74 65 20 61 20  r and execute a 
4340: 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 2e  BEGIN EXCLUSIVE.
4350: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 0a   If this is not.
4360: 20 20 2a 2a 20 61 20 57 41 4c 20 64 61 74 61 62    ** a WAL datab
4370: 61 73 65 2c 20 74 68 69 73 20 69 73 20 61 6c 6c  ase, this is all
4380: 20 77 65 20 6e 65 65 64 20 74 6f 20 64 6f 2e 20   we need to do. 
4390: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 77 72   .  **.  ** A wr
43a0: 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 69  apper function i
43b0: 73 20 75 73 65 64 20 74 6f 20 69 6e 76 6f 6b 65  s used to invoke
43c0: 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
43d0: 72 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a  r instead of.  *
43e0: 2a 20 72 65 67 69 73 74 65 72 69 6e 67 20 74 68  * registering th
43f0: 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  e busy-handler f
4400: 75 6e 63 74 69 6f 6e 20 73 75 70 70 6c 69 65 64  unction supplied
4410: 20 62 79 20 74 68 65 20 75 73 65 72 20 64 69 72   by the user dir
4420: 65 63 74 6c 79 0a 20 20 2a 2a 20 77 69 74 68 20  ectly.  ** with 
4430: 53 51 4c 69 74 65 2e 20 54 68 69 73 20 69 73 20  SQLite. This is 
4440: 62 65 63 61 75 73 65 20 74 68 65 20 73 61 6d 65  because the same
4450: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
4460: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 0a 20 20  nction may be.  
4470: 2a 2a 20 69 6e 76 6f 6b 65 64 20 64 69 72 65 63  ** invoked direc
4480: 74 6c 79 20 6c 61 74 65 72 20 6f 6e 20 77 68 65  tly later on whe
4490: 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
44a0: 6f 62 74 61 69 6e 20 74 68 65 20 65 78 74 72 61  obtain the extra
44b0: 20 6c 6f 63 6b 73 0a 20 20 2a 2a 20 72 65 71 75   locks.  ** requ
44c0: 69 72 65 64 20 69 6e 20 57 41 4c 20 6d 6f 64 65  ired in WAL mode
44d0: 2e 20 42 79 20 75 73 69 6e 67 20 74 68 65 20 77  . By using the w
44e0: 72 61 70 70 65 72 2c 20 77 65 20 61 72 65 20 61  rapper, we are a
44f0: 62 6c 65 20 74 6f 20 67 75 61 72 61 6e 74 65 65  ble to guarantee
4500: 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 22  .  ** that the "
4510: 6e 42 75 73 79 22 20 69 6e 74 65 67 65 72 20 70  nBusy" integer p
4520: 61 72 61 6d 65 74 65 72 20 70 61 73 73 65 64 20  arameter passed 
4530: 74 6f 20 74 68 65 20 75 73 65 72 73 20 62 75 73  to the users bus
4540: 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 72  y-handler.  ** r
4550: 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 74 6f  epresents the to
4560: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 75  tal number of bu
4570: 73 79 2d 68 61 6e 64 6c 65 72 20 69 6e 76 6f 63  sy-handler invoc
4580: 61 74 69 6f 6e 73 20 6d 61 64 65 20 77 69 74 68  ations made with
4590: 69 6e 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c  in.  ** this cal
45a0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 64 65 6d 6f  l to sqlite3demo
45b0: 5f 73 75 70 65 72 6c 6f 63 6b 28 29 2c 20 69 6e  _superlock(), in
45c0: 63 6c 75 64 69 6e 67 20 61 6e 79 20 6d 61 64 65  cluding any made
45d0: 20 64 75 72 69 6e 67 20 74 68 65 0a 20 20 2a 2a   during the.  **
45e0: 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56   "BEGIN EXCLUSIV
45f0: 45 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  E"..  */.  if( r
4600: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4610: 20 20 20 20 62 75 73 79 2e 78 42 75 73 79 20 3d      busy.xBusy =
4620: 20 78 42 75 73 79 3b 0a 20 20 20 20 62 75 73 79   xBusy;.    busy
4630: 2e 70 42 75 73 79 41 72 67 20 3d 20 70 42 75 73  .pBusyArg = pBus
4640: 79 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65  yArg;.    sqlite
4650: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70  3_busy_handler(p
4660: 4c 6f 63 6b 2d 3e 64 62 2c 20 73 75 70 65 72 6c  Lock->db, superl
4670: 6f 63 6b 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  ockBusyHandler, 
4680: 28 76 6f 69 64 20 2a 29 26 62 75 73 79 29 3b 0a  (void *)&busy);.
4690: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
46a0: 5f 65 78 65 63 28 70 4c 6f 63 6b 2d 3e 64 62 2c  _exec(pLock->db,
46b0: 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56   "BEGIN EXCLUSIV
46c0: 45 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  E", 0, 0, 0);.  
46d0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 42  }..  /* If the B
46e0: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 20 77  EGIN EXCLUSIVE w
46f0: 61 73 20 65 78 65 63 75 74 65 64 20 73 75 63 63  as executed succ
4700: 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 74 68 69  essfully and thi
4710: 73 20 69 73 20 61 20 57 41 4c 0a 20 20 2a 2a 20  s is a WAL.  ** 
4720: 64 61 74 61 62 61 73 65 2c 20 63 61 6c 6c 20 73  database, call s
4730: 75 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28  uperlockWalLock(
4740: 29 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  ) to obtain the 
4750: 65 78 74 72 61 20 6c 6f 63 6b 73 20 72 65 71 75  extra locks requ
4760: 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 72 65  ired.  ** to pre
4770: 76 65 6e 74 20 72 65 61 64 65 72 73 2c 20 77 72  vent readers, wr
4780: 69 74 65 72 73 20 61 6e 64 2f 6f 72 20 63 68 65  iters and/or che
4790: 63 6b 70 6f 69 6e 74 65 72 73 20 66 72 6f 6d 20  ckpointers from 
47a0: 61 63 63 65 73 73 69 6e 67 20 74 68 65 0a 20 20  accessing the.  
47b0: 2a 2a 20 64 62 20 77 68 69 6c 65 20 74 68 69 73  ** db while this
47c0: 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
47d0: 69 6e 67 20 74 68 65 20 73 75 70 65 72 6c 6f 63  ing the superloc
47e0: 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 66  k..  **.  ** Bef
47f0: 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
4800: 6e 79 20 57 41 4c 20 6c 6f 63 6b 73 2c 20 63 6f  ny WAL locks, co
4810: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
4820: 74 69 6f 6e 20 73 74 61 72 74 65 64 20 61 62 6f  tion started abo
4830: 76 65 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20  ve.  ** to drop 
4840: 74 68 65 20 57 41 4c 20 72 65 61 64 20 61 6e 64  the WAL read and
4850: 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 63 75 72   write locks cur
4860: 72 65 6e 74 6c 79 20 68 65 6c 64 2e 20 4f 74 68  rently held. Oth
4870: 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20 2a 2a  erwise, the.  **
4880: 20 6e 65 77 20 57 41 4c 20 6c 6f 63 6b 73 20 6d   new WAL locks m
4890: 61 79 20 63 6f 6e 66 6c 69 63 74 20 77 69 74 68  ay conflict with
48a0: 20 74 68 65 20 6f 6c 64 2e 0a 20 20 2a 2f 0a 20   the old..  */. 
48b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
48c0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51  OK ){.    if( SQ
48d0: 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
48e0: 75 70 65 72 6c 6f 63 6b 49 73 57 61 6c 28 70 4c  uperlockIsWal(pL
48f0: 6f 63 6b 29 29 20 26 26 20 70 4c 6f 63 6b 2d 3e  ock)) && pLock->
4900: 62 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  bWal ){.      rc
4910: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
4920: 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22 43 4f 4d 4d  pLock->db, "COMM
4930: 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  IT", 0, 0, 0);. 
4940: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
4950: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
4960: 20 20 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b    rc = superlock
4970: 57 61 6c 4c 6f 63 6b 28 70 4c 6f 63 6b 2d 3e 64  WalLock(pLock->d
4980: 62 2c 20 26 62 75 73 79 29 3b 0a 20 20 20 20 20  b, &busy);.     
4990: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
49a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
49b0: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
49c0: 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b  demo_superunlock
49d0: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 2a 70 70  (pLock);.    *pp
49e0: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Lock = 0;.  }els
49f0: 65 7b 0a 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d  e{.    *ppLock =
4a00: 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72   pLock;.  }..  r
4a10: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
4a20: 41 20 63 6f 72 72 75 70 74 20 44 42 20 77 6f 6e  A corrupt DB won
4a30: 27 74 20 77 6f 72 6b 20 77 69 74 68 20 74 68 65  't work with the
4a40: 20 73 71 6c 2d 62 61 73 65 64 20 6c 6f 63 6b 69   sql-based locki
4a50: 6e 67 20 61 74 74 65 6d 70 74 2c 20 67 72 61 62  ng attempt, grab
4a60: 20 61 6e 20 0a 2a 2a 20 65 78 63 6c 75 73 69 76   an .** exclusiv
4a70: 65 20 6c 6f 63 6b 20 61 6e 64 20 72 65 74 75 72  e lock and retur
4a80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53  n SQLITE_OK or S
4a90: 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68  QLITE_BUSY if th
4aa0: 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 0a 2a 2a  e lock fails .**
4ab0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 75 72   returns the cur
4ac0: 72 65 6e 74 20 6c 6f 63 6b 20 6c 65 76 65 6c 20  rent lock level 
4ad0: 68 65 6c 64 20 6f 6e 20 73 71 6c 69 74 65 33 5f  held on sqlite3_
4ae0: 66 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  file.*/.static i
4af0: 6e 74 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73  nt sqlite3demo_s
4b00: 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74  uperlock_corrupt
4b10: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
4b20: 64 2c 20 69 6e 74 20 65 54 61 72 67 65 74 46 69  d, int eTargetFi
4b30: 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 2a 70 46 69  leLock, int *pFi
4b40: 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
4b50: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
4b60: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
4b70: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70  nt eFileLock = p
4b80: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b  File->eFileLock;
4b90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4ba0: 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20  TE_OK;.  .  if( 
4bb0: 65 46 69 6c 65 4c 6f 63 6b 3c 65 54 61 72 67 65  eFileLock<eTarge
4bc0: 74 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  tFileLock ){.   
4bd0: 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65   rc = pFile->pMe
4be0: 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20  thod->xLock(id, 
4bf0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52  SQLITE_LOCK_SHAR
4c00: 45 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ED);.  }.  if( !
4c10: 72 63 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3c  rc && eFileLock<
4c20: 65 54 61 72 67 65 74 46 69 6c 65 4c 6f 63 6b 20  eTargetFileLock 
4c30: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c  ){.    rc = pFil
4c40: 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
4c50: 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  k(id, SQLITE_LOC
4c60: 4b 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  K_EXCLUSIVE);.  
4c70: 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  }.  if( rc ){.  
4c80: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
4c90: 6c 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f  leLock > eFileLo
4ca0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ck ){.      pFil
4cb0: 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
4cc0: 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63  ock(id, eFileLoc
4cd0: 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  k);.    }.    re
4ce0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
4cf0: 66 20 28 70 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  f (pFileLock) {.
4d00: 20 20 20 20 2a 70 46 69 6c 65 4c 6f 63 6b 20 3d      *pFileLock =
4d10: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a   eFileLock;.  }.
4d20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4d30: 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
4d40: 74 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  t sqlite3demo_su
4d50: 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70  perunlock_corrup
4d60: 74 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  t(sqlite3_file *
4d70: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
4d80: 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
4d90: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
4da0: 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
4db0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4dc0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
4dd0: 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c  ileLock > eFileL
4de0: 6f 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ock ){.    rc = 
4df0: 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
4e00: 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 53 51 4c 49  xUnlock(id, SQLI
4e10: 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b  TE_LOCK_SHARED);
4e20: 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65  .  }.  if( pFile
4e30: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46  ->eFileLock > eF
4e40: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 69  ileLock ){.    i
4e50: 6e 74 20 75 6e 6c 6f 63 6b 52 43 20 3d 20 70 46  nt unlockRC = pF
4e60: 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
4e70: 6e 6c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45  nlock(id, SQLITE
4e80: 5f 4c 4f 43 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 20  _LOCK_NONE);.   
4e90: 20 69 66 20 28 21 72 63 29 20 72 63 20 3d 20 75   if (!rc) rc = u
4ea0: 6e 6c 6f 63 6b 52 43 3b 0a 20 20 7d 0a 20 20 72  nlockRC;.  }.  r
4eb0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e  eturn rc;.}..#en
4ec0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
4ed0: 41 42 4c 45 5f 53 55 50 45 52 4c 4f 43 4b 20 2a  ABLE_SUPERLOCK *
4ee0: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72  /.../*.** Differ
4ef0: 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d 73  ent Unix systems
4f00: 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29 20   declare open() 
4f10: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61 79  in different way
4f20: 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20  s.  Same use.** 
4f30: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a  open(const char*
4f40: 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f  ,int,mode_t).  O
4f50: 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28 63  thers use open(c
4f60: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e  onst char*,int,.
4f70: 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..)..** The diff
4f80: 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72 74  erence is import
4f90: 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20 61  ant when using a
4fa0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4fb0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
4fc0: 54 68 65 20 73 61 66 65 73 74 20 77 61 79 20 74  The safest way t
4fd0: 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20  o deal with the 
4fe0: 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c  problem is to al
4ff0: 77 61 79 73 20 75 73 65 20 74 68 69 73 20 77 72  ways use this wr
5000: 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20 61  apper.** which a
5010: 6c 77 61 79 73 20 68 61 73 20 74 68 65 20 73 61  lways has the sa
5020: 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20  me well-defined 
5030: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
5040: 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f 70  atic int posixOp
5050: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
5060: 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c  File, int flags,
5070: 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65   int mode){.  re
5080: 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c  turn open(zFile,
5090: 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d   flags, mode);.}
50a0: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
50b0: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
50c0: 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f   int openDirecto
50d0: 72 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  ry(const char*, 
50e0: 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61  int*);../*.** Ma
50f0: 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ny system calls 
5100: 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72  are accessed thr
5110: 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d  ough pointer-to-
5120: 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61  functions so tha
5130: 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65  t.** they may be
5140: 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72   overridden at r
5150: 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69  untime to facili
5160: 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63  tate fault injec
5170: 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74  tion during.** t
5180: 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62  esting and sandb
5190: 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c  oxing.  The foll
51a0: 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64  owing array hold
51b0: 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20  s the names and 
51c0: 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61  pointers.** to a
51d0: 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  ll overrideable 
51e0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f  system calls..*/
51f0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 75  .static struct u
5200: 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20  nix_syscall {.  
5210: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
5220: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
5230: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 74   Name of the syt
5240: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
5250: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5260: 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75   pCurrent; /* Cu
5270: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74  rrent value of t
5280: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  he system call *
5290: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
52a0: 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74  all_ptr pDefault
52b0: 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  ; /* Default val
52c0: 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c  ue */.} aSyscall
52d0: 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e  [] = {.  { "open
52e0: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
52f0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5300: 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d  posixOpen,  0  }
5310: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e  ,.#define osOpen
5320: 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63        ((int(*)(c
5330: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69  onst char*,int,i
5340: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e  nt))aSyscall[0].
5350: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5360: 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28  close",        (
5370: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5380: 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20  ptr)close,      
5390: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
53a0: 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28  Close     ((int(
53b0: 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  *)(int))aSyscall
53c0: 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [1].pCurrent).. 
53d0: 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20   { "access",    
53e0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
53f0: 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20  all_ptr)access, 
5400: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
5410: 65 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28  e osAccess    ((
5420: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
5430: 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  r*,int))aSyscall
5440: 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [2].pCurrent).. 
5450: 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20   { "getcwd",    
5460: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5470: 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20  all_ptr)getcwd, 
5480: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
5490: 65 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28  e osGetcwd    ((
54a0: 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73  char*(*)(char*,s
54b0: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
54c0: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  3].pCurrent)..  
54d0: 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20  { "stat",       
54e0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
54f0: 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20  ll_ptr)stat,    
5500: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
5510: 20 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69   osStat      ((i
5520: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
5530: 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29  *,struct stat*))
5540: 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72  aSyscall[4].pCur
5550: 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rent)../*.** The
5560: 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20   DJGPP compiler 
5570: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b  environment look
5580: 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e  s mostly like Un
5590: 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61  ix, but it.** la
55a0: 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20  cks the fcntl() 
55b0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f  system call.  So
55c0: 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28   redefine fcntl(
55d0: 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  ) to be somethin
55e0: 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73  g.** that always
55f0: 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73   succeeds.  This
5600: 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b   means that lock
5610: 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ing does not occ
5620: 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50  ur under.** DJGP
5630: 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f  P.  But it is DO
5640: 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75  S - what did you
5650: 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64   expect?.*/.#ifd
5660: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b  ef __DJGPP__.  {
5670: 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20   "fstat",       
5680: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
5690: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
56a0: 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29  e osFstat(a,b,c)
56b0: 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20      0.#else     
56c0: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
56d0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
56e0: 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c  scall_ptr)fstat,
56f0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
5700: 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20  ine osFstat     
5710: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72  ((int(*)(int,str
5720: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
5730: 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29  all[5].pCurrent)
5740: 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74  .#endif..  { "ft
5750: 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71  runcate",    (sq
5760: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5770: 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20  r)ftruncate,  0 
5780: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74   },.#define osFt
5790: 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29  runcate ((int(*)
57a0: 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  (int,off_t))aSys
57b0: 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74  call[6].pCurrent
57c0: 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20  )..  { "fcntl", 
57d0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
57e0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74  syscall_ptr)fcnt
57f0: 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  l,      0  },.#d
5800: 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20  efine osFcntl   
5810: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69    ((int(*)(int,i
5820: 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c  nt,...))aSyscall
5830: 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [7].pCurrent).. 
5840: 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20   { "read",      
5850: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5860: 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20  all_ptr)read,   
5870: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
5880: 65 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28  e osRead      ((
5890: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76  ssize_t(*)(int,v
58a0: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
58b0: 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e  scall[8].pCurren
58c0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
58d0: 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51  USE_PREAD) || SQ
58e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
58f0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70  ING_STYLE.  { "p
5900: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
5910: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5920: 74 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30  tr)pread,      0
5930: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
5940: 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28  pread",        (
5950: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5960: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
5970: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
5980: 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20  fine osPread    
5990: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
59a0: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
59b0: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39  ff_t))aSyscall[9
59c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
59d0: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
59e0: 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64  AD64).  { "pread
59f0: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
5a00: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
5a10: 72 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c  read64,    0  },
5a20: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61  .#else.  { "prea
5a30: 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69  d64",      (sqli
5a40: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5a50: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
5a60: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
5a70: 20 6f 73 50 72 65 61 64 36 34 20 20 20 28 28 73   osPread64   ((s
5a80: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
5a90: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
5aa0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70  ))aSyscall[10].p
5ab0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77  Current)..  { "w
5ac0: 72 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73  rite",        (s
5ad0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5ae0: 74 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30  tr)write,      0
5af0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57    },.#define osW
5b00: 72 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65  rite     ((ssize
5b10: 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20  _t(*)(int,const 
5b20: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
5b30: 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72  yscall[11].pCurr
5b40: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
5b50: 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20  d(USE_PREAD) || 
5b60: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
5b70: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20  CKING_STYLE.  { 
5b80: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
5b90: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5ba0: 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20  _ptr)pwrite,    
5bb0: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
5bc0: 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20   "pwrite",      
5bd0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5be0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
5bf0: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
5c00: 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20  define osPwrite 
5c10: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
5c20: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
5c30: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a  size_t,off_t))\.
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c50: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d      aSyscall[12]
5c60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5c70: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
5c80: 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65  D64).  { "pwrite
5c90: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
5ca0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77  3_syscall_ptr)pw
5cb0: 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a  rite64,   0  },.
5cc0: 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74  #else.  { "pwrit
5cd0: 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74  e64",     (sqlit
5ce0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
5cf0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
5d00: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
5d10: 6f 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73  osPwrite64  ((ss
5d20: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e  ize_t(*)(int,con
5d30: 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  st void*,size_t,
5d40: 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20  off_t))\.       
5d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79               aSy
5d60: 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65  scall[13].pCurre
5d70: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
5d80: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
5d90: 54 59 4c 45 0a 20 20 7b 20 22 66 63 68 6d 6f 64  TYLE.  { "fchmod
5da0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
5db0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63  3_syscall_ptr)fc
5dc0: 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a  hmod,     0  },.
5dd0: 23 65 6c 73 65 0a 20 20 7b 20 22 66 63 68 6d 6f  #else.  { "fchmo
5de0: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
5df0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
5e00: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
5e10: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
5e20: 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e  osFchmod    ((in
5e30: 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29  t(*)(int,mode_t)
5e40: 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43  )aSyscall[14].pC
5e50: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
5e60: 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
5e70: 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
5e80: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
5e90: 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74  TE.  { "fallocat
5ea0: 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  e",    (sqlite3_
5eb0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69  syscall_ptr)posi
5ec0: 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20  x_fallocate,  0 
5ed0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61  },.#else.  { "fa
5ee0: 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71  llocate",    (sq
5ef0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5f00: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  r)0,            
5f10: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5f20: 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63  #define osFalloc
5f30: 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74  ate ((int(*)(int
5f40: 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53  ,off_t,off_t))aS
5f50: 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72  yscall[15].pCurr
5f60: 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e  ent)..  { "unlin
5f70: 6b 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  k",       (sqlit
5f80: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75  e3_syscall_ptr)u
5f90: 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20  nlink,          
5fa0: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
5fb0: 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28  Unlink    ((int(
5fc0: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  *)(const char*))
5fd0: 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75  aSyscall[16].pCu
5fe0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65  rrent)..  { "ope
5ff0: 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20  nDirectory",    
6000: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6010: 5f 70 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f  _ptr)openDirecto
6020: 72 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64  ry,      0 },.#d
6030: 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65  efine osOpenDire
6040: 63 74 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63  ctory ((int(*)(c
6050: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29  onst char*,int*)
6060: 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43  )aSyscall[17].pC
6070: 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45  urrent)..}; /* E
6080: 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69  nd of the overri
6090: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
60a0: 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  lls */../*.** Th
60b0: 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79  is is the xSetSy
60c0: 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f  stemCall() metho
60d0: 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
60e0: 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a   for all of the.
60f0: 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73 2e  ** "unix" VFSes.
6100: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
6110: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
6120: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
6130: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
6140: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
6150: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
6160: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
6170: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
6180: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
6190: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
61a0: 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d  nt unixSetSystem
61b0: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
61c0: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20  vfs *pNotUsed,  
61d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
61e0: 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75   pointer.  Not u
61f0: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
6200: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
6210: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
6220: 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  f system call to
6230: 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73   override */.  s
6240: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
6250: 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20  tr pNewFunc  /* 
6260: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73  Pointer to new s
6270: 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65  ystem call value
6280: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
6290: 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72  d int i;.  int r
62a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
62b0: 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  UND;..  UNUSED_P
62c0: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
62d0: 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  d);.  if( zName=
62e0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
62f0: 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65  no zName is give
6300: 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73  n, restore all s
6310: 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74  ystem calls to t
6320: 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20  heir default.   
6330: 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64   ** settings and
6340: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20   return NULL.   
6350: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
6360: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28  ITE_OK;.    for(
6370: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
6380: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
6390: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
63a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79  ){.      if( aSy
63b0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
63c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79  t ){.        aSy
63d0: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
63e0: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
63f0: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
6400: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
6410: 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
6420: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f   is specified, o
6430: 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74  perate on only t
6440: 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61  he one system ca
6450: 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66  ll.    ** specif
6460: 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
6470: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
6480: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
6490: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
64a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
64b0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
64c0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
64d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
64e0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
64f0: 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20  pDefault==0 ){. 
6500: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
6510: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20  l[i].pDefault = 
6520: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
6530: 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rent;.        }.
6540: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
6550: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
6560: 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20  if( pNewFunc==0 
6570: 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79  ) pNewFunc = aSy
6580: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
6590: 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  t;.        aSysc
65a0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
65b0: 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20  = pNewFunc;.    
65c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
65d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
65e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
65f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
6600: 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20  lue of a system 
6610: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
6620: 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  LL if zName is n
6630: 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a  ot a.** recogniz
6640: 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ed system call n
6650: 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c  ame.  NULL is al
6660: 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
6670: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a  he system call.*
6680: 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  * is currently u
6690: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
66a0: 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63  tic sqlite3_sysc
66b0: 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74 53  all_ptr unixGetS
66c0: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
66d0: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
66e0: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
66f0: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
6700: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
6710: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
6720: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
6730: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
6740: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
6750: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
6760: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
6770: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
6780: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
6790: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
67a0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
67b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
67c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
67d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
67e0: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
67f0: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
6800: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
6810: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
6820: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
6830: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
6840: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
6850: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
6860: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
6870: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
6880: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
6890: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
68a0: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
68b0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
68c0: 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  nixNextSystemCal
68d0: 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  l(sqlite3_vfs *p
68e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
68f0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
6900: 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  -1;..  UNUSED_PA
6910: 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66  RAMETER(p);.  if
6920: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66  ( zName ){.    f
6930: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
6940: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b  ize(aSyscall)-1;
6950: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
6960: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
6970: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
6980: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
6990: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b    }.  }.  for(i+
69a0: 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  +; i<ArraySize(a
69b0: 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a  Syscall); i++){.
69c0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
69d0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20  [i].pCurrent!=0 
69e0: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
69f0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  l[i].zName;.  }.
6a00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
6a10: 2a 0a 2a 2a 20 52 65 74 72 79 20 6f 70 65 6e 28  *.** Retry open(
6a20: 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69  ) calls that fai
6a30: 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a  l due to EINTR.*
6a40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  /.static int rob
6a50: 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63  ust_open(const c
6a60: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 69  har *z, int f, i
6a70: 6e 74 20 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b  nt m){.  int rc;
6a80: 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 4f 70  .  do{ rc = osOp
6a90: 65 6e 28 7a 2c 66 2c 6d 29 3b 20 7d 77 68 69 6c  en(z,f,m); }whil
6aa0: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
6ab0: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
6ac0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6ad0: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
6ae0: 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20  s to obtain and 
6af0: 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67  relinquish the g
6b00: 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65  lobal mutex. The
6b10: 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  .** global mutex
6b20: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74   is used to prot
6b30: 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  ect the unixInod
6b40: 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77  eInfo and.** vxw
6b50: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
6b60: 74 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ts used by this 
6b70: 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69  file, all of whi
6b80: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68  ch may be .** sh
6b90: 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65  ared by multiple
6ba0: 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20   threads..**.** 
6bb0: 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74  Function unixMut
6bc0: 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64  exHeld() is used
6bd0: 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
6be0: 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  t the global mut
6bf0: 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77  ex .** is held w
6c00: 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68  hen required. Th
6c10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
6c20: 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74  nly used as part
6c30: 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a   of assert() .**
6c40: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67   statements. e.g
6c50: 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ..**.**   unixEn
6c60: 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20  terMutex().**   
6c70: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
6c80: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20  texHeld() );.** 
6c90: 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65    unixEnterLeave
6ca0: 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ().*/.static voi
6cb0: 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  d unixEnterMutex
6cc0: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
6cd0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
6ce0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
6cf0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6d00: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
6d10: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
6d20: 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29  LeaveMutex(void)
6d30: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
6d40: 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d  x_leave(sqlite3M
6d50: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
6d60: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
6d70: 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66  STER));.}.#ifdef
6d80: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
6d90: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74  atic int unixMut
6da0: 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20  exHeld(void) {. 
6db0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
6dc0: 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74  mutex_held(sqlit
6dd0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
6de0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
6df0: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e  _MASTER));.}.#en
6e00: 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  dif...#ifdef SQL
6e10: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
6e20: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  Helper function 
6e30: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74  for printing out
6e40: 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69   trace informati
6e50: 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e  on from debuggin
6e60: 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54  g.** binaries. T
6e70: 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20  his returns the 
6e80: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61  string represeta
6e90: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70  tion of the supp
6ea0: 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20  lied.** integer 
6eb0: 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74  lock-type..*/.st
6ec0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
6ed0: 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20  *azFileLock(int 
6ee0: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77  eFileLock){.  sw
6ef0: 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20  itch( eFileLock 
6f00: 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c  ){.    case NO_L
6f10: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
6f20: 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41  E";.    case SHA
6f30: 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  RED_LOCK: return
6f40: 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63   "SHARED";.    c
6f50: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
6f60: 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52  K: return "RESER
6f70: 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50  VED";.    case P
6f80: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74  ENDING_LOCK: ret
6f90: 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20  urn "PENDING";. 
6fa0: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
6fb0: 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  E_LOCK: return "
6fc0: 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a  EXCLUSIVE";.  }.
6fd0: 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22    return "ERROR"
6fe0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
6ff0: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
7000: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
7010: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
7020: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
7030: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
7040: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7050: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
7060: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
7070: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
7080: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
7090: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
70a0: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
70b0: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
70c0: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
70d0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
70e0: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
70f0: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
7100: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
7110: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
7120: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
7130: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
7140: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
7150: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
7160: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
7170: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
7180: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
7190: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
71a0: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
71b0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
71c0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
71d0: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
71e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
71f0: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  osFcntl(fd, op, 
7200: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
7210: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
7220: 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20  l unknown %d %d 
7230: 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73  %d\n", fd, op, s
7240: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b  );.    return s;
7250: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f  .  }.  if( p->l_
7260: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
7270: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44  .    zType = "RD
7280: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
7290: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( p->l_type==F_W
72a0: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  RLCK ){.    zTyp
72b0: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d  e = "WRLCK";.  }
72c0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
72d0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
72e0: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
72f0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
7300: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
7310: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  }.  assert( p->l
7320: 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45  _whence==SEEK_SE
7330: 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e  T );.  s = osFcn
7340: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
7350: 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72   savedErrno = er
7360: 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  rno;.  sqlite3De
7370: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
7380: 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20   %d %d %s %s %d 
7390: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
73a0: 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20    threadid, fd, 
73b0: 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20  zOpName, zType, 
73c0: 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c  (int)p->l_start,
73d0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a   (int)p->l_len,.
73e0: 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70       (int)p->l_p
73f0: 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d  id, s);.  if( s=
7400: 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53  =(-1) && op==F_S
7410: 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79  ETLK && (p->l_ty
7420: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70  pe==F_RDLCK || p
7430: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
7440: 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  K) ){.    struct
7450: 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c   flock l2;.    l
7460: 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63  2 = *p;.    osFc
7470: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ntl(fd, F_GETLK,
7480: 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c   &l2);.    if( l
7490: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  2.l_type==F_RDLC
74a0: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
74b0: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20   = "RDLCK";.    
74c0: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
74d0: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
74e0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57        zType = "W
74f0: 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  RLCK";.    }else
7500: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
7510: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
7520: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
7530: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7540: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
7550: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7560: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
7570: 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73  ntl-failure-reas
7580: 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c  on: %s %d %d %d\
7590: 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65  n",.       zType
75a0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72  , (int)l2.l_star
75b0: 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e  t, (int)l2.l_len
75c0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29  , (int)l2.l_pid)
75d0: 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20  ;.  }.  errno = 
75e0: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65  savedErrno;.  re
75f0: 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66  turn s;.}.#undef
7600: 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65   osFcntl.#define
7610: 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61   osFcntl lockTra
7620: 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ce.#endif /* SQL
7630: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a  ITE_LOCK_TRACE *
7640: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  /../*.** Retry f
7650: 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 73  truncate() calls
7660: 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74   that fail due t
7670: 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74 69  o EINTR.*/.stati
7680: 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72  c int robust_ftr
7690: 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71  uncate(int h, sq
76a0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b  lite3_int64 sz){
76b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b  .  int rc;.  do{
76c0: 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74   rc = osFtruncat
76d0: 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28  e(h,sz); }while(
76e0: 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
76f0: 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
7700: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
7710: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e  his routine tran
7720: 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72  slates a standar
7730: 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f  d POSIX errno co
7740: 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e  de into somethin
7750: 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74  g.** useful to t
7760: 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68  he clients of th
7770: 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69  e sqlite3 functi
7780: 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ons.  Specifical
7790: 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74  ly, it is.** int
77a0: 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61  ended to transla
77b0: 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20  te a variety of 
77c0: 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f  "try again" erro
77d0: 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42  rs into SQLITE_B
77e0: 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72  USY.** and a var
77f0: 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20  iety of "please 
7800: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
7810: 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65  escriptor NOW" e
7820: 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53  rrors into .** S
7830: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a  QLITE_IOERR.** .
7840: 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67  ** Errors during
7850: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
7860: 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c  of locks, or fil
7870: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
7880: 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73   for locks,.** s
7890: 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f  hould handle ENO
78a0: 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f  LCK, ENOTSUP, EO
78b0: 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74  PNOTSUPP separat
78c0: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
78d0: 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72  nt sqliteErrorFr
78e0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  omPosixError(int
78f0: 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74   posixError, int
7900: 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a   sqliteIOErr) {.
7910: 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45    switch (posixE
7920: 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20 20  rror) {.#if 0.  
7930: 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  /* At one point 
7940: 74 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e 6f  this code was no
7950: 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e  t commented out.
7960: 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69 73   In theory, this
7970: 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68 6f   branch.  ** sho
7980: 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69 74  uld never be hit
7990: 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69  , as this functi
79a0: 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  on should only b
79b0: 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a 20  e called after. 
79c0: 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72 65   ** a locking-re
79d0: 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 28  lated function (
79e0: 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68 61  i.e. fcntl()) ha
79f0: 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a  s returned non-z
7a00: 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  ero with.  ** th
7a10: 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f  e value of errno
7a20: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
7a30: 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61 20  gument. Since a 
7a40: 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73 20  system call has 
7a50: 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72 72  failed,.  ** err
7a60: 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 6e  no should be non
7a70: 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  -zero..  **.  **
7a80: 20 44 65 73 70 69 74 65 20 74 68 69 73 2c 20 69   Despite this, i
7a90: 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20 69  f errno really i
7aa0: 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c 6c  s zero, we still
7ab0: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
7ac0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
7ad0: 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65 6d  E_OK. The system
7ae0: 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61 6e   call failed, an
7af0: 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65 20  d *some* SQLite 
7b00: 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65 0a  error should be.
7b10: 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64 20    ** propagated 
7b20: 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c  back to the call
7b30: 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20 74  er. Commenting t
7b40: 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20 6d  his branch out m
7b50: 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20 20  eans errno==0.  
7b60: 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c  ** will be handl
7b70: 65 64 20 62 79 20 74 68 65 20 22 64 65 66 61 75  ed by the "defau
7b80: 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77 2e  lt:" case below.
7b90: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a 20  .  */.  case 0: 
7ba0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7bb0: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20  TE_OK;.#endif.. 
7bc0: 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20   case EAGAIN:.  
7bd0: 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a  case ETIMEDOUT:.
7be0: 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20    case EBUSY:.  
7bf0: 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61  case EINTR:.  ca
7c00: 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20  se ENOLCK:  .   
7c10: 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72   /* random NFS r
7c20: 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65  etry error, unle
7c30: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
7c40: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
7c50: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
7c60: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
7c70: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
7c80: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
7c90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7ca0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63  E_BUSY;.    .  c
7cb0: 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20  ase EACCES: .   
7cc0: 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69   /* EACCES is li
7cd0: 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67  ke EAGAIN during
7ce0: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
7cf0: 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  ons, but not any
7d00: 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20   other time*/.  
7d10: 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45    if( (sqliteIOE
7d20: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
7d30: 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73  RR_LOCK) || ..(s
7d40: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
7d50: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
7d60: 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49  K) || ..(sqliteI
7d70: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
7d80: 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a  OERR_RDLOCK) ||.
7d90: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
7da0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
7db0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
7dc0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7dd0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
7de0: 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20    }.    /* else 
7df0: 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  fall through */.
7e00: 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20    case EPERM: . 
7e10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7e20: 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 2f 2a  _PERM;.    .  /*
7e30: 20 45 44 45 41 44 4c 4b 20 69 73 20 6f 6e 6c 79   EDEADLK is only
7e40: 20 70 6f 73 73 69 62 6c 65 20 69 66 20 61 20 63   possible if a c
7e50: 61 6c 6c 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53  all to fcntl(F_S
7e60: 45 54 4c 4b 57 29 20 69 73 20 6d 61 64 65 2e 20  ETLKW) is made. 
7e70: 41 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20 6d 6f  And.  ** this mo
7e80: 64 75 6c 65 20 6e 65 76 65 72 20 6d 61 6b 65 73  dule never makes
7e90: 20 73 75 63 68 20 61 20 63 61 6c 6c 2e 20 41 6e   such a call. An
7ea0: 64 20 74 68 65 20 63 6f 64 65 20 69 6e 20 53 51  d the code in SQ
7eb0: 4c 69 74 65 20 69 74 73 65 6c 66 20 0a 20 20 2a  Lite itself .  *
7ec0: 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 53  * asserts that S
7ed0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
7ee0: 4b 45 44 20 69 73 20 6e 65 76 65 72 20 72 65 74  KED is never ret
7ef0: 75 72 6e 65 64 2e 20 46 6f 72 20 74 68 65 73 65  urned. For these
7f00: 20 72 65 61 73 6f 6e 73 0a 20 20 2a 2a 20 74 68   reasons.  ** th
7f10: 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20  is case is also 
7f20: 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49  commented out. I
7f30: 66 20 74 68 65 20 73 79 73 74 65 6d 20 64 6f 65  f the system doe
7f40: 73 20 73 65 74 20 65 72 72 6e 6f 20 74 6f 20 45  s set errno to E
7f50: 44 45 41 44 4c 4b 2c 0a 20 20 2a 2a 20 74 68 65  DEADLK,.  ** the
7f60: 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45 5f   default SQLITE_
7f70: 49 4f 45 52 52 5f 58 58 58 20 63 6f 64 65 20 77  IOERR_XXX code w
7f80: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
7f90: 20 2a 2f 0a 23 69 66 20 30 0a 20 20 63 61 73 65   */.#if 0.  case
7fa0: 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65   EDEADLK:.    re
7fb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
7fc0: 52 5f 42 4c 4f 43 4b 45 44 3b 0a 23 65 6e 64 69  R_BLOCKED;.#endi
7fd0: 66 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f  f.    .#if EOPNO
7fe0: 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20  TSUPP!=ENOTSUP. 
7ff0: 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50 50   case EOPNOTSUPP
8000: 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68  : .    /* someth
8010: 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62 6c  ing went terribl
8020: 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20 64  y awry, unless d
8030: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
8040: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
8050: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
8060: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
8070: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
8080: 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64   it says */.#end
8090: 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53 55  if.#ifdef ENOTSU
80a0: 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55 50  P.  case ENOTSUP
80b0: 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69  : .    /* invali
80c0: 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75 72  d fd, unless dur
80d0: 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ing file system 
80e0: 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70 65  support introspe
80f0: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
8100: 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74 75 61  .     * it actua
8110: 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69  lly means what i
8120: 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66  t says */.#endif
8130: 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20 63  .  case EIO:.  c
8140: 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61 73  ase EBADF:.  cas
8150: 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65  e EINVAL:.  case
8160: 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73   ENOTCONN:.  cas
8170: 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65  e ENODEV:.  case
8180: 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20 45   ENXIO:.  case E
8190: 4e 4f 45 4e 54 3a 0a 23 69 66 64 65 66 20 45 53  NOENT:.#ifdef ES
81a0: 54 41 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  TALE            
81b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 53 54 41           /* ESTA
81c0: 4c 45 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  LE is not define
81d0: 64 20 6f 6e 20 49 6e 74 65 72 69 78 20 73 79 73  d on Interix sys
81e0: 74 65 6d 73 20 2a 2f 0a 20 20 63 61 73 65 20 45  tems */.  case E
81f0: 53 54 41 4c 45 3a 0a 23 65 6e 64 69 66 0a 20 20  STALE:.#endif.  
8200: 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20  case ENOSYS:.   
8210: 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64   /* these should
8220: 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e   force the clien
8230: 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66  t to close the f
8240: 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63  ile and reconnec
8250: 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61  t */.    .  defa
8260: 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  ult: .    return
8270: 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20   sqliteIOErr;.  
8280: 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  }.}..../********
8290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82d0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
82f0: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
8300: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
8310: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
8320: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20  ******.**.** On 
8330: 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66  most versions of
8340: 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65   unix, we can ge
8350: 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f  t a unique ID fo
8360: 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63  r a file by conc
8370: 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65  atenating.** the
8380: 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61   device number a
8390: 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  nd the inode num
83a0: 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64  ber.  But this d
83b0: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
83c0: 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56  VxWorks..** On V
83d0: 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65  xWorks, a unique
83e0: 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65   file id must be
83f0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61   based on the ca
8400: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
8410: 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  ..**.** A pointe
8420: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
8430: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
8440: 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  g structure can 
8450: 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20  be used as a.** 
8460: 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69  unique file ID i
8470: 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68  n VxWorks.  Each
8480: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
8490: 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  s structure cont
84a0: 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f  ains.** a copy o
84b0: 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  f the canonical 
84c0: 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65  filename.  There
84d0: 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72   is also a refer
84e0: 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a  ence count.  .**
84f0: 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69   The structure i
8500: 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e  s reclaimed when
8510: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
8520: 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72  ointers to it dr
8530: 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a  ops to.** zero..
8540: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
8550: 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20  never very many 
8560: 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e  files open at on
8570: 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75  e time and looku
8580: 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20  ps are not.** a 
8590: 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74  performance-crit
85a0: 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74  ical path, so it
85b0: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74   is sufficient t
85c0: 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73  o put these.** s
85d0: 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c  tructures on a l
85e0: 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  inked list..*/.s
85f0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
8600: 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76  eId {.  struct v
8610: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e  xworksFileId *pN
8620: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
8630: 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20   a list of them 
8640: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  all */.  int nRe
8650: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
8660: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8670: 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
8680: 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  o this one */.  
8690: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
86b0: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a   Length of the z
86c0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20  CanonicalName[] 
86d0: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  string */.  char
86e0: 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65   *zCanonicalName
86f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e  ;         /* Can
8700: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20  onical filename 
8710: 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58  */.};..#if OS_VX
8720: 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c  WORKS./* .** All
8730: 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65   unique filename
8740: 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20  s are held on a 
8750: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64  linked list head
8760: 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61  ed by this.** va
8770: 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69  riable:.*/.stati
8780: 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  c struct vxworks
8790: 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46  FileId *vxworksF
87a0: 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  ileList = 0;../*
87b0: 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66  .** Simplify a f
87c0: 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73  ilename into its
87d0: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a   canonical form.
87e0: 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65  ** by making the
87f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67   following chang
8800: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d  es:.**.**  * rem
8810: 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69  oving any traili
8820: 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65  ng and duplicate
8830: 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74   /.**  * convert
8840: 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f   /./ into just /
8850: 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f  .**  * convert /
8860: 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73  A/../ where A is
8870: 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65   any simple name
8880: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a   into just /.**.
8890: 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d  ** Changes are m
88a0: 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52  ade in-place.  R
88b0: 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61  eturn the new na
88c0: 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a  me length..**.**
88d0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   The original fi
88e0: 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30  lename is in z[0
88f0: 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20  ..n-1].  Return 
8900: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
8910: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
8920: 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61  he simplified na
8930: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
8940: 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  t vxworksSimplif
8950: 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69  yName(char *z, i
8960: 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nt n){.  int i, 
8970: 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20  j;.  while( n>1 
8980: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29  && z[n-1]=='/' )
8990: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69  { n--; }.  for(i
89a0: 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
89b0: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
89c0: 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  /' ){.      if( 
89d0: 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f  z[i+1]=='/' ) co
89e0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
89f0: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ( z[i+1]=='.' &&
8a00: 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d   i+2<n && z[i+2]
8a10: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
8a20: 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20   i += 1;.       
8a30: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8a40: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69   }.      if( z[i
8a50: 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c  +1]=='.' && i+3<
8a60: 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27  n && z[i+2]=='.'
8a70: 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20   && z[i+3]=='/' 
8a80: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
8a90: 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21  ( j>0 && z[j-1]!
8aa0: 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20  ='/' ){ j--; }. 
8ab0: 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29         if( j>0 )
8ac0: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
8ad0: 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20   i += 2;.       
8ae0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8af0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
8b00: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a  ++] = z[i];.  }.
8b10: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65    z[j] = 0;.  re
8b20: 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn j;.}../*.**
8b30: 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66   Find a unique f
8b40: 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67  ile ID for the g
8b50: 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  iven absolute pa
8b60: 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a  thname.  Return.
8b70: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
8b80: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
8b90: 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  d object.  This 
8ba0: 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75  pointer is the u
8bb0: 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44  nique.** file ID
8bc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66  ..**.** The nRef
8bd0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78   field of the vx
8be0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
8bf0: 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ct is incremente
8c00: 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
8c10: 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e  object is return
8c20: 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72  ed.  A new vxwor
8c30: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20  ksFileId object 
8c40: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
8c50: 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67  d added to the g
8c60: 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65  lobal list if ne
8c70: 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  cessary..**.** I
8c80: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
8c90: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
8ca0: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  rs, return NULL.
8cb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
8cc0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
8cd0: 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65  *vxworksFindFile
8ce0: 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Id(const char *z
8cf0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20  AbsoluteName){. 
8d00: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
8d10: 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20  ileId *pNew;    
8d20: 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b       /* search k
8d30: 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20  ey and new file 
8d40: 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76  ID */.  struct v
8d50: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43  xworksFileId *pC
8d60: 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46  andidate;   /* F
8d70: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
8d80: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
8d90: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  s */.  int n;   
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
8dc0: 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74  ngth of zAbsolut
8dd0: 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a  eName string */.
8de0: 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f  .  assert( zAbso
8df0: 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  luteName[0]=='/'
8e00: 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73   );.  n = (int)s
8e10: 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e  trlen(zAbsoluteN
8e20: 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ame);.  pNew = s
8e30: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
8e40: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28  izeof(*pNew) + (
8e50: 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  n+1) );.  if( pN
8e60: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
8e70: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ;.  pNew->zCanon
8e80: 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72  icalName = (char
8e90: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65  *)&pNew[1];.  me
8ea0: 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f  mcpy(pNew->zCano
8eb0: 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f  nicalName, zAbso
8ec0: 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a  luteName, n+1);.
8ed0: 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d    n = vxworksSim
8ee0: 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e  plifyName(pNew->
8ef0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
8f00: 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68  n);..  /* Search
8f10: 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
8f20: 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63   entry that matc
8f30: 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63  hing the canonic
8f40: 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66  al name..  ** If
8f50: 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e   found, incremen
8f60: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
8f70: 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e  count and return
8f80: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20   a pointer to.  
8f90: 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  ** the existing 
8fa0: 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20  file ID..  */.  
8fb0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
8fc0: 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61  ;.  for(pCandida
8fd0: 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  te=vxworksFileLi
8fe0: 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20  st; pCandidate; 
8ff0: 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64  pCandidate=pCand
9000: 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  idate->pNext){. 
9010: 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61 74     if( pCandidat
9020: 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20  e->nName==n .   
9030: 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e    && memcmp(pCan
9040: 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63  didate->zCanonic
9050: 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43  alName, pNew->zC
9060: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29  anonicalName, n)
9070: 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
9080: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
9090: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61  New);.       pCa
90a0: 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b  ndidate->nRef++;
90b0: 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  .       unixLeav
90c0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  eMutex();.      
90d0: 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61   return pCandida
90e0: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  te;.    }.  }.. 
90f0: 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73   /* No match was
9100: 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c   found.  We will
9110: 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65   make a new file
9120: 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e   ID */.  pNew->n
9130: 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d  Ref = 1;.  pNew-
9140: 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e  >nName = n;.  pN
9150: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f  ew->pNext = vxwo
9160: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76  rksFileList;.  v
9170: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d  xworksFileList =
9180: 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61   pNew;.  unixLea
9190: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
91a0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
91b0: 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
91c0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
91d0: 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c   on a vxworksFil
91e0: 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65  eId object.  Fre
91f0: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
9200: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
9210: 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ce count reaches
9220: 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
9230: 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c   void vxworksRel
9240: 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75 63  easeFileId(struc
9250: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
9260: 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74  *pId){.  unixEnt
9270: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
9280: 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30  ert( pId->nRef>0
9290: 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d   );.  pId->nRef-
92a0: 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52  -;.  if( pId->nR
92b0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ef==0 ){.    str
92c0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
92d0: 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28  d **pp;.    for(
92e0: 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c  pp=&vxworksFileL
92f0: 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21  ist; *pp && *pp!
9300: 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70  =pId; pp = &((*p
9310: 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20  p)->pNext)){}.  
9320: 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70    assert( *pp==p
9330: 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20  Id );.    *pp = 
9340: 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pId->pNext;.    
9350: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
9360: 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
9370: 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e  veMutex();.}.#en
9380: 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
9390: 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  S */./**********
93a0: 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69  ***** End of Uni
93b0: 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c  que File ID Util
93c0: 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f  ity Used By VxWo
93d0: 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rks ************
93e0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
93f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9430: 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
9440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9480: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
9490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
94a0: 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72  ** Posix Advisor
94b0: 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  y Locking ******
94c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
94d0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53  ******.**.** POS
94e0: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
94f0: 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20  s are broken by 
9500: 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54  design.  ANSI ST
9510: 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a  D 1003.1 (1996).
9520: 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32  ** section 6.5.2
9530: 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72  .2 lines 483 thr
9540: 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79  ough 490 specify
9550: 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f   that when a pro
9560: 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20  cess.** sets or 
9570: 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74  clears a lock, t
9580: 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76  hat operation ov
9590: 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f  errides any prio
95a0: 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62  r locks set.** b
95b0: 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
95c0: 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  ss.  It does not
95d0: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20   explicitly say 
95e0: 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70  so, but this imp
95f0: 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20  lies.** that it 
9600: 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20  overrides locks 
9610: 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20  set by the same 
9620: 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20  process using a 
9630: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c  different.** fil
9640: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43  e descriptor.  C
9650: 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73  onsider this tes
9660: 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  t case:.**.**   
9670: 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70      int fd1 = op
9680: 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f  en("./file1", O_
9690: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
96a0: 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e  44);.**       in
96b0: 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd2 = open("./
96c0: 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f  file2", O_RDWR|O
96d0: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
96e0: 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66  *.** Suppose ./f
96f0: 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32  ile1 and ./file2
9700: 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20   are really the 
9710: 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75  same file (becau
9720: 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68  se.** one is a h
9730: 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20  ard or symbolic 
9740: 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65  link to the othe
9750: 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73  r) then if you s
9760: 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69  et.** an exclusi
9770: 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20  ve lock on fd1, 
9780: 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20  then try to get 
9790: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
97a0: 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20  k.** on fd2, it 
97b0: 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20  works.  I would 
97c0: 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68  have expected th
97d0: 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f  e second lock to
97e0: 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74  .** fail since t
97f0: 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79  here was already
9800: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66   a lock on the f
9810: 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a  ile due to fd1..
9820: 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20  ** But not so.  
9830: 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73  Since both locks
9840: 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73   came from the s
9850: 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65  ame process, the
9860: 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72  .** second overr
9870: 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20  ides the first, 
9880: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79  even though they
9890: 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65   were on differe
98a0: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
98b0: 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e  iptors opened on
98c0: 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20   different file 
98d0: 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  names..**.** Thi
98e0: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  s means that we 
98f0: 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58  cannot use POSIX
9900: 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72   locks to synchr
9910: 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73  onize file acces
9920: 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65  s.** among compe
9930: 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20  ting threads of 
9940: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
9950: 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77  .  POSIX locks w
9960: 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a  ill work fine.**
9970: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
9980: 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61  access for threa
9990: 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70  ds in separate p
99a0: 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f  rocesses, but no
99b0: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74  t.** threads wit
99c0: 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f  hin the same pro
99d0: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77  cess..**.** To w
99e0: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70  ork around the p
99f0: 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68  roblem, SQLite h
9a00: 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c  as to manage fil
9a10: 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c  e locks internal
9a20: 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e  ly.** on its own
9a30: 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65  .  Whenever a ne
9a40: 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  w database is op
9a50: 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  ened, we have to
9a60: 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65   find the.** spe
9a70: 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74  cific inode of t
9a80: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9a90: 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64   (the inode is d
9aa0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
9ab0: 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73  .** st_dev and s
9ac0: 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20  t_ino fields of 
9ad0: 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75  the stat structu
9ae0: 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20  re that fstat() 
9af0: 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64  fills in).** and
9b00: 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73   check for locks
9b10: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e   already existin
9b20: 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e  g on that inode.
9b30: 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65    When locks are
9b40: 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72  .** created or r
9b50: 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20  emoved, we have 
9b60: 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f  to look at our o
9b70: 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  wn internal reco
9b80: 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  rd of the.** loc
9b90: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ks to see if ano
9ba0: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
9bb0: 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61  previously set a
9bc0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61   lock on that sa
9bd0: 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  me.** inode..**.
9be0: 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20 75  ** (Aside: The u
9bf0: 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62  se of inode numb
9c00: 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49 44  ers as unique ID
9c10: 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  s does not work 
9c20: 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46  on VxWorks..** F
9c30: 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68  or VxWorks, we h
9c40: 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20 61  ave to use the a
9c50: 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75  lternative uniqu
9c60: 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73 65  e ID system base
9c70: 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61  d on.** canonica
9c80: 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69  l filename and i
9c90: 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68  mplemented in th
9ca0: 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69 73  e previous divis
9cb0: 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ion.).**.** The 
9cc0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
9cd0: 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58  ucture for POSIX
9ce0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75   is no longer ju
9cf0: 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69  st an integer fi
9d00: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
9d10: 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73  .  It is now a s
9d20: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f  tructure that ho
9d30: 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  lds the integer 
9d40: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
9d50: 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  or and a pointer
9d60: 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20   to a structure 
9d70: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
9d80: 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c  he internal.** l
9d90: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72  ocks on the corr
9da0: 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e  esponding inode.
9db0: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c    There is one l
9dc0: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
9dd0: 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73  .** per inode, s
9de0: 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e  o if the same in
9df0: 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77  ode is opened tw
9e00: 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69  ice, both unixFi
9e10: 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  le structures.**
9e20: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61   point to the sa
9e30: 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  me locking struc
9e40: 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ture.  The locki
9e50: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
9e60: 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  ps.** a referenc
9e70: 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77  e count (so we w
9e80: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f  ill know when to
9e90: 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20   delete it) and 
9ea0: 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64  a "cnt".** field
9eb0: 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69   that tells us i
9ec0: 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  ts internal lock
9ed0: 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30   status.  cnt==0
9ee0: 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69   means the.** fi
9ef0: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20  le is unlocked. 
9f00: 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74   cnt==-1 means t
9f10: 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65  he file has an e
9f20: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a  xclusive lock..*
9f30: 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68  * cnt>0 means th
9f40: 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72  ere are cnt shar
9f50: 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ed locks on the 
9f60: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  file..**.** Any 
9f70: 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20  attempt to lock 
9f80: 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  or unlock a file
9f90: 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68   first checks th
9fa0: 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  e locking.** str
9fb0: 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e  ucture.  The fcn
9fc0: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
9fd0: 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64   is only invoked
9fe0: 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f   to set a .** PO
9ff0: 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  SIX lock if the 
a000: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
a010: 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69  ructure transiti
a020: 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61  ons between.** a
a030: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75   locked and an u
a040: 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a  nlocked state..*
a050: 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20  *.** But wait:  
a060: 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f  there are yet mo
a070: 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  re problems with
a080: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
a090: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  locks..**.** If 
a0a0: 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65  you close a file
a0b0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
a0c0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c   points to a fil
a0d0: 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73  e that has locks
a0e0: 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f  ,.** all locks o
a0f0: 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74  n that file that
a100: 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68   are owned by th
a110: 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
a120: 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65  s are.** release
a130: 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  d.  To work arou
a140: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c  nd this problem,
a150: 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49   each unixInodeI
a160: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61  nfo object.** ma
a170: 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20  intains a count 
a180: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
a190: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f   pending locks o
a1a0: 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20  n tha inode..** 
a1b0: 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  When an attempt 
a1c0: 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65  is made to close
a1d0: 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66   an unixFile, if
a1e0: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74   there are.** ot
a1f0: 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65  her unixFile ope
a200: 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e  n on the same in
a210: 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c  ode that are hol
a220: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20  ding locks, the 
a230: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65  call.** to close
a240: 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  () the file desc
a250: 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72 72  riptor is deferr
a260: 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20  ed until all of 
a270: 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e  the locks clear.
a280: 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64  .** The unixInod
a290: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
a2a0: 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20  keeps a list of 
a2b0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
a2c0: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a   that need to.**
a2d0: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74   be closed and t
a2e0: 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b  hat list is walk
a2f0: 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29  ed (and cleared)
a300: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
a310: 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a  ock.** clears..*
a320: 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72  *.** Yet another
a330: 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78   problem:  Linux
a340: 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70  Threads do not p
a350: 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f  lay well with po
a360: 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  six locks..**.**
a370: 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73   Many older vers
a380: 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73  ions of linux us
a390: 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61  e the LinuxThrea
a3a0: 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63 68  ds library which
a3b0: 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78   is.** not posix
a3c0: 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64   compliant.  Und
a3d0: 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  er LinuxThreads,
a3e0: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
a3f0: 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63  by thread.** A c
a400: 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65  annot be modifie
a410: 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20  d or overridden 
a420: 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74  by a different t
a430: 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79  hread B..** Only
a440: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f   thread A can mo
a450: 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20  dify the lock.  
a460: 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72  Locking behavior
a470: 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69   is correct.** i
a480: 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e  f the appliation
a490: 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72 20   uses the newer 
a4a0: 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68 72  Native Posix Thr
a4b0: 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54  ead Library (NPT
a4c0: 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d  L).** on linux -
a4d0: 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63   with NPTL a loc
a4e0: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
a4f0: 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69  ead A can overri
a500: 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74  de locks.** in t
a510: 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74 68  hread B.  But th
a520: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
a530: 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65   know at compile
a540: 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74  -time which.** t
a550: 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79  hreading library
a560: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20   is being used. 
a570: 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   So there is no 
a580: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a  way to know at.*
a590: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  * compile-time w
a5a0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
a5b0: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
a5c0: 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72  ide locks on thr
a5d0: 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61  ead B..** One ha
a5e0: 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69  s to do a run-ti
a5f0: 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63  me check to disc
a600: 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69 6f  over the behavio
a610: 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72  r of the.** curr
a620: 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  ent process..**.
a630: 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20 74  ** SQLite used t
a640: 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54  o support LinuxT
a650: 68 72 65 61 64 73 2e 20 20 42 75 74 20 73 75 70  hreads.  But sup
a660: 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68  port for LinuxTh
a670: 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f  reads.** was dro
a680: 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77  pped beginning w
a690: 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e  ith version 3.7.
a6a0: 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  0.  SQLite will 
a6b0: 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a  still work with.
a6c0: 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  ** LinuxThreads 
a6d0: 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 28 31  provided that (1
a6e0: 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f  ) there is no mo
a6f0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e  re than one conn
a700: 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64  ection .** per d
a710: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
a720: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
a730: 20 61 6e 64 20 28 32 29 20 64 61 74 61 62 61 73   and (2) databas
a740: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a  e connections.**
a750: 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72   do not move acr
a760: 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a  oss threads..*/.
a770: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
a780: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
a790: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65  ing structure se
a7a0: 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20  rves as the key 
a7b0: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74  used.** to locat
a7c0: 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 75  e a particular u
a7d0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
a7e0: 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  ect..*/.struct u
a7f0: 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65  nixFileId {.  de
a800: 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20 20  v_t dev;        
a810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
a820: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69  ice number */.#i
a830: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
a840: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
a850: 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e  eId *pId;  /* Un
a860: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
a870: 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c   vxworks. */.#el
a880: 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20  se.  ino_t ino; 
a890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8a0: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
a8b0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
a8c0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
a8d0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
a8e0: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
a8f0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
a900: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e  h open.** inode.
a910: 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68    Or, on LinuxTh
a920: 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 20  reads, there is 
a930: 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72  one of these str
a940: 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65  uctures for.** e
a950: 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64  ach inode opened
a960: 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64 2e   by each thread.
a970: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  .**.** A single 
a980: 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d  inode can have m
a990: 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73  ultiple file des
a9a0: 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63  criptors, so eac
a9b0: 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  h unixFile.** st
a9c0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
a9d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
a9e0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
a9f0: 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69  s object and thi
aa00: 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70  s.** object keep
aa10: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
aa20: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46   number of unixF
aa30: 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ile pointing to 
aa40: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  it..*/.struct un
aa50: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20  ixInodeInfo {.  
aa60: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
aa70: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20  d fileId;       
aa80: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
aa90: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72  y */.  int nShar
aaa0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
aab0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
aac0: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
aad0: 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67   held */.  unsig
aae0: 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f  ned char eFileLo
aaf0: 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ck;        /* On
ab00: 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e of SHARED_LOCK
ab10: 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  , RESERVED_LOCK 
ab20: 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  etc. */.  unsign
ab30: 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73 73  ed char bProcess
ab40: 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20  Lock;     /* An 
ab50: 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73  exclusive proces
ab60: 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a  s lock is held *
ab70: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
aba0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
abb0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
abc0: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
abd0: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
abe0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
abf0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
ac00: 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  h this inode */.
ac10: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
ac40: 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20  utstanding file 
ac50: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55  locks */.  UnixU
ac60: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
ac70: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
ac80: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
ac90: 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a  ptors to close *
aca0: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
acb0: 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  o *pNext;       
acc0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
acd0: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
ace0: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e   objects */.  un
acf0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72  ixInodeInfo *pPr
ad00: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ev;           /*
ad10: 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20      .... doubly 
ad20: 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51  linked */.#if SQ
ad30: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
ad40: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69  ING_STYLE.  unsi
ad50: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
ad60: 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66  haredByte;  /* f
ad70: 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64  or AFP simulated
ad80: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
ad90: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58  #endif.#if OS_VX
ada0: 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70  WORKS.  sem_t *p
adb0: 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sem;            
adc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64          /* Named
add0: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
ade0: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e   */.  char aSemN
adf0: 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
ae00: 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  +2];  /* Name of
ae10: 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20   that semaphore 
ae20: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
ae30: 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61  .** A lists of a
ae40: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
ae50: 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
ae60: 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  tic unixInodeInf
ae70: 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30  o *inodeList = 0
ae80: 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ;../*.**.** This
ae90: 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78   function - unix
aea0: 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c 20 69 73  LogError_x(), is
aeb0: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
aec0: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
aed0: 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ** unixLogError(
aee0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  )..**.** It is i
aef0: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20  nvoked after an 
af00: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
af10: 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61  an OS function a
af20: 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65  nd errno has bee
af30: 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67  n.** set. It log
af40: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
af50: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
af60: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
af70: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
af80: 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66  ** errno and, if
af90: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
afa0: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
afb0: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74  uivalent from st
afc0: 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73  rerror() or.** s
afd0: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a  trerror_r()..**.
afe0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
aff0: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
b000: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
b010: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
b020: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
b030: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
b040: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
b050: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
b060: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
b070: 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  ). .** The two s
b080: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
b090: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
b0a0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
b0b0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
b0c0: 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22  * failed (e.g. "
b0d0: 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29  unlink", "open")
b0e0: 20 61 6e 64 20 74 68 65 20 74 68 65 20 61 73 73   and the the ass
b0f0: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73  ociated file-sys
b100: 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20  tem path,.** if 
b110: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
b120: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62  unixLogError(a,b
b130: 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45  ,c)     unixLogE
b140: 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63  rrorAtLine(a,b,c
b150: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69  ,__LINE__).stati
b160: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72  c int unixLogErr
b170: 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20  orAtLine(.  int 
b180: 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20  errcode,        
b190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b1a0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
b1b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
b1c0: 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20   *zFunc,        
b1d0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
b1e0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
b1f0: 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f  t failed */.  co
b200: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b220: 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63   File path assoc
b230: 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72  iated with error
b240: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20   */.  int iLine 
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b260: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
b270: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72  line number wher
b280: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  e error occurred
b290: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
b2a0: 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Err;            
b2b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73           /* Mess
b2c0: 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f  age from strerro
b2d0: 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e  r() or equivalen
b2e0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e  t */.  int iErrn
b2f0: 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20  o = errno;      
b300: 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
b310: 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75  syscall error nu
b320: 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  mber */..  /* If
b330: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
b340: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 20  hreadsafe build 
b350: 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41  (SQLITE_THREADSA
b360: 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65  FE==0), then use
b370: 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72  .  ** the strerr
b380: 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  or() function to
b390: 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61   obtain the huma
b3a0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72  n-readable error
b3b0: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71   message.  ** eq
b3c0: 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e  uivalent to errn
b3d0: 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  o. Otherwise, us
b3e0: 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a  e strerror_r()..
b3f0: 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45    */ .#if SQLITE
b400: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64  _THREADSAFE && d
b410: 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45  efined(HAVE_STRE
b420: 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61  RROR_R).  char a
b430: 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65  Err[80];.  memse
b440: 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f  t(aErr, 0, sizeo
b450: 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72  f(aErr));.  zErr
b460: 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49   = aErr;..  /* I
b470: 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41  f STRERROR_R_CHA
b480: 52 5f 50 20 28 73 65 74 20 62 79 20 61 75 74 6f  R_P (set by auto
b490: 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72  conf scripts) or
b4a0: 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65   __USE_GNU is de
b4b0: 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75  fined,.  ** assu
b4c0: 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74  me that the syst
b4d0: 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  em provides the 
b4e0: 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20  the GNU version 
b4f0: 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  of strerror_r() 
b500: 74 68 61 74 20 0a 20 20 2a 2a 20 72 65 74 75 72  that .  ** retur
b510: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
b520: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
b530: 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65  ing the error me
b540: 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e  ssage. That poin
b550: 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f  ter .  ** may po
b560: 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f  int to aErr[], o
b570: 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74  r it may point t
b580: 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74  o some static st
b590: 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e  orage somewhere.
b5a0: 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
b5b0: 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
b5c0: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
b5d0: 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73  s the POSIX vers
b5e0: 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72  ion of .  ** str
b5f0: 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68  error_r(), which
b600: 20 61 6c 77 61 79 73 20 77 72 69 74 65 73 20 61   always writes a
b610: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
b620: 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a  into aErr[]..  *
b630: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f  *.  ** If the co
b640: 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61  de incorrectly a
b650: 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69  ssumes that it i
b660: 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73  s the POSIX vers
b670: 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ion that is.  **
b680: 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20   available, the 
b690: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69  error message wi
b6a0: 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65  ll often be an e
b6b0: 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74  mpty string. Not
b6c0: 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f   a.  ** huge pro
b6d0: 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c  blem. Incorrectl
b6e0: 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61  y concluding tha
b6f0: 74 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f  t the GNU versio
b700: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a  n is available .
b710: 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20    ** could lead 
b720: 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74 68  to a segfault th
b730: 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64  ough..  */.#if d
b740: 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f  efined(STRERROR_
b750: 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66  R_CHAR_P) || def
b760: 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a  ined(__USE_GNU).
b770: 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69    zErr = .# endi
b780: 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69  f.  strerror_r(i
b790: 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a  Errno, aErr, siz
b7a0: 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23  eof(aErr)-1);..#
b7b0: 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  elif SQLITE_THRE
b7c0: 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73  ADSAFE.  /* This
b7d0: 20 69 73 20 61 20 74 68 72 65 61 64 73 61 66 65   is a threadsafe
b7e0: 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65   build, but stre
b7f0: 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20  rror_r() is not 
b800: 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20  available. */.  
b810: 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65  zErr = "";.#else
b820: 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64  .  /* Non-thread
b830: 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20  safe build, use 
b840: 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20  strerror(). */. 
b850: 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72   zErr = strerror
b860: 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66  (iErrno);.#endif
b870: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63  ..  assert( errc
b880: 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode!=SQLITE_OK )
b890: 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30  ;.  if( zPath==0
b8a0: 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20   ) zPath = "";. 
b8b0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
b8c0: 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
b8d0: 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20  unix.c:%d: (%d) 
b8e0: 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20  %s(%s) - %s",.  
b8f0: 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e      iLine, iErrn
b900: 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c  o, zFunc, zPath,
b910: 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65   zErr.  );..  re
b920: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a  turn errcode;.}.
b930: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
b940: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
b950: 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20  **.** We assume 
b960: 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d  that close() alm
b970: 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73  ost always works
b980: 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e  , since it is on
b990: 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20  ly in a.** very 
b9a0: 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e  sick application
b9b0: 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69   or on a very si
b9c0: 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74  ck platform that
b9d0: 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a   it might fail..
b9e0: 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66 61  ** If it does fa
b9f0: 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20  il, simply leak 
ba00: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
ba10: 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20  tor, but do log 
ba20: 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a  the.** error..**
ba30: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74  .** Note that it
ba40: 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
ba50: 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66  retry close() af
ba60: 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20  ter EINTR since 
ba70: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  the.** file desc
ba80: 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76  riptor might hav
ba90: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
baa0: 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72  eused by another
bab0: 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77   thread..** So w
bac0: 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79  e don't even try
bad0: 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d   to recover from
bae0: 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74   an EINTR.  Just
baf0: 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a   log the error.*
bb00: 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a  * and move on..*
bb10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f  /.static void ro
bb20: 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46  bust_close(unixF
bb30: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
bb40: 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  h, int lineno){.
bb50: 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29    if( osClose(h)
bb60: 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45   ){.    unixLogE
bb70: 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54  rrorAtLine(SQLIT
bb80: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22  E_IOERR_CLOSE, "
bb90: 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20  close",.        
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
bbb0: 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50  File ? pFile->zP
bbc0: 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29  ath : 0, lineno)
bbd0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
bbe0: 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65  lose all file de
bbf0: 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75  scriptors accumu
bc00: 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78  ated in the unix
bc10: 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73  InodeInfo->pUnus
bc20: 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61  ed list..*/ .sta
bc30: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65  tic void closePe
bc40: 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c  ndingFds(unixFil
bc50: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
bc60: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
bc70: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
bc80: 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  de;.  UnixUnused
bc90: 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75  Fd *p;.  UnixUnu
bca0: 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20  sedFd *pNext;.  
bcb0: 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55  for(p=pInode->pU
bcc0: 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78  nused; p; p=pNex
bcd0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
bce0: 70 2d 3e 70 4e 65 78 74 3b 0a 23 69 66 20 4f 53  p->pNext;.#if OS
bcf0: 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f 53  CLOSE_CHECK_CLOS
bd00: 45 5f 49 4f 45 52 52 0a 20 20 20 20 69 66 28 20  E_IOERR.    if( 
bd10: 63 6c 6f 73 65 28 70 2d 3e 66 64 29 20 29 7b 0a  close(p->fd) ){.
bd20: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
bd30: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
bd40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
bd50: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20  E_IOERR_CLOSE;. 
bd60: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
bd70: 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 70 45  pError;.      pE
bd80: 72 72 6f 72 20 3d 20 70 3b 0a 20 20 20 20 7d 65  rror = p;.    }e
bd90: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
bda0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
bdb0: 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72 6f 62 75  }.#else.    robu
bdc0: 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
bdd0: 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  p->fd, __LINE__)
bde0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
bdf0: 65 65 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ee(p);.#endif.  
be00: 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  }.  pInode->pUnu
be10: 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  sed = 0;.}../*.*
be20: 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78  * Release a unix
be30: 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74  InodeInfo struct
be40: 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ure previously a
be50: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64  llocated by find
be60: 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a  InodeInfo()..**.
be70: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74  ** The mutex ent
be80: 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75  ered using the u
be90: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
bea0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
beb0: 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68   held.** when th
bec0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
bed0: 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
bee0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e 6f   void releaseIno
bef0: 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20  deInfo(unixFile 
bf00: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
bf10: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
bf20: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
bf30: 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
bf40: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
bf50: 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 6f   if( ALWAYS(pIno
bf60: 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  de) ){.    pInod
bf70: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  e->nRef--;.    i
bf80: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d  f( pInode->nRef=
bf90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
bfa0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  rt( pInode->pShm
bfb0: 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Node==0 );.     
bfc0: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
bfd0: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  (pFile);.      i
bfe0: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76  f( pInode->pPrev
bff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
c000: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  rt( pInode->pPre
c010: 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65  v->pNext==pInode
c020: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
c030: 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  de->pPrev->pNext
c040: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
c050: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c060: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
c070: 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65  nodeList==pInode
c080: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f 64   );.        inod
c090: 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  eList = pInode->
c0a0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
c0b0: 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
c0c0: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
c0d0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
c0e0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d  ->pNext->pPrev==
c0f0: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
c100: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d    pInode->pNext-
c110: 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d  >pPrev = pInode-
c120: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a  >pPrev;.      }.
c130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
c140: 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  ee(pInode);.    
c150: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
c160: 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  iven a file desc
c170: 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74  riptor, locate t
c180: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
c190: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
c1a0: 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66  describes that f
c1b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
c1c0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
c1d0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  e if necessary. 
c1e0: 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
c1f0: 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e  alue might be un
c200: 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61  initialized if a
c210: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
c220: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
c230: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
c240: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
c250: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
c260: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
c270: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c280: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
c290: 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70  Return an approp
c2a0: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
c2b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c2c0: 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20  findInodeInfo(. 
c2d0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
c2e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c2f0: 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74  /* Unix file wit
c300: 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65 64  h file desc used
c310: 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20   in the key */. 
c320: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
c330: 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20  *ppInode        
c340: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e  /* Return the un
c350: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
c360: 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ct here */.){.  
c370: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c390: 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65  * System call re
c3a0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
c3b0: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c3d0: 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
c3e0: 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a  ptor for pFile *
c3f0: 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46  /.  struct unixF
c400: 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20  ileId fileId;   
c410: 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79     /* Lookup key
c420: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e 6f   for the unixIno
c430: 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75  deInfo */.  stru
c440: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
c450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
c460: 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66  w-level file inf
c470: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e  ormation */.  un
c480: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
c490: 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ode = 0;     /* 
c4a0: 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49 6e  Candidate unixIn
c4b0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a  odeInfo object *
c4c0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  /..  assert( uni
c4d0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
c4e0: 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65  .  /* Get low-le
c4f0: 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  vel information 
c500: 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74  about the file t
c510: 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20  hat we can used 
c520: 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61  to.  ** create a
c530: 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72   unique name for
c540: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
c550: 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b    fd = pFile->h;
c560: 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28  .  rc = osFstat(
c570: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
c580: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
c590: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
c5a0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64  no = errno;.#ifd
c5b0: 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20  ef EOVERFLOW.   
c5c0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74   if( pFile->last
c5d0: 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57  Errno==EOVERFLOW
c5e0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c5f0: 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20  _NOLFS;.#endif. 
c600: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c610: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66  _IOERR;.  }..#if
c620: 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20  def __APPLE__.  
c630: 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e  /* On OS X on an
c640: 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
c650: 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  m, the inode num
c660: 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a  ber is reported.
c670: 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79    ** incorrectly
c680: 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66   for zero-size f
c690: 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65  iles.  See ticke
c6a0: 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72  t #3260.  To wor
c6b0: 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68  k.  ** around th
c6c0: 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63  is problem (we c
c6d0: 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67  onsider it a bug
c6e0: 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51   in OS X, not SQ
c6f0: 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c  Lite).  ** we al
c700: 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68  ways increase th
c710: 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31  e file size to 1
c720: 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69   by writing a si
c730: 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70  ngle byte.  ** p
c740: 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e  rior to accessin
c750: 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  g the inode numb
c760: 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74  er.  The one byt
c770: 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a  e written is.  *
c780: 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63  * an ASCII 'S' c
c790: 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61  haracter which a
c7a0: 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62  lso happens to b
c7b0: 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  e the first byte
c7c0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61  .  ** in the hea
c7d0: 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c  der of every SQL
c7e0: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ite database.  I
c7f0: 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74  n this way, if t
c800: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72  here.  ** is a r
c810: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75  ace condition su
c820: 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20  ch that another 
c830: 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61  thread has alrea
c840: 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a  dy populated.  *
c850: 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  * the first page
c860: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
c870: 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64  , no damage is d
c880: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
c890: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d  statbuf.st_size=
c8a0: 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73  =0 && (pFile->fs
c8b0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
c8c0: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29  SFLAGS_IS_MSDOS)
c8d0: 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72  !=0 ){.    do{ r
c8e0: 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20  c = osWrite(fd, 
c8f0: 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28  "S", 1); }while(
c900: 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
c910: 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66 28  EINTR );.    if(
c920: 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20   rc!=1 ){.      
c930: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
c940: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
c950: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
c960: 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ERR;.    }.    r
c970: 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20  c = osFstat(fd, 
c980: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69  &statbuf);.    i
c990: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
c9a0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
c9b0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
c9c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c9d0: 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  IOERR;.    }.  }
c9e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65  .#endif..  memse
c9f0: 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69  t(&fileId, 0, si
ca00: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20  zeof(fileId));. 
ca10: 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74   fileId.dev = st
ca20: 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69  atbuf.st_dev;.#i
ca30: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66  f OS_VXWORKS.  f
ca40: 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c  ileId.pId = pFil
ca50: 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20  e->pId;.#else.  
ca60: 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61  fileId.ino = sta
ca70: 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e  tbuf.st_ino;.#en
ca80: 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69  dif.  pInode = i
ca90: 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c  nodeList;.  whil
caa0: 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d  e( pInode && mem
cab0: 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49  cmp(&fileId, &pI
cac0: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69  node->fileId, si
cad0: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b  zeof(fileId)) ){
cae0: 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49  .    pInode = pI
caf0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  node->pNext;.  }
cb00: 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30  .  if( pInode==0
cb10: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d   ){.    pInode =
cb20: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
cb30: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
cb40: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
cb50: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
cb60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
cb70: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
cb80: 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20  mset(pInode, 0, 
cb90: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29  sizeof(*pInode))
cba0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49  ;.    memcpy(&pI
cbb0: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66  node->fileId, &f
cbc0: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
cbd0: 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f  leId));.    pIno
cbe0: 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  de->nRef = 1;.  
cbf0: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20    pInode->pNext 
cc00: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
cc10: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d   pInode->pPrev =
cc20: 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64   0;.    if( inod
cc30: 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73  eList ) inodeLis
cc40: 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64  t->pPrev = pInod
cc50: 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74  e;.    inodeList
cc60: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c   = pInode;.  }el
cc70: 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  se{.    pInode->
cc80: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
cc90: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b  pInode = pInode;
cca0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ccb0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
ccc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
ccd0: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
cce0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
ccf0: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
cd00: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
cd10: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
cd20: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
cd30: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
cd40: 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
cd50: 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
cd60: 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
cd70: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
cd80: 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
cd90: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
cda0: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
cdb0: 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
cdc0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
cdd0: 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
cde0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
cdf0: 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72  t unixCheckReser
ce00: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
ce10: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
ce20: 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
ce30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ce40: 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
ce50: 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
ce60: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
ce70: 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
ce80: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
ce90: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
cea0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
ceb0: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
cec0: 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e  File );.  unixEn
ced0: 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
cee0: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
cef0: 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
cf00: 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
cf10: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
cf20: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
cf30: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
cf40: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
cf50: 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
cf60: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
cf70: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
cf80: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
cf90: 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  }..  /* Otherwis
cfa0: 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
cfb0: 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
cfc0: 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  s it..  */.#ifnd
cfd0: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69  ef __DJGPP__.  i
cfe0: 66 28 20 21 72 65 73 65 72 76 65 64 20 26 26 20  f( !reserved && 
cff0: 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  !pFile->pInode->
d000: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a  bProcessLock ){.
d010: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
d020: 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e   lock;.    lock.
d030: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
d040: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
d050: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
d060: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
d070: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c  l_len = 1;.    l
d080: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
d090: 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73  RLCK;.    if( os
d0a0: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
d0b0: 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20  F_GETLK, &lock) 
d0c0: 29 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  ){.#if OSLOCKING
d0d0: 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
d0e0: 52 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  R.      int tErr
d0f0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
d100: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
d110: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
d120: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
d130: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
d140: 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VEDLOCK);.      
d150: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d160: 20 3d 20 74 45 72 72 6e 6f 3b 0a 23 65 6c 73 65   = tErrno;.#else
d170: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
d180: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
d190: 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20  SERVEDLOCK;.    
d1a0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
d1b0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 65 6e 64  no = errno;.#end
d1c0: 69 66 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  if.    } else if
d1d0: 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46  ( lock.l_type!=F
d1e0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
d1f0: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
d200: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
d210: 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
d220: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
d230: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
d240: 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e  d %d %d (unix)\n
d250: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
d260: 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20   reserved));..  
d270: 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
d280: 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
d290: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
d2a0: 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73 74  pt to set a syst
d2b0: 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  em-lock on the f
d2c0: 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20  ile pFile.  The 
d2d0: 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63  lock is .** desc
d2e0: 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a  ribed by pLock..
d2f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69  **.** If the pFi
d300: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65  le was opened re
d310: 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e  ad/write from un
d320: 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68  ix-excl, then th
d330: 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65  e only lock.** e
d340: 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20  ver obtained is 
d350: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
d360: 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74  k, and it is obt
d370: 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e  ained exactly on
d380: 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ce.** the first 
d390: 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73  time any lock is
d3a0: 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c   attempted.  All
d3b0: 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73 74   subsequent syst
d3c0: 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70  em locking.** op
d3d0: 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20  erations become 
d3e0: 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67  no-ops.  Locking
d3f0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c   operations stil
d400: 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61  l happen interna
d410: 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  lly,.** in order
d420: 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61   to coordinate a
d430: 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65  ccess between se
d440: 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20  parate database 
d450: 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77  connections.** w
d460: 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ithin this proce
d470: 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74  ss, but all of t
d480: 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69  hat is handled i
d490: 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65  n memory and the
d4a0: 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
d4b0: 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61  stem does not pa
d4c0: 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a  rticipate..**.**
d4d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d4e0: 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68  s a pass-through
d4f0: 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c   to fcntl(F_SETL
d500: 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20 75  K) if pFile is u
d510: 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20  sing.** any VFS 
d520: 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78  other than "unix
d530: 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69  -excl" or if pFi
d540: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  le is opened on 
d550: 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61  "unix-excl".** a
d560: 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e  nd is read-only.
d570: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
d580: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
d590: 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75  all completes su
d5a0: 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d  ccessfully, or -
d5b0: 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74  1 if a call.** t
d5c0: 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e  o fcntl() fails.
d5d0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65   In this case, e
d5e0: 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72  rrno is set appr
d5f0: 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66 63  opriately (by fc
d600: 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69  ntl())..*/.stati
d610: 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f  c int unixFileLo
d620: 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
d630: 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  le, struct flock
d640: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20   *pLock){.  int 
d650: 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  rc;.  unixInodeI
d660: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
d670: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
d680: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
d690: 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65  Held() );.  asse
d6a0: 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b  rt( pInode!=0 );
d6b0: 0a 20 20 69 66 28 20 28 28 70 46 69 6c 65 2d 3e  .  if( ((pFile->
d6c0: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
d6d0: 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20 7c 7c  FILE_EXCL)!=0 ||
d6e0: 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
d6f0: 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28 28 70  sLock).   && ((p
d700: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
d710: 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  & UNIXFILE_RDONL
d720: 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  Y)==0).  ){.    
d730: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  if( pInode->bPro
d740: 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  cessLock==0 ){. 
d750: 20 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63       struct floc
d760: 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73  k lock;.      as
d770: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
d780: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock==0 );.      
d790: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
d7a0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
d7b0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
d7c0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
d7d0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
d7e0: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
d7f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
d800: 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20   F_WRLCK;.      
d810: 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69  rc = osFcntl(pFi
d820: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
d830: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66  &lock);.      if
d840: 28 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20  ( rc<0 ) return 
d850: 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  rc;.      pInode
d860: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d  ->bProcessLock =
d870: 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   1;.      pInode
d880: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d  ->nLock++;.    }
d890: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
d8a0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
d8b0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  e{.    rc = osFc
d8c0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
d8d0: 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20  SETLK, pLock);. 
d8e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
d8f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
d900: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
d910: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
d920: 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
d930: 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
d940: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
d950: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
d960: 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
d970: 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
d980: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
d990: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
d9a0: 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
d9b0: 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
d9c0: 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
d9d0: 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
d9e0: 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
d9f0: 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
da00: 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
da10: 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
da20: 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
da30: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
da40: 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
da50: 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
da60: 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
da70: 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
da80: 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
da90: 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
daa0: 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
dab0: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
dac0: 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
dad0: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
dae0: 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
daf0: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
db00: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
db10: 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
db20: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
db30: 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
db40: 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
db50: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
db60: 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
db70: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
db80: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
db90: 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
dba0: 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
dbb0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
dbc0: 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
dbd0: 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
dbe0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
dbf0: 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
dc00: 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
dc10: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
dc20: 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74  t unixLock(sqlit
dc30: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
dc40: 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f   eFileLock){.  /
dc50: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
dc60: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d  describes the im
dc70: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
dc80: 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b  the various lock
dc90: 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20  s and.  ** lock 
dca0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74  transitions in t
dcb0: 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49  erms of the POSI
dcc0: 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65  X advisory share
dcd0: 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  d and exclusive.
dce0: 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74    ** lock primit
dcf0: 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61  ives (called rea
dd00: 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74  d-locks and writ
dd10: 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74  e-locks below, t
dd20: 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e  o avoid.  ** con
dd30: 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69  fusion with SQLi
dd40: 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20  te lock names). 
dd50: 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61  The algorithms a
dd60: 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20  re complicated. 
dd70: 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20   ** slightly in 
dd80: 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70  order to be comp
dd90: 61 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64  atible with wind
dda0: 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75  ows systems simu
ddb0: 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20  ltaneously.  ** 
ddc0: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
ddd0: 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
dde0: 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69  , in case that i
ddf0: 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e  s ever required.
de00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f  .  **.  ** Symbo
de10: 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73  ls defined in os
de20: 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65  .h indentify the
de30: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20   'pending byte' 
de40: 61 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65  and the 'reserve
de50: 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61  d.  ** byte', ea
de60: 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20  ch single bytes 
de70: 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66  at well known of
de80: 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27  fsets, and the '
de90: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
dea0: 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65   range', a range
deb0: 20 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74   of 510 bytes at
dec0: 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66   a well known of
ded0: 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fset..  **.  ** 
dee0: 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52  To obtain a SHAR
def0: 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d  ED lock, a read-
df00: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
df10: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
df20: 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66  .  ** byte'.  If
df30: 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73   this is success
df40: 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79  ful, a random by
df50: 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61  te from the 'sha
df60: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
df70: 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63  nge' is read-loc
df80: 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ked and the lock
df90: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
dfa0: 20 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e   byte' released.
dfb0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
dfc0: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
dfd0: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
dfe0: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
dff0: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e  s a SHARED lock.
e000: 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44  .  ** A RESERVED
e010: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
e020: 6e 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67  nted by grabbing
e030: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
e040: 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72   the.  ** 'reser
e050: 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a  ved byte'. .  **
e060: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
e070: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
e080: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61  a PENDING lock a
e090: 66 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61  fter it has obta
e0a0: 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52  ined a.  ** SHAR
e0b0: 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49  ED lock. A PENDI
e0c0: 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  NG lock is imple
e0d0: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
e0e0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
e0f0: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65  .  ** on the 'pe
e100: 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69  nding byte'. Thi
e110: 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e  s ensures that n
e120: 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63  o new SHARED loc
e130: 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f  ks can be.  ** o
e140: 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69  btained, but exi
e150: 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63  sting SHARED loc
e160: 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  ks are allowed t
e170: 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f  o persist. A pro
e180: 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e  cess.  ** does n
e190: 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69  ot have to obtai
e1a0: 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
e1b0: 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  k on the way to 
e1c0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a  a PENDING lock..
e1d0: 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72    ** This proper
e1e0: 74 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68  ty is used by th
e1f0: 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20  e algorithm for 
e200: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
e210: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
e220: 20 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a   after a crash..
e230: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43    **.  ** An EXC
e240: 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74  LUSIVE lock, obt
e250: 61 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45  ained after a PE
e260: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65  NDING lock is he
e270: 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c  ld, is.  ** impl
e280: 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69  emented by obtai
e290: 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ning a write-loc
e2a0: 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20  k on the entire 
e2b0: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
e2c0: 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20  * range'. Since 
e2d0: 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20  all other locks 
e2e0: 72 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c  require a read-l
e2f0: 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ock on one of th
e300: 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74  e bytes.  ** wit
e310: 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20  hin this range, 
e320: 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  this ensures tha
e330: 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73  t no other locks
e340: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65   are held on the
e350: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
e360: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72  .  **.  ** The r
e370: 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62  eason a single b
e380: 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  yte cannot be us
e390: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ed instead of th
e3a0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
e3b0: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68   ** range' is th
e3c0: 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  at some versions
e3d0: 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e   of windows do n
e3e0: 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d  ot support read-
e3f0: 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c  locks. By.  ** l
e400: 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20  ocking a random 
e410: 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67  byte from a rang
e420: 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48  e, concurrent SH
e430: 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65  ARED locks may e
e440: 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69  xist.  ** even i
e450: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72  f the locking pr
e460: 69 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20  imitive used is 
e470: 61 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c  always a write-l
e480: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ock..  */.  int 
e490: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e4a0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
e4b0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
e4c0: 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
e4d0: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
e4e0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 74  le->pInode;.  st
e4f0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
e500: 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20  .  int tErrno = 
e510: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  0;..  assert( pF
e520: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
e530: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
e540: 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
e550: 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  id=%d (unix)\n",
e560: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
e570: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
e580: 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f  eLock), azFileLo
e590: 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ck(pFile->eFileL
e5a0: 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69  ock),.      azFi
e5b0: 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65  leLock(pInode->e
e5c0: 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64  FileLock), pInod
e5d0: 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74  e->nShared , get
e5e0: 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  pid()));..  /* I
e5f0: 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
e600: 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
e610: 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
e620: 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
e630: 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
e640: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
e650: 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
e660: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
e670: 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
e680: 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
e690: 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
e6a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
e6b0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46  e->eFileLock>=eF
e6c0: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f  ileLock ){.    O
e6d0: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
e6e0: 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
e6f0: 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c  dy held) (unix)\
e700: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
e710: 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
e720: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29  Lock(eFileLock))
e730: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
e740: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
e750: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
e760: 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
e770: 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  e is correct..  
e780: 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
e790: 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
e7a0: 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
e7b0: 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
e7c0: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
e7d0: 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
e7e0: 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
e7f0: 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
e800: 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
e810: 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
e820: 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
e830: 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
e840: 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
e850: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
e860: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
e870: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
e880: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
e890: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
e8a0: 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
e8b0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
e8c0: 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45   eFileLock!=RESE
e8d0: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
e8e0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  le->eFileLock==S
e8f0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
e900: 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
e910: 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
e920: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
e930: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
e940: 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75  threads.  */.  u
e950: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
e960: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
e970: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a  e->pInode;..  /*
e980: 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
e990: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
e9a0: 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
e9b0: 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
e9c0: 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
e9d0: 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
e9e0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
e9f0: 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
ea00: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
ea10: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49  e->eFileLock!=pI
ea20: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
ea30: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  && .          (p
ea40: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
ea50: 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
ea60: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
ea70: 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
ea80: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
ea90: 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  USY;.    goto en
eaa0: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
eab0: 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
eac0: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
ead0: 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
eae0: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
eaf0: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
eb00: 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
eb10: 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
eb20: 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
eb30: 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
eb40: 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
eb50: 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
eb60: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
eb70: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
eb80: 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
eb90: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
eba0: 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46  CK || pInode->eF
ebb0: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
ebc0: 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
ebd0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
ebe0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
ebf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
ec00: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  le->eFileLock==0
ec10: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ec20: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
ec30: 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
ec40: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
ec50: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  ED_LOCK;.    pIn
ec60: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a  ode->nShared++;.
ec70: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
ec80: 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  k++;.    goto en
ec90: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20  d_lock;.  }...  
eca0: 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
ecb0: 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
ecc0: 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
ecd0: 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
ece0: 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
ecf0: 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
ed00: 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
ed10: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
ed20: 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
ed30: 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
ed40: 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c  .  */.  lock.l_l
ed50: 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e  en = 1L;.  lock.
ed60: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
ed70: 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65  SET;.  if( eFile
ed80: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
ed90: 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
eda0: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
edb0: 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
edc0: 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
edd0: 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
ede0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
edf0: 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
ee00: 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a  ED_LOCK?F_RDLCK:
ee10: 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f  F_WRLCK);.    lo
ee20: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
ee30: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69  DING_BYTE;.    i
ee40: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
ee50: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
ee60: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
ee70: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
ee80: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
ee90: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
eea0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
eeb0: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
eec0: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
eed0: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
eee0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
eef0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
ef00: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
ef10: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
ef20: 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  ...  /* If contr
ef30: 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
ef40: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
ef50: 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
ef60: 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
ef70: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
ef80: 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
ef90: 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
efa0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
efb0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
efc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
efd0: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
efe0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
eff0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
f000: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
f010: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f020: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
f030: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
f040: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
f050: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
f060: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
f070: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
f080: 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
f090: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
f0a0: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
f0b0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
f0c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f0d0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
f0e0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
f0f0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
f100: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72      }..    /* Dr
f110: 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
f120: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
f130: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
f140: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
f150: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
f160: 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e   = 1L;.    lock.
f170: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
f180: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
f190: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
f1a0: 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49  ock) && rc==SQLI
f1b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
f1c0: 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70  * This could hap
f1d0: 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f  pen with a netwo
f1e0: 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  rk mount */.    
f1f0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
f200: 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  ;.#if OSLOCKING_
f210: 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
f220: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f230: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
f240: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
f250: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
f260: 4b 29 3b 20 0a 23 65 6c 73 65 0a 20 20 20 20 20  K); .#else.     
f270: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
f280: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e 64  RR_UNLOCK; .#end
f290: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  if.    }..    if
f2a0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  ( rc ){.      if
f2b0: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
f2c0: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
f2d0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f2e0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
f2f0: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
f300: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  _lock;.    }else
f310: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  {.      pFile->e
f320: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
f330: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49  D_LOCK;.      pI
f340: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
f350: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68       pInode->nSh
f360: 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ared = 1;.    }.
f370: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
f380: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
f390: 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d  _LOCK && pInode-
f3a0: 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20  >nShared>1 ){.  
f3b0: 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
f3c0: 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
f3d0: 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
f3e0: 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
f3f0: 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20  his.    ** same 
f400: 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
f410: 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
f420: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72  d lock. */.    r
f430: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
f440: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
f450: 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
f460: 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
f470: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
f480: 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
f490: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
f4a0: 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
f4b0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
f4c0: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
f4d0: 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
f4e0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  */.    assert( 0
f4f0: 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
f500: 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck );.    lock.l
f510: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
f520: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  ..    assert( eF
f530: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
f540: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  D_LOCK || eFileL
f550: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
f560: 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65  OCK );.    if( e
f570: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
f580: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
f590: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
f5a0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
f5b0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
f5c0: 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = 1L;.    }else{
f5d0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
f5e0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
f5f0: 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ST;.      lock.l
f600: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
f610: 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ZE;.    }..    i
f620: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f630: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
f640: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
f650: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
f660: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
f670: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
f680: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
f690: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
f6a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
f6b0: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  Y ){.        pFi
f6c0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
f6d0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
f6e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69      }.  }.  ..#i
f6f0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
f700: 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61  * Set up the tra
f710: 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72  nsaction-counter
f720: 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67   change checking
f730: 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a   flags when.  **
f740: 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
f750: 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20  rom a SHARED to 
f760: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
f770: 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a    The change.  *
f780: 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  * from SHARED to
f790: 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20   RESERVED marks 
f7a0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
f7b0: 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77   a normal.  ** w
f7c0: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28  rite operation (
f7d0: 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  not a hot journa
f7e0: 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a  l rollback)..  *
f7f0: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
f800: 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c  TE_OK.   && pFil
f810: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  e->eFileLock<=SH
f820: 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20  ARED_LOCK.   && 
f830: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
f840: 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20  VED_LOCK.  ){.  
f850: 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
f860: 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  trChng = 0;.    
f870: 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
f880: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
f890: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
f8a0: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  1;.  }.#endif...
f8b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f8c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
f8d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
f8e0: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e  ileLock;.    pIn
f8f0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
f900: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65   eFileLock;.  }e
f910: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
f920: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
f930: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
f940: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
f950: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  ING_LOCK;.    pI
f960: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
f970: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
f980: 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20    }..end_lock:. 
f990: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
f9a0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
f9b0: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
f9c0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
f9d0: 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
f9e0: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
f9f0: 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
fa00: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
fa10: 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
fa20: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
fa30: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
fa40: 74 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c 65  tor used by file
fa50: 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f   handle pFile to
fa60: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
fa70: 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69  ng.** pUnused li
fa80: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
fa90: 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28  id setPendingFd(
faa0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
fab0: 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
fac0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
fad0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69  e->pInode;.  Uni
fae0: 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70  xUnusedFd *p = p
faf0: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20  File->pUnused;. 
fb00: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f   p->pNext = pIno
fb10: 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70  de->pUnused;.  p
fb20: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d  Inode->pUnused =
fb30: 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d   p;.  pFile->h =
fb40: 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55   -1;.  pFile->pU
fb50: 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nused = 0;.}../*
fb60: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
fb70: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
fb80: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
fb90: 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
fba0: 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
fbb0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
fbc0: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
fbd0: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
fbe0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
fbf0: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
fc00: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
fc10: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
fc20: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
fc30: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
fc40: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
fc50: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a   a no-op..** .**
fc60: 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c   If handleNFSUnl
fc70: 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65  ock is true, the
fc80: 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67  n on downgrading
fc90: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   an EXCLUSIVE_LO
fca0: 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20  CK to SHARED.** 
fcb0: 74 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69  the byte range i
fcc0: 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32  s divided into 2
fcd0: 20 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66   parts and the f
fce0: 69 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c  irst part is unl
fcf0: 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65  ocked then.** se
fd00: 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b  t to a read lock
fd10: 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72  , then the other
fd20: 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20   part is simply 
fd30: 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20  unlocked.  This 
fd40: 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64  works .** around
fd50: 20 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46   a bug in BSD NF
fd60: 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65  S lockd (also se
fd70: 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e  en on MacOSX 10.
fd80: 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74  3+) that fails t
fd90: 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o .** remove the
fda0: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61   write lock on a
fdb0: 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72   region when a r
fdc0: 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e  ead lock is set.
fdd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
fde0: 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  osixUnlock(sqlit
fdf0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
fe00: 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20   eFileLock, int 
fe10: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29  handleNFSUnlock)
fe20: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
fe30: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
fe40: 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
fe50: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
fe60: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
fe70: 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  k;.  int rc = SQ
fe80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 68  LITE_OK;.  int h
fe90: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
fea0: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
feb0: 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
fec0: 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
fed0: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
fee0: 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
fef0: 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65  ock,.      pFile
ff00: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
ff10: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
ff20: 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
ff30: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20  node->nShared,. 
ff40: 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b       getpid()));
ff50: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ..  assert( eFil
ff60: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
ff70: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
ff80: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46  e->eFileLock<=eF
ff90: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
ffa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ffb0: 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
ffc0: 4d 75 74 65 78 28 29 3b 0a 20 20 68 20 3d 20 70  Mutex();.  h = p
ffd0: 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 49 6e 6f 64  File->h;.  pInod
ffe0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
fff0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  e;.  assert( pIn
10000 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20  ode->nShared!=0 
10010 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
10020 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
10030 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
10040 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
10050 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65  leLock==pFile->e
10060 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
10070 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
10080 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69  enign(1);.    Si
10090 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
100a0 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75  =(-1) ).    Simu
100b0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
100c0 6e 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  n(0);..#ifndef N
100d0 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
100e0 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
100f0 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
10100 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
10110 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
10120 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
10130 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
10140 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
10150 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
10160 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
10170 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
10180 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
10190 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
101a0 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
101b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
101c0 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
101d0 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
101e0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
101f0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
10200 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
10210 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
10220 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
10230 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
10240 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
10250 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
10260 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
10270 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
10280 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
10290 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
102a0 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 30 0a  n..    */.#if 0.
102b0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
102c0 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
102d0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
102e0 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d  pFile->dbUpdate=
102f0 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
10300 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
10310 68 6e 67 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66  hng==1 );.#endif
10320 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
10330 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23  rmalWrite = 0;.#
10340 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f  endif..    /* do
10350 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73  wngrading to a s
10360 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46  hared lock on NF
10370 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72  S involves clear
10380 69 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ing the write lo
10390 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  ck.    ** before
103a0 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68   establishing th
103b0 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20  e readlock - to 
103c0 61 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e  avoid a race con
103d0 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72  dition we downgr
103e0 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  ade.    ** the l
103f0 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c  ock in 2 blocks,
10400 20 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66   so that part of
10410 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20   the range will 
10420 62 65 20 63 6f 76 65 72 65 64 20 62 79 20 61 20  be covered by a 
10430 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f  .    ** write lo
10440 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73  ck until the res
10450 74 20 69 73 20 63 6f 76 65 72 65 64 20 62 79 20  t is covered by 
10460 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20  a read lock:.   
10470 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57   **  1:   [WWWWW
10480 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b  ].    **  2:   [
10490 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33  ....W].    **  3
104a0 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20  :   [RRRRW].    
104b0 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d  **  4:   [RRRR.]
104c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
104d0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
104e0 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66 20 21  D_LOCK ){..#if !
104f0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
10500 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e  _) || !SQLITE_EN
10510 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
10520 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29 68  LE.      (void)h
10530 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a  andleNFSUnlock;.
10540 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68 61        assert( ha
10550 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30  ndleNFSUnlock==0
10560 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   );.#endif.#if d
10570 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
10580 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
10590 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
105a0 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c  .      if( handl
105b0 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20  eNFSUnlock ){.  
105c0 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
105d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
105e0 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
105f0 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 65  om system call e
10600 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  rrors */.       
10610 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d   off_t divSize =
10620 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31   SHARED_SIZE - 1
10630 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
10640 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
10650 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
10660 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
10670 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
10680 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
10690 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
106a0 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
106b0 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20  len = divSize;. 
106c0 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
106d0 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
106e0 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
106f0 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
10700 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c  = errno;.#if OSL
10710 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53  OCKING_CHECK_BUS
10720 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  Y_IOERR.        
10730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
10740 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
10750 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
10760 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23  IOERR_UNLOCK);.#
10770 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 72  else.          r
10780 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
10790 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a  _UNLOCK;.#endif.
107a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
107b0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
107c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
107d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
107e0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
107f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10800 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
10810 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10820 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
10830 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
10840 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
10850 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
10860 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
10870 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
10880 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
10890 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20  len = divSize;. 
108a0 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
108b0 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
108c0 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
108d0 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
108e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
108f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
10900 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
10910 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
10920 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a  _IOERR_RDLOCK);.
10930 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
10940 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
10950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
10960 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
10970 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
10980 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10990 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
109a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
109b0 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
109c0 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
109d0 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
109e0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
109f0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
10a00 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
10a10 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
10a20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
10a30 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a  ARED_SIZE-divSiz
10a40 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
10a50 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
10a60 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
10a70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
10a80 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
10a90 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
10aa0 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
10ab0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10ac0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
10ad0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
10ae0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
10af0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
10b00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
10b10 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e  OERR_UNLOCK;.#en
10b20 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 69 66  dif.          if
10b30 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
10b40 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
10b50 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
10b60 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
10b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10b80 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
10b90 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
10ba0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
10bb0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
10bc0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
10bd0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
10be0 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20  _STYLE */.      
10bf0 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  {.        lock.l
10c00 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
10c10 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
10c20 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
10c30 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
10c40 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
10c50 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
10c60 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
10c70 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
10c80 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
10c90 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
10ca0 20 29 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e   ){.#if OSLOCKIN
10cb0 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
10cc0 52 52 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  RR.          tEr
10cd0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
10ce0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
10cf0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
10d00 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
10d10 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
10d20 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  K);.          if
10d30 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
10d40 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
10d50 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
10d60 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
10d70 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a          }.#else.
10d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
10d90 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c  theory, the call
10da0 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b   to unixFileLock
10db0 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62  () cannot fail b
10dc0 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20  ecause another. 
10dd0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
10de0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ess is holding a
10df0 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c  n incompatible l
10e00 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c  ock. If it does,
10e10 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
10e20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68   ** indicates th
10e30 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f  at the other pro
10e40 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
10e50 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e  owing the lockin
10e60 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  g.          ** p
10e70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73  rotocol. If this
10e80 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e   happens, return
10e90 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
10ea0 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a  LOCK. Returning.
10eb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
10ec0 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63  ITE_BUSY would c
10ed0 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65 72  onfuse the upper
10ee0 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63 74   layer (in pract
10ef0 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a 20  ice it causes . 
10f00 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61           ** an a
10f10 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20  ssert to fail). 
10f20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72 63  */ .          rc
10f30 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
10f40 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  RDLOCK;.        
10f50 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
10f60 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 65 6e 64  no = errno;.#end
10f70 69 66 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  if.          got
10f80 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
10f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10fa0 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c      }.    lock.l
10fb0 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
10fc0 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
10fd0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
10fe0 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
10ff0 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
11000 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
11010 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45   2L;  assert( PE
11020 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45  NDING_BYTE+1==RE
11030 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20  SERVED_BYTE );. 
11040 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
11050 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
11060 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  )==0 ){.      pI
11070 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
11080 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
11090 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53     }else{.#if OS
110a0 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55  LOCKING_CHECK_BU
110b0 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 74  SY_IOERR.      t
110c0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
110d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
110e0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
110f0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
11100 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
11110 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c  ;.      if( IS_L
11120 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
11130 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
11140 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
11150 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73  no;.      }.#els
11160 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  e.      rc = SQL
11170 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
11180 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
11190 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
111a0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 67  ;.#endif.      g
111b0 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
111c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
111d0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
111e0 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63  CK ){.    /* Dec
111f0 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
11200 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
11210 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
11220 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
11230 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
11240 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
11250 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
11260 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
11270 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
11280 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
11290 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
112a0 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
112b0 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
112c0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
112d0 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
112e0 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
112f0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
11300 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
11310 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30  = lock.l_len = 0
11320 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  L;.      Simulat
11330 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
11340 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
11350 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
11360 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74   ).      Simulat
11370 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
11380 29 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  );.      if( uni
11390 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
113a0 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
113b0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
113c0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
113d0 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
113e0 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48  #if OSLOCKING_CH
113f0 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20  ECK_BUSY_IOERR. 
11400 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
11410 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
11420 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
11430 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
11440 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
11450 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
11460 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
11470 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
11480 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
11490 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
114a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73  ;.        }.#els
114b0 65 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  e.        rc = S
114c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
114d0 43 4b 3b 0a 09 20 20 20 20 70 46 69 6c 65 2d 3e  CK;..    pFile->
114e0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
114f0 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  o;.#endif.      
11500 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
11510 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
11520 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
11530 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
11540 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
11550 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
11560 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
11570 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
11580 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
11590 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
115a0 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
115b0 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
115c0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
115d0 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
115e0 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
115f0 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
11600 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
11610 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
11620 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
11630 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
11640 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
11650 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
11660 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
11670 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
11680 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
11690 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a  }...end_unlock:.
116a0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
116b0 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
116c0 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
116d0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
116e0 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
116f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
11700 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
11710 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
11720 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
11730 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
11740 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
11750 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
11760 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
11770 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
11780 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
11790 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
117a0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
117b0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
117c0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
117d0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
117e0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
117f0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
11800 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c  t unixUnlock(sql
11810 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
11820 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
11830 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c   return posixUnl
11840 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63  ock(id, eFileLoc
11850 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k, 0);.}../*.** 
11860 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
11870 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74 73  rforms the parts
11880 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20 66   of the "close f
11890 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a  ile" operation .
118a0 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  ** common to all
118b0 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
118c0 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65 20  . It closes the 
118d0 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66 69  directory and fi
118e0 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69  le.** handles, i
118f0 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69 64  f they are valid
11900 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20 66  , and sets all f
11910 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e 69  ields of the uni
11920 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
11930 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49  re to 0..**.** I
11940 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73  t is *not* neces
11950 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  sary to hold the
11960 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69 73   mutex when this
11970 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
11980 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56  ed,.** even on V
11990 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65 78  xWorks.  A mutex
119a0 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72 65   will be acquire
119b0 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79 20  d on VxWorks by 
119c0 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65  the.** vxworksRe
119d0 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72 6f  leaseFileId() ro
119e0 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
119f0 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46 69   int closeUnixFi
11a00 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  le(sqlite3_file 
11a10 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
11a20 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11a30 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20 4f 53 43  ile*)id;.#if OSC
11a40 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f 53 45  LOSE_CHECK_CLOSE
11a50 5f 49 4f 45 52 52 0a 20 20 69 66 28 20 70 46 69  _IOERR.  if( pFi
11a60 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  le->h>=0 ){.    
11a70 69 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28  int err = close(
11a80 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 69  pFile->h);.    i
11a90 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
11aa0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11ab0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
11ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
11ad0 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 7d  ERR_CLOSE;.    }
11ae0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
11af0 65 2d 3e 68 3d 2d 31 3b 0a 20 20 20 20 7d 0a 20  e->h=-1;.    }. 
11b00 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70   }.#else.  if( p
11b10 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
11b20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
11b30 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
11b40 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70  __LINE__);.    p
11b50 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
11b60 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  }.#endif.#if OS_
11b70 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46  VXWORKS.  if( pF
11b80 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20  ile->pId ){.    
11b90 69 66 28 20 70 46 69 6c 65 2d 3e 69 73 44 65 6c  if( pFile->isDel
11ba0 65 74 65 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  ete ){.      osU
11bb0 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64  nlink(pFile->pId
11bc0 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
11bd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77  );.    }.    vxw
11be0 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
11bf0 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20  d(pFile->pId);. 
11c00 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20     pFile->pId = 
11c10 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
11c20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
11c30 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
11c40 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  ->h));.  OpenCou
11c50 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
11c60 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
11c70 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73  pUnused);.  mems
11c80 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
11c90 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
11ca0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11cb0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
11cc0 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
11cd0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
11ce0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
11cf0 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
11d00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
11d10 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11d20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
11d30 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c    unixUnlock(id,
11d40 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69   NO_LOCK);.  uni
11d50 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  xEnterMutex();..
11d60 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49    /* unixFile.pI
11d70 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 76  node is always v
11d80 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72  alid here. Other
11d90 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e  wise, a differen
11da0 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75  t close.  ** rou
11db0 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63  tine (e.g. noloc
11dc0 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20  kClose()) would 
11dd0 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
11de0 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
11df0 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
11e00 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c  >nLock>0 || pFil
11e10 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
11e20 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  essLock==0 );.  
11e30 69 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65  if( ALWAYS(pFile
11e40 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69  ->pInode) && pFi
11e50 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
11e60 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  k ){.    /* If t
11e70 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
11e80 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
11e90 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
11ea0 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
11eb0 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
11ec0 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
11ed0 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
11ee0 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
11ef0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64  he file.    ** d
11f00 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
11f10 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  ode->pUnused lis
11f20 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  t.  It will be a
11f30 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
11f40 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sed .    ** when
11f50 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
11f60 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  s cleared..    *
11f70 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67  /.    setPending
11f80 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  Fd(pFile);.  }. 
11f90 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
11fa0 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d  o(pFile);.  rc =
11fb0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
11fc0 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  d);.  unixLeaveM
11fd0 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
11fe0 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   rc;.}../*******
11ff0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
12000 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
12010 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
12020 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
12030 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
12040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12080 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
12090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
120a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
120b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
120c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
120d0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
120e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
120f0 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f  ******* No-op Lo
12100 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
12110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12120 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f  ********.**.** O
12130 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
12140 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
12150 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c  tions available,
12160 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20   this is by far 
12170 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a  the.** simplest:
12180 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e    locking is ign
12190 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70  ored.  No attemp
121a0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63  t is made to loc
121b0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  k the database.*
121c0 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  * file for readi
121d0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  ng or writing..*
121e0 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e  *.** This lockin
121f0 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70  g mode is approp
12200 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e  riate for use on
12210 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
12220 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74  ases.** (ex: dat
12230 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20  abases that are 
12240 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52  burned into CD-R
12250 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  OM, for example.
12260 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73  )  It can.** als
12270 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  o be used if the
12280 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70   application emp
12290 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e  loys some extern
122a0 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a  al mechanism to.
122b0 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c  ** prevent simul
122c0 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f  taneous access o
122d0 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  f the same datab
122e0 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f  ase by two or mo
122f0 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  re.** database c
12300 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74  onnections.  But
12310 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69   there is a seri
12320 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61  ous risk of data
12330 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69  base.** corrupti
12340 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69  on if this locki
12350 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
12360 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68  in situations wh
12370 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ere multiple.** 
12380 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12390 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69  ions are accessi
123a0 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
123b0 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
123c0 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e   same.** time an
123d0 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  d one or more of
123e0 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f   those connectio
123f0 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a  ns are writing..
12400 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  */..static int n
12410 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
12420 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
12430 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
12440 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55  t *pResOut){.  U
12450 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12460 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65  NotUsed);.  *pRe
12470 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  sOut = 0;.  retu
12480 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12490 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
124a0 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
124b0 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
124c0 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
124d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
124e0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
124f0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
12500 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
12510 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63   int nolockUnloc
12520 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12530 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
12540 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
12550 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
12560 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
12570 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12580 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
12590 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  se the file..*/.
125a0 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
125b0 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
125c0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74  ile *id) {.  ret
125d0 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
125e0 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  e(id);.}../*****
125f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
12600 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20  nd of the no-op 
12610 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
12620 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
12630 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
12640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12680 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
12690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
126e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126f0 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66  **** Begin dot-f
12700 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ile Locking ****
12710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
12730 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63   The dotfile loc
12740 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
12750 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78 69  ion uses the exi
12760 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61 72 61  stance of separa
12770 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73  te lock.** files
12780 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
12790 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
127a0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
127b0 69 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74  is works on just
127c0 0a 2a 2a 20 61 62 6f 75 74 20 65 76 65 72 79 20  .** about every 
127d0 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69  filesystem imagi
127e0 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72  nable.  But ther
127f0 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f  e are serious do
12800 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  wnsides:.**.**  
12810 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20    (1)  There is 
12820 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79  zero concurrency
12830 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64  .  A single read
12840 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74  er blocks all ot
12850 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  her.**         c
12860 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
12870 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
12880 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
12890 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
128a0 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72  n application cr
128b0 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
128c0 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c  s can leave stal
128d0 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20  e lock files.** 
128e0 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20          sitting 
128f0 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64  around that need
12900 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d   to be cleared m
12910 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  anually..**.** N
12920 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64  evertheless, a d
12930 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70  otlock is an app
12940 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
12950 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66   mode for use if
12960 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63   no.** other loc
12970 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73  king strategy is
12980 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
12990 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
129a0 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  g works by creat
129b0 69 6e 67 20 61 20 66 69 6c 65 20 69 6e 20 74 68  ing a file in th
129c0 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
129d0 20 61 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   as the.** datab
129e0 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65  ase and with the
129f0 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77   same name but w
12a00 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78  ith a ".lock" ex
12a10 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  tension added..*
12a20 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63 65 20  * The existance 
12a30 6f 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69  of a lock file i
12a40 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
12a50 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
12a60 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70  ther lock.** typ
12a70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
12a80 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
12a90 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
12aa0 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
12ab0 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
12ac0 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
12ad0 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
12ae0 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
12af0 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
12b00 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66  ck file..*/.#def
12b10 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  ine DOTLOCK_SUFF
12b20 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a  IX ".lock"../*.*
12b30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
12b40 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
12b50 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
12b60 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
12b70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
12b80 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
12b90 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
12ba0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
12bb0 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
12bc0 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
12bd0 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
12be0 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
12bf0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
12c00 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
12c10 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
12c20 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
12c30 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
12c40 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
12c50 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  cking..**.** In 
12c60 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
12c70 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65   either a lock e
12c80 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73  xists or it does
12c90 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69   not.  So in thi
12ca0 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f  s.** variation o
12cb0 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  f CheckReservedL
12cc0 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20  ock(), *pResOut 
12cd0 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69  is set to true i
12ce0 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f any lock.** is
12cf0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
12d00 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74  e and false if t
12d10 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
12d20 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
12d30 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  nt dotlockCheckR
12d40 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
12d50 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
12d60 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
12d70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12d80 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
12d90 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
12da0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
12db0 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
12dc0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
12dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
12de0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
12df0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
12e00 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
12e10 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
12e20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
12e30 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
12e40 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
12e50 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
12e60 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
12e70 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
12e80 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
12e90 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f  or some other co
12ea0 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nnection in the 
12eb0 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20  same process.   
12ec0 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b   ** holds a lock
12ed0 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e   on the file.  N
12ee0 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
12ef0 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  further. */.    
12f00 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
12f10 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
12f20 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69  e lock is held i
12f30 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68  f and only if th
12f40 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74  e lockfile exist
12f50 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  s */.    const c
12f60 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
12f70 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46   (const char*)pF
12f80 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
12f90 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65  ext;.    reserve
12fa0 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c 6f  d = osAccess(zLo
12fb0 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20  ckFile, 0)==0;. 
12fc0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
12fd0 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
12fe0 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d %d (dotlock)\n
12ff0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
13000 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a   reserved));.  *
13010 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
13020 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
13030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
13040 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
13050 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
13060 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
13070 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
13080 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
13090 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
130a0 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
130b0 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
130c0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
130d0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
130e0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
130f0 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
13100 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
13110 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
13120 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
13130 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
13140 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
13150 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
13160 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
13170 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
13180 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
13190 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
131a0 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
131b0 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
131c0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
131d0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
131e0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
131f0 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
13200 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
13210 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
13220 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
13230 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
13240 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
13250 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
13260 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
13270 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
13280 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
13290 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
132a0 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
132b0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
132c0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
132d0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
132e0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
132f0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
13300 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
13310 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
13320 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
13330 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
13340 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
13350 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  vel..**.** With 
13360 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
13370 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20   we really only 
13380 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34  support state (4
13390 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a  ): EXCLUSIVE..**
133a0 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68   But we track th
133b0 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  e other locking 
133c0 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c  levels internall
133d0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
133e0 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c   dotlockLock(sql
133f0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13400 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13410 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13420 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13430 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63  d;.  int fd;.  c
13440 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
13450 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
13460 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
13470 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13480 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
13490 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
134a0 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
134b0 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
134c0 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
134d0 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
134e0 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
134f0 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
13500 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
13510 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
13520 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
13530 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
13540 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
13550 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20  ileLock;.    /* 
13560 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68  Always update th
13570 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74  e timestamp on t
13580 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23  he old file */.#
13590 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
135a0 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b  .    utime(zLock
135b0 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  File, NULL);.#el
135c0 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c  se.    utimes(zL
135d0 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a  ockFile, NULL);.
135e0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
135f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13600 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
13610 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
13620 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74  */.  fd = robust
13630 5f 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c  _open(zLockFile,
13640 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54  O_RDONLY|O_CREAT
13650 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20  |O_EXCL,0600);. 
13660 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
13670 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70   /* failed to op
13680 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
13690 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  le, someone else
136a0 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e   may have stolen
136b0 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
136c0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
136d0 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
136e0 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
136f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
13700 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
13710 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
13720 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
13730 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
13740 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
13750 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
13760 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
13770 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
13780 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
13790 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
137a0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
137b0 6e 20 72 63 3b 0a 20 20 7d 20 0a 23 69 66 20 4f  n rc;.  } .#if O
137c0 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f  SCLOSE_CHECK_CLO
137d0 53 45 5f 49 4f 45 52 52 0a 20 20 69 66 28 20 63  SE_IOERR.  if( c
137e0 6c 6f 73 65 28 66 64 29 20 29 7b 0a 20 20 20 20  lose(fd) ){.    
137f0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
13800 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63   = errno;.    rc
13810 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
13820 43 4c 4f 53 45 3b 0a 20 20 7d 0a 23 65 6c 73 65  CLOSE;.  }.#else
13830 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  .  robust_close(
13840 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e  pFile, fd, __LIN
13850 45 5f 5f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 0a  E__);.#endif.  .
13860 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
13870 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
13880 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
13890 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
138a0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
138b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
138c0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
138d0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
138e0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
138f0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
13900 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
13910 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
13920 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
13930 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
13940 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
13950 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
13960 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
13970 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
13980 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
13990 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
139a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
139b0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  no-op..**.** Whe
139c0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  n the locking le
139d0 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c  vel reaches NO_L
139e0 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20  OCK, delete the 
139f0 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  lock file..*/.st
13a00 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
13a10 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
13a20 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
13a30 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
13a40 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13a50 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
13a60 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
13a70 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
13a80 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
13a90 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
13aa0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
13ab0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
13ac0 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74  s %d pid=%d (dot
13ad0 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
13ae0 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09  >h, eFileLock,..
13af0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13b00 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
13b10 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
13b20 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
13b30 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
13b40 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
13b50 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
13b60 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
13b70 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
13b80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13b90 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72  ..  /* To downgr
13ba0 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73  ade to shared, s
13bb0 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72  imply update our
13bc0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e   internal notion
13bd0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63   of the.  ** loc
13be0 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65  k state.  No nee
13bf0 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74  d to mess with t
13c00 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
13c10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
13c20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
13c30 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
13c40 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
13c50 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65  RED_LOCK;.    re
13c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13c70 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66    }.  .  /* To f
13c80 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20  ully unlock the 
13c90 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65  database, delete
13ca0 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a   the lock file *
13cb0 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  /.  assert( eFil
13cc0 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
13cd0 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b  ;.  if( osUnlink
13ce0 28 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20  (zLockFile) ){. 
13cf0 20 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20     int rc = 0;. 
13d00 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
13d10 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45  errno;.    if( E
13d20 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20  NOENT != tErrno 
13d30 29 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  ){.#if OSLOCKING
13d40 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
13d50 52 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  R.      rc = sql
13d60 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
13d70 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
13d80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
13d90 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  CK);.#else.     
13da0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
13db0 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69  RR_UNLOCK;.#endi
13dc0 66 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  f.    }.    if( 
13dd0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
13de0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
13df0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
13e00 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
13e10 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
13e20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13e30 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
13e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13e50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
13e60 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73   a file.  Make s
13e70 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  ure the lock has
13e80 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62   been released b
13e90 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a  efore closing..*
13ea0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
13eb0 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
13ec0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
13ed0 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64  int rc;.  if( id
13ee0 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
13ef0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13f00 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74  ile*)id;.    dot
13f10 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  lockUnlock(id, N
13f20 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c  O_LOCK);.    sql
13f30 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
13f40 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
13f50 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f  ;.  }.  rc = clo
13f60 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
13f70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f    return rc;.}./
13f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f90 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f  ** End of the do
13fa0 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c  t-file lock impl
13fb0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
13fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
14020 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
14030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
14090 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a   flock Locking *
140a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
140c0 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c  **.** Use the fl
140d0 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ock() system cal
140e0 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63  l to do file loc
140f0 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63  king..**.** floc
14100 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  k() locking is l
14110 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63  ike dot-file loc
14120 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65  king in that the
14130 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65   various.** fine
14140 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c  -grain locking l
14150 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20  evels supported 
14160 62 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f  by SQLite are co
14170 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20  llapsed into.** 
14180 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69  a single exclusi
14190 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68  ve lock.  In oth
141a0 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44  er words, SHARED
141b0 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a  , RESERVED, and.
141c0 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73  ** PENDING locks
141d0 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68   are the same th
141e0 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53  ing as an EXCLUS
141f0 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74  IVE lock.  SQLit
14200 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73  e.** still works
14210 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69   when you do thi
14220 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e  s, but concurren
14230 63 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69  cy is reduced si
14240 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  nce.** only a si
14250 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e  ngle process can
14260 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20   be reading the 
14270 64 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69  database at a ti
14280 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74  me..**.** Omit t
14290 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53  his section if S
142a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
142b0 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75  KING_STYLE is tu
142c0 72 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a  rned off or if.*
142d0 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20  * compiling for 
142e0 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20  VXWORKS..*/.#if 
142f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
14300 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
14310 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
14320 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20  * Retry flock() 
14330 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20  calls that fail 
14340 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69  with EINTR.*/.#i
14350 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69  fdef EINTR.stati
14360 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f  c int robust_flo
14370 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ck(int fd, int o
14380 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
14390 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66  do{ rc = flock(f
143a0 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72  d,op); }while( r
143b0 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
143c0 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NTR );.  return 
143d0 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  rc;.}.#else.# de
143e0 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63  fine robust_floc
143f0 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62  k(a,b) flock(a,b
14400 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a  ).#endif.     ..
14410 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
14420 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
14430 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
14440 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
14450 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
14460 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
14470 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
14480 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
14490 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
144a0 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
144b0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
144c0 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
144d0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
144e0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
144f0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
14500 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
14510 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
14520 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
14530 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
14540 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68  atic int flockCh
14550 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
14560 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14570 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
14580 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14590 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
145a0 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
145b0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
145c0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
145d0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
145e0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
145f0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
14600 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
14610 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
14620 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   );.  .  /* Chec
14630 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
14640 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
14650 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
14660 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
14670 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
14680 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
14690 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
146a0 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
146b0 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
146c0 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
146d0 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72   it. */.  if( !r
146e0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f  eserved ){.    /
146f0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74  * attempt to get
14700 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
14710 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73   int lrc = robus
14720 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
14730 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
14740 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c  _NB);.    if( !l
14750 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67  rc ){.      /* g
14760 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c  ot the lock, unl
14770 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ock it */.      
14780 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
14790 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
147a0 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20  K_UN);.      if 
147b0 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20  ( lrc ) {.      
147c0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
147d0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rrno;.        /*
147e0 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77   unlock failed w
147f0 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ith an error */.
14800 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48  #if OSLOCKING_CH
14810 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20  ECK_BUSY_IOERR. 
14820 20 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c         lrc = sql
14830 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
14840 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
14850 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
14860 43 4b 29 3b 0a 23 65 6c 73 65 20 0a 20 20 20 20  CK);.#else .    
14870 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45      lrc = SQLITE
14880 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a  _IOERR_UNLOCK; .
14890 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
148a0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
148b0 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
148c0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
148d0 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
148e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
148f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14900 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
14910 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
14920 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
14930 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
14940 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
14950 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20  else might have 
14960 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20  it reserved */. 
14970 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74       lrc = sqlit
14980 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
14990 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
149a0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
149b0 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c   .      if( IS_L
149c0 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
149d0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
149e0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
149f0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20  rno;.        rc 
14a00 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
14a10 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
14a20 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
14a30 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63  K %d %d %d (floc
14a40 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
14a50 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
14a60 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
14a70 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
14a80 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
14a90 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc & SQLITE_IOER
14aa0 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
14ab0 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  RR ){.    rc = S
14ac0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65  QLITE_OK;.    re
14ad0 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65  served=1;.  }.#e
14ae0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
14af0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
14b00 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52  _ERRORS */.  *pR
14b10 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
14b20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14b30 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
14b40 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
14b50 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
14b60 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
14b70 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
14b80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
14b90 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
14ba0 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
14bb0 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
14bc0 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
14bd0 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
14be0 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
14bf0 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
14c00 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
14c10 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
14c20 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
14c30 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
14c40 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
14c50 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
14c60 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
14c70 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
14c80 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
14c90 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
14ca0 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
14cb0 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
14cc0 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
14cd0 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
14ce0 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
14cf0 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
14d00 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
14d10 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
14d20 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
14d30 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
14d40 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
14d50 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
14d60 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
14d70 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
14d80 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
14d90 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
14da0 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
14db0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
14dc0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
14dd0 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
14de0 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  SIVE.**.** flock
14df0 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  () only really s
14e00 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
14e10 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
14e20 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
14e30 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
14e40 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
14e50 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
14e60 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
14e70 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
14e80 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
14e90 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
14ea0 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
14eb0 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
14ec0 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
14ed0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
14ee0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
14ef0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
14f00 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
14f10 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
14f20 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
14f30 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
14f40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
14f50 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
14f60 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
14f70 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
14f80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14f90 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
14fa0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
14fb0 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  id;..  assert( p
14fc0 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66  File );..  /* if
14fd0 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
14fe0 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
14ff0 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
15000 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
15010 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
15020 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
15030 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
15040 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
15050 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
15060 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
15070 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
15080 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
15090 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
150a0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
150b0 20 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f    .  if (robust_
150c0 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
150d0 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
150e0 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45  B)) {.    int tE
150f0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
15100 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c    /* didn't get,
15110 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f   must be busy */
15120 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15130 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
15140 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
15150 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
15160 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
15170 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
15180 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15190 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
151a0 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20    }.  } else {. 
151b0 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65     /* got it, se
151c0 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
151d0 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20  eturn ok */.    
151e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
151f0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
15200 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  }.  OSTRACE(("LO
15210 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
15220 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
15230 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
15240 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
15250 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
15260 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
15270 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65  failed"));.#ifde
15280 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
15290 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
152a0 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51  S.  if( (rc & SQ
152b0 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
152c0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
152d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
152e0 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  USY;.  }.#endif 
152f0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
15300 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
15310 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  RS */.  return r
15320 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
15330 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
15340 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
15350 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
15360 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
15370 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
15380 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
15390 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
153a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
153b0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
153c0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
153d0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
153e0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
153f0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
15400 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
15410 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
15420 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
15430 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c   flockUnlock(sql
15440 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
15450 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
15460 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15470 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15480 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
15490 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
154a0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
154b0 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
154c0 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
154d0 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
154e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
154f0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67  le->eFileLock, g
15500 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73  etpid()));.  ass
15510 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
15520 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
15530 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
15540 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
15550 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
15560 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
15570 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15580 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
15590 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
155a0 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
155b0 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
155c0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
155d0 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
155e0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
155f0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
15600 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
15610 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
15620 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
15630 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
15640 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
15650 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  ( robust_flock(p
15660 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
15670 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) ){.#ifdef SQLI
15680 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
15690 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20  LOCK_ERRORS.    
156a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
156b0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
156c0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
156d0 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
156e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
156f0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
15700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
15710 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
15720 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
15730 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15740 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
15750 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
15760 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
15770 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
15780 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
15790 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63  {.    flockUnloc
157a0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
157b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f    }.  return clo
157c0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
157d0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
157e0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
157f0 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
15800 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a  VXWORK */../****
15810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
15820 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b  End of the flock
15830 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
15840 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
15850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
15860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
158b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
15900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15910 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64  **** Begin Named
15920 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69   Semaphore Locki
15930 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
15940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
15950 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
15960 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
15970 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56  y supported on V
15980 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  xWorks..**.** Se
15990 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
159a0 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b  is like dot-lock
159b0 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68   and flock in th
159c0 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c  at it really onl
159d0 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58  y.** supports EX
159e0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e  CLUSIVE locking.
159f0 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20    Only a single 
15a00 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64  process can read
15a10 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65   or write.** the
15a20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
15a30 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20  t a time.  This 
15a40 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61  reduces potentia
15a50 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62  l concurrency, b
15a60 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  ut.** makes the 
15a70 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
15a80 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e  ion much easier.
15a90 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  .*/.#if OS_VXWOR
15aa0 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  KS../*.** This r
15ab0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
15ac0 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
15ad0 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
15ae0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
15af0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
15b00 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
15b10 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
15b20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
15b30 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
15b40 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
15b50 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
15b60 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
15b70 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
15b80 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
15b90 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
15ba0 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
15bb0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
15bc0 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
15bd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
15be0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
15bf0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
15c00 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
15c10 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
15c20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
15c30 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
15c40 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
15c50 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
15c60 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
15c70 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
15c80 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
15c90 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
15ca0 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
15cb0 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
15cc0 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
15cd0 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
15ce0 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
15cf0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
15d00 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
15d10 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
15d20 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
15d30 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
15d40 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
15d50 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
15d60 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
15d70 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65  served ){.    se
15d80 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
15d90 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
15da0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
15db0 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69   statBuf;..    i
15dc0 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
15dd0 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
15de0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
15df0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
15e00 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f  EAGAIN != tErrno
15e10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
15e20 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
15e30 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
15e40 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
15e50 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
15e60 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  K);.        pFil
15e70 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
15e80 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65  Errno;.      } e
15e90 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  lse {.        /*
15ea0 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61   someone else ha
15eb0 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20  s the lock when 
15ec0 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43  we are in NO_LOC
15ed0 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73  K */.        res
15ee0 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e  erved = (pFile->
15ef0 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52  eFileLock < SHAR
15f00 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
15f10 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
15f20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
15f30 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
15f40 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
15f50 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
15f60 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
15f70 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
15f80 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c   %d %d %d (sem)\
15f90 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
15fa0 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
15fb0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
15fc0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
15fd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
15fe0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
15ff0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
16000 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
16010 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
16020 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
16030 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
16040 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
16050 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
16060 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
16070 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
16080 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
16090 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
160a0 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
160b0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
160c0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
160d0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
160e0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
160f0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
16100 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
16110 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
16120 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
16130 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
16140 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
16150 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
16160 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
16170 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
16180 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
16190 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
161a0 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
161b0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
161c0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
161d0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
161e0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
161f0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
16200 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
16210 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
16220 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
16230 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
16240 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
16250 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
16260 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
16270 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
16280 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53  XCLUSIVE.**.** S
16290 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f  emaphore locks o
162a0 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
162b0 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
162c0 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
162d0 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
162e0 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
162f0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
16300 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
16310 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
16320 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
16330 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
16340 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
16350 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
16360 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
16370 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
16380 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16390 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
163a0 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
163b0 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
163c0 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
163d0 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
163e0 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
163f0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63  tatic int semLoc
16400 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
16410 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
16420 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
16430 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
16440 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64  le*)id;.  int fd
16450 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
16460 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
16470 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20  >pSem;.  int rc 
16480 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
16490 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
164a0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
164b0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
164c0 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
164d0 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
164e0 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
164f0 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
16500 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
16510 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
16520 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
16530 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20  ileLock;.    rc 
16540 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
16550 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
16560 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
16570 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e  lock semaphore n
16580 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20  ow but bail out 
16590 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63  when already loc
165a0 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65  ked. */.  if( se
165b0 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
165c0 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =-1 ){.    rc = 
165d0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
165e0 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
165f0 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f  ck;.  }..  /* go
16600 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
16610 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
16620 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69   */.  pFile->eFi
16630 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
16640 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f  ck;.. sem_end_lo
16650 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck:.  return rc;
16660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
16670 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
16680 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
16690 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
166a0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
166b0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
166c0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
166d0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
166e0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
166f0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
16700 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16710 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
16720 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
16730 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
16740 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
16750 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
16760 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
16770 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  mUnlock(sqlite3_
16780 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
16790 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
167a0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
167b0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
167c0 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
167d0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
167e0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  m;..  assert( pF
167f0 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ile );.  assert(
16800 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41   pSem );.  OSTRA
16810 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
16820 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
16830 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
16840 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
16850 09 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  .   pFile->eFile
16860 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29  Lock, getpid()))
16870 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
16880 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
16890 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
168a0 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
168b0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
168c0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
168d0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
168e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
168f0 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
16900 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
16910 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
16920 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
16930 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46  sive */.  if (eF
16940 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16950 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
16960 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
16970 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
16980 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16990 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
169a0 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a  really unlock. *
169b0 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73  /.  if ( sem_pos
169c0 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a  t(pSem)==-1 ) {.
169d0 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72      int rc, tErr
169e0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
169f0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
16a00 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
16a10 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
16a20 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
16a30 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
16a40 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
16a50 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16a60 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
16a70 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
16a80 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
16a90 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
16aa0 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
16ab0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  TE_OK;.}../*. **
16ac0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20   Close a file.. 
16ad0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
16ae0 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  mClose(sqlite3_f
16af0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
16b00 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
16b10 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
16b20 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
16b30 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  semUnlock(id, NO
16b40 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65  _LOCK);.    asse
16b50 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20  rt( pFile );.   
16b60 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
16b70 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e  );.    releaseIn
16b80 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
16b90 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
16ba0 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55  ex();.    closeU
16bb0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d  nixFile(id);.  }
16bc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16bd0 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
16be0 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
16bf0 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  /*.** Named sema
16c00 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
16c10 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
16c20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
16c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
16c40 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  nd of the named 
16c50 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69  semaphore lock i
16c60 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
16c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
16c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
16cd0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
16ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d20 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
16d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
16d40 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a  in AFP Locking *
16d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d70 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68  .**.** AFP is th
16d80 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50  e Apple Filing P
16d90 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73  rotocol.  AFP is
16da0 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73   a network files
16db0 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f  ystem found.** o
16dc0 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73  n Apple Macintos
16dd0 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f  h computers - bo
16de0 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a  th OS9 and OSX..
16df0 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74  **.** Third-part
16e00 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  y implementation
16e10 73 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61  s of AFP are ava
16e20 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69  ilable.  But thi
16e30 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f  s code here.** o
16e40 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58  nly works on OSX
16e50 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ..*/..#if define
16e60 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
16e70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
16e80 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a  CKING_STYLE./*.*
16e90 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * The afpLocking
16ea0 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
16eb0 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61  e contains all a
16ec0 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63  fp lock specific
16ed0 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65   state.*/.typede
16ee0 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  f struct afpLock
16ef0 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f  ingContext afpLo
16f00 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
16f10 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
16f20 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72  ontext {.  int r
16f30 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74  eserved;.  const
16f40 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20   char *dbPath;  
16f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
16f60 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  me of the open f
16f70 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63  ile */.};..struc
16f80 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
16f90 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  B2.{.  unsigned 
16fa0 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
16fb0 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73  ;        /* offs
16fc0 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65  et to first byte
16fd0 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e   to lock */.  un
16fe0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
16ff0 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20   length;        
17000 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20  /* nbr of bytes 
17010 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
17020 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
17030 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f  retRangeStart; /
17040 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74  * nbr of 1st byt
17050 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63  e locked if succ
17060 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69  essful */.  unsi
17070 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b  gned char unLock
17080 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  Flag;         /*
17090 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d   1 = unlock, 0 =
170a0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
170b0 6e 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e  ned char startEn
170c0 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  dFlag;       /* 
170d0 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20  1=rel to end of 
170e0 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73  fork, 0=rel to s
170f0 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64  tart */.  int fd
17100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
17120 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f  ile desc to asso
17130 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68  c this lock with
17140 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20   */.};..#define 
17150 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
17160 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20  ck2FSCTL        
17170 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73  _IOWR('z', 23, s
17180 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
17190 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54  ockPB2)../*.** T
171a0 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
171b0 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20   for setting or 
171c0 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72  clearing a bit-r
171d0 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a  ange lock on an.
171e0 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65  ** AFP filesyste
171f0 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e  m..** .** Return
17200 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
17210 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55  ccess, SQLITE_BU
17220 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  SY on failure..*
17230 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
17240 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74  SetLock(.  const
17250 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20   char *path,    
17260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
17270 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
17280 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e   be locked or un
17290 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
172a0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
172b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
172c0 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
172d0 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20  or on path */.  
172e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
172f0 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f  ng offset,     /
17300 2a 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20  * First byte to 
17310 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
17320 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
17330 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a  g length,     /*
17340 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
17350 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
17360 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20  t setLockFlag   
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17380 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b  True to set lock
17390 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61  .  False to clea
173a0 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73  r lock */.){.  s
173b0 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
173c0 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74  ockPB2 pb;.  int
173d0 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e   err;.  .  pb.un
173e0 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f  LockFlag = setLo
173f0 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a  ckFlag ? 0 : 1;.
17400 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61    pb.startEndFla
17410 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73  g = 0;.  pb.offs
17420 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70  et = offset;.  p
17430 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74  b.length = lengt
17440 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46  h; .  pb.fd = pF
17450 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54  ile->h;.  .  OST
17460 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
17470 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20  K [%s] for %d%s 
17480 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c  in range %llx:%l
17490 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74  lx\n", .    (set
174a0 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f  LockFlag?"ON":"O
174b0 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  FF"), pFile->h, 
174c0 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73  (pb.fd==-1?"[tes
174d0 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20  tval-1]":""),.  
174e0 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68    offset, length
174f0 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74  ));.  err = fsct
17500 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74  l(path, afpfsByt
17510 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
17520 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20  , &pb, 0);.  if 
17530 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20  ( err==-1 ) {.  
17540 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
17550 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
17560 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
17570 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65  AFPSETLOCK faile
17580 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73  d to fsctl() '%s
17590 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  ' %d %s\n",.    
175a0 20 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74           path, t
175b0 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28  Errno, strerror(
175c0 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65  tErrno)));.#ifde
175d0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
175e0 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  AFP_LOCK_ERRORS.
175f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17600 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20  BUSY;.#else.    
17610 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
17620 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
17630 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
17640 20 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f             setLo
17650 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f  ckFlag ? SQLITE_
17660 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c  IOERR_LOCK : SQL
17670 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
17680 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
17690 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
176a0 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
176b0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
176c0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
176d0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
176e0 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
176f0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
17700 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
17710 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17720 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
17730 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
17740 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
17750 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
17760 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
17770 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
17780 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
17790 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
177a0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
177b0 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
177c0 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
177d0 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
177e0 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
177f0 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
17800 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
17810 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
17820 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
17830 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
17840 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
17850 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
17860 74 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76  t afpCheckReserv
17870 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
17880 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
17890 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
178a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
178b0 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
178c0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
178d0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
178e0 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  )id;.  .  Simula
178f0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
17900 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
17910 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
17920 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
17930 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 66 70  ( pFile );.  afp
17940 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
17950 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
17960 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
17970 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
17980 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e  ntext;.  if( con
17990 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29  text->reserved )
179a0 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d  {.    *pResOut =
179b0 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
179c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
179d0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
179e0 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
179f0 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
17a00 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
17a10 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43  ads */.  .  /* C
17a20 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
17a30 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
17a40 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
17a50 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
17a60 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
17a70 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
17a80 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
17a90 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
17aa0 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
17ab0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
17ac0 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
17ad0 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73     */.  if( !res
17ae0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
17af0 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45  lock the RESERVE
17b00 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e  D byte */.    in
17b10 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f  t lrc = afpSetLo
17b20 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17b30 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
17b40 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20  VED_BYTE, 1,1); 
17b50 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45   .    if( SQLITE
17b60 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20  _OK==lrc ){.    
17b70 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65    /* if we succe
17b80 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74  eded in taking t
17b90 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
17ba0 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72  , unlock it to r
17bb0 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  estore.      ** 
17bc0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  the original sta
17bd0 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  te */.      lrc 
17be0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
17bf0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
17c00 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
17c10 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
17c20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a   else {.      /*
17c30 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f   if we failed to
17c40 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68   get the lock th
17c50 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  en someone else 
17c60 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a  must have it */.
17c70 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
17c80 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
17c90 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
17ca0 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63  lrc) ){.      rc
17cb0 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =lrc;.    }.  }.
17cc0 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
17cd0 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
17ce0 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
17cf0 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e  %d %d %d (afp)\n
17d00 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
17d10 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a   reserved));.  .
17d20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
17d30 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
17d40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
17d50 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
17d60 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
17d70 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
17d80 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
17d90 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
17da0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
17db0 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
17dc0 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
17dd0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
17de0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
17df0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
17e00 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
17e10 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
17e20 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
17e30 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
17e40 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
17e50 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
17e60 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
17e70 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
17e80 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
17e90 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
17ea0 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
17eb0 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
17ec0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
17ed0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
17ee0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
17ef0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
17f00 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
17f10 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
17f20 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
17f30 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
17f40 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
17f50 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
17f60 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
17f70 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
17f80 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
17f90 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
17fa0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
17fb0 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
17fc0 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
17fd0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
17fe0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
17ff0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
18000 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
18010 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
18020 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
18030 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
18040 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
18050 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
18060 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
18070 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71  c int afpLock(sq
18080 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
18090 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
180a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
180b0 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
180c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
180d0 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
180e0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
180f0 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
18100 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
18110 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
18120 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
18130 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
18140 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
18150 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
18160 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
18170 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
18180 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
18190 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
181a0 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
181b0 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
181c0 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c  leLock), azFileL
181d0 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ock(pFile->eFile
181e0 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20  Lock),.         
181f0 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e    azFileLock(pIn
18200 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ode->eFileLock),
18210 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18220 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a   , getpid()));..
18230 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
18240 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
18250 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
18260 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
18270 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
18280 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
18290 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
182a0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65   afp_end_lock: e
182b0 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
182c0 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
182d0 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
182e0 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
182f0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
18300 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
18310 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
18320 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
18330 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
18340 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  d) (afp)\n", pFi
18350 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
18360 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
18370 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72  leLock)));.    r
18380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18390 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
183a0 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
183b0 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
183c0 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57  rect.  **  (1) W
183d0 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f  e never move fro
183e0 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e  m unlocked to an
183f0 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68  ything higher th
18400 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a  an shared lock..
18410 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65    **  (2) SQLite
18420 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c   never explicitl
18430 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e  y requests a pen
18440 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  dig lock..  **  
18450 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63  (3) A shared loc
18460 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  k is always held
18470 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20   when a reserve 
18480 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
18490 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
184a0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
184b0 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck!=NO_LOCK || e
184c0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
184d0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
184e0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45  t( eFileLock!=PE
184f0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
18500 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
18510 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k!=RESERVED_LOCK
18520 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   || pFile->eFile
18530 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
18540 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  K );.  .  /* Thi
18550 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
18560 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
18570 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
18580 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
18590 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
185a0 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
185b0 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
185c0 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  de;..  /* If som
185d0 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
185e0 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
185f0 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
18600 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a  nt unixFile*.  *
18610 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72  * handle that pr
18620 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75  ecludes the requ
18630 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75  ested lock, retu
18640 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  rn BUSY..  */.  
18650 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  if( (pFile->eFil
18660 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65  eLock!=pInode->e
18670 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20  FileLock && .   
18680 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
18690 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
186a0 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
186b0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a  k>SHARED_LOCK)).
186c0 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d       ){.    rc =
186d0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
186e0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
186f0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
18700 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
18710 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
18720 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
18730 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
18740 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
18750 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
18760 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
18770 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
18780 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
18790 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
187a0 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
187b0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
187c0 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
187d0 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
187e0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
187f0 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c   || pInode->eFil
18800 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
18810 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
18820 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
18830 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
18840 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
18850 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
18860 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
18870 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20  node->nShared>0 
18880 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  );.    pFile->eF
18890 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
188a0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
188b0 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20  e->nShared++;.  
188c0 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
188d0 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  +;.    goto afp_
188e0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
188f0 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e    .  /* A PENDIN
18900 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
18910 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
18920 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
18930 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
18940 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
18950 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
18960 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
18970 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
18980 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
18990 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ased..  */.  if(
189a0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
189b0 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
189c0 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  | (eFileLock==EX
189d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
189e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
189f0 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
18a00 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   ){.    int fail
18a10 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d  ed;.    failed =
18a20 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
18a30 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
18a40 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
18a50 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20  , 1, 1);.    if 
18a60 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  (failed) {.     
18a70 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
18a80 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
18a90 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
18aa0 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  .  .  /* If cont
18ab0 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
18ac0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
18ad0 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
18ae0 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
18af0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
18b00 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
18b10 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
18b20 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
18b30 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
18b40 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c  .    int lrc1, l
18b50 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 3b 0a  rc2, lrc1Errno;.
18b60 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73      long lk, mas
18b70 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65  k;.    .    asse
18b80 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
18b90 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  red==0 );.    as
18ba0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
18bb0 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
18bc0 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20        .    mask 
18bd0 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d  = (sizeof(long)=
18be0 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e  =8) ? LARGEST_IN
18bf0 54 36 34 20 3a 20 30 78 37 66 66 66 66 66 66 66  T64 : 0x7fffffff
18c00 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74  ;.    /* Now get
18c10 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53   the read-lock S
18c20 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20  HARED_LOCK */.  
18c30 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74    /* note that t
18c40 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68  he quality of th
18c50 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65  e randomness doe
18c60 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74  sn't matter that
18c70 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20   much */.    lk 
18c80 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20  = random(); .   
18c90 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
18ca0 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b  yte = (lk & mask
18cb0 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d  )%(SHARED_SIZE -
18cc0 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20   1);.    lrc1 = 
18cd0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18ce0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18cf0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 48  e, .          SH
18d00 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
18d10 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
18d20 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53  , 1);.    if( IS
18d30 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
18d40 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45  ) ){.      lrc1E
18d50 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61  rrno = pFile->la
18d60 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20  stErrno;.    }. 
18d70 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
18d80 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
18d90 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63   lock */.    lrc
18da0 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
18db0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
18dc0 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
18dd0 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
18de0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
18df0 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b  _ERROR(lrc1) ) {
18e00 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
18e10 73 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72  stErrno = lrc1Er
18e20 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
18e30 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f  lrc1;.      goto
18e40 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
18e50 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53     } else if( IS
18e60 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32  _LOCK_ERROR(lrc2
18e70 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
18e80 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f  lrc2;.      goto
18e90 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
18ea0 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72     } else if( lr
18eb0 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  c1 != SQLITE_OK 
18ec0 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  ) {.      rc = l
18ed0 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rc1;.    } else 
18ee0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  {.      pFile->e
18ef0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
18f00 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49  D_LOCK;.      pI
18f10 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
18f20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68       pInode->nSh
18f30 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ared = 1;.    }.
18f40 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
18f50 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
18f60 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d  _LOCK && pInode-
18f70 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20  >nShared>1 ){.  
18f80 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
18f90 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
18fa0 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
18fb0 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
18fc0 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65  his.     ** same
18fd0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
18fe0 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
18ff0 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
19000 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
19010 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
19020 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
19030 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
19040 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
19050 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
19060 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
19070 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
19080 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
19090 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
190a0 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
190b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   */.    int fail
190c0 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ed = 0;.    asse
190d0 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46  rt( 0!=pFile->eF
190e0 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69  ileLock );.    i
190f0 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20  f (eFileLock >= 
19100 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
19110 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
19120 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  k < RESERVED_LOC
19130 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K) {.        /* 
19140 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
19150 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ED lock */.     
19160 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
19170 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
19180 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
19190 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
191a0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66  1);.      if( !f
191b0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
191c0 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
191d0 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ed = 1;.      }.
191e0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66      }.    if (!f
191f0 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f  ailed && eFileLo
19200 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f  ck == EXCLUSIVE_
19210 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a  LOCK) {.      /*
19220 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c   Acquire an EXCL
19230 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20  USIVE lock */.  
19240 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
19250 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65  Remove the share
19260 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72  d lock before tr
19270 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20  ying the range. 
19280 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a   we'll need to .
19290 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62        ** reestab
192a0 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
192b0 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74  lock if we can't
192c0 20 67 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c   get the  afpUnl
192d0 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ock.      */.   
192e0 20 20 20 69 66 28 20 21 28 66 61 69 6c 65 64 20     if( !(failed 
192f0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
19300 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
19310 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
19320 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  T +.            
19330 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
19340 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c  ode->sharedByte,
19350 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20   1, 0)) ){.     
19360 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d     int failed2 =
19370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
19380 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d      /* now attem
19390 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 65  mpt to get the e
193a0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61  xclusive lock ra
193b0 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  nge */.        f
193c0 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
193d0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
193e0 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
193f0 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20  D_FIRST, .      
19400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19410 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
19420 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20  SIZE, 1);.      
19430 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26 20    if( failed && 
19440 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65  (failed2 = afpSe
19450 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
19460 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  bPath, pFile, . 
19470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19480 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
19490 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61  ST + pInode->sha
194a0 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20  redByte, 1, 1)) 
194b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
194c0 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73  Can't reestablis
194d0 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
194e0 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74  k.  Sqlite can't
194f0 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20   deal, this is. 
19500 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72           ** a cr
19510 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72  itical I/O error
19520 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
19530 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28 66          rc = ((f
19540 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49  ailed & SQLITE_I
19550 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
19560 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32  IOERR) ? failed2
19570 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   : .            
19580 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f     SQLITE_IOERR_
19590 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
195a0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
195b0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20  k;.        } .  
195c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
195d0 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20     rc = failed; 
195e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
195f0 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b     if( failed ){
19600 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
19610 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ed;.    }.  }.  
19620 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19630 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
19640 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
19650 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49  FileLock;.    pI
19660 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
19670 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
19680 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
19690 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
196a0 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
196b0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
196c0 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
196d0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
196e0 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
196f0 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f  .  }.  .afp_end_
19700 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
19710 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
19720 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
19730 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c   %s %s (afp)\n",
19740 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
19750 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
19760 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d  , .         rc==
19770 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
19780 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
19790 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
197a0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
197b0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
197c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
197d0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
197e0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
197f0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
19800 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
19810 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
19820 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
19830 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
19840 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
19850 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
19860 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
19870 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
19880 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
19890 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
198a0 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f  atic int afpUnlo
198b0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
198c0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
198d0 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
198e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
198f0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
19900 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
19910 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
19920 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63  pInode;.  afpLoc
19930 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
19940 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
19950 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
19960 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
19970 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68  xt;.  int skipSh
19980 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66  ared = 0;.#ifdef
19990 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
199a0 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  nt h = pFile->h;
199b0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
199c0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
199d0 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
199e0 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
199f0 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29  %d) pid=%d (afp)
19a00 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
19a10 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
19a20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
19a30 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
19a40 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  node->eFileLock,
19a50 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
19a60 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20  nShared,.       
19a70 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a      getpid()));.
19a80 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
19a90 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
19aa0 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
19ab0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
19ac0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
19ad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19ae0 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
19af0 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
19b00 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
19b10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
19b20 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29  de->nShared!=0 )
19b30 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
19b40 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
19b50 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
19b60 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
19b70 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46  eLock==pFile->eF
19b80 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53  ileLock );.    S
19b90 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
19ba0 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d  nign(1);.    Sim
19bb0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
19bc0 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c  (-1) ).    Simul
19bd0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
19be0 28 30 29 3b 0a 20 20 20 20 0a 23 69 66 6e 64 65  (0);.    .#ifnde
19bf0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  f NDEBUG.    /* 
19c00 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
19c10 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
19c20 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
19c30 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  an start.    ** 
19c40 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
19c50 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c  base file again,
19c60 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
19c70 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
19c80 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
19c90 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e  as updated if an
19ca0 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
19cb0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
19cc0 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  le changed.  If 
19cd0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
19ce0 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75  counter is not u
19cf0 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f  pdated,.    ** o
19d00 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
19d10 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
19d20 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c  e might not real
19d30 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ize that.    ** 
19d40 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  the file has cha
19d50 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d  nged and hence m
19d60 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f  ight not know to
19d70 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20   flush their.   
19d80 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20   ** cache.  The 
19d90 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63  use of a stale c
19da0 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f  ache can lead to
19db0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
19dc0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
19dd0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
19de0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30  inNormalWrite==0
19df0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
19e00 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d  File->dbUpdate==
19e10 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
19e20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
19e30 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Chng==1 );.    p
19e40 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
19e50 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ite = 0;.#endif.
19e60 20 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69      .    if( pFi
19e70 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  le->eFileLock==E
19e80 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
19e90 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
19ea0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
19eb0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
19ec0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41  HARED_FIRST, SHA
19ed0 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
19ee0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19ef0 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c  TE_OK && (eFileL
19f00 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
19f10 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   || pInode->nSha
19f20 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  red>1) ){.      
19f30 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74    /* only re-est
19f40 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
19f50 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73  d lock if necess
19f60 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ary */.        i
19f70 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  nt sharedLockByt
19f80 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
19f90 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
19fa0 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20  yte;.        rc 
19fb0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
19fc0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
19fd0 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42  ile, sharedLockB
19fe0 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  yte, 1, 1);.    
19ff0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1a000 20 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20     skipShared = 
1a010 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1a020 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1a030 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
1a040 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
1a050 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ING_LOCK ){.    
1a060 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
1a070 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
1a080 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
1a090 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  G_BYTE, 1, 0);. 
1a0a0 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63     } .    if( rc
1a0b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1a0c0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
1a0d0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
1a0e0 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72  & context->reser
1a0f0 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ved ){.      rc 
1a100 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
1a110 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
1a120 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
1a130 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  TE, 1, 0);.     
1a140 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20   if( !rc ){ .   
1a150 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65       context->re
1a160 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20  served = 0; .   
1a170 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1a180 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a190 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   && (eFileLock==
1a1a0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
1a1b0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
1a1c0 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  )){.      pInode
1a1d0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
1a1e0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
1a1f0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1a200 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c  QLITE_OK && eFil
1a210 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
1a220 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  {..    /* Decrem
1a230 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c  ent the shared l
1a240 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65  ock counter.  Re
1a250 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75  lease the lock u
1a260 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f  sing an.    ** O
1a270 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e  S call only when
1a280 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20   all threads in 
1a290 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73  this same proces
1a2a0 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a  s have released.
1a2b0 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e      ** the lock.
1a2c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69  .    */.    unsi
1a2d0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
1a2e0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
1a2f0 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
1a300 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b  ode->sharedByte;
1a310 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
1a320 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ared--;.    if( 
1a330 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
1a340 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75  =0 ){.      Simu
1a350 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1a360 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  n(1);.      Simu
1a370 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
1a380 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75  -1) ).      Simu
1a390 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1a3a0 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
1a3b0 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20  !skipShared ){. 
1a3c0 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
1a3d0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1a3e0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
1a3f0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
1a400 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1a410 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
1a420 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65         pInode->e
1a430 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
1a440 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  CK;.        pFil
1a450 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
1a460 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  O_LOCK;.      }.
1a470 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1a480 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a490 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
1a4a0 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65  ck--;.      asse
1a4b0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  rt( pInode->nLoc
1a4c0 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  k>=0 );.      if
1a4d0 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
1a4e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  =0 ){.        cl
1a4f0 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
1a500 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ile);.      }.  
1a510 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69    }.  }.  .  uni
1a520 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
1a530 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a540 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c  OK ) pFile->eFil
1a550 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
1a560 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k;.  return rc;.
1a570 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1a580 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20   file & cleanup 
1a590 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63  AFP specific loc
1a5a0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f  king context .*/
1a5b0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
1a5c0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
1a5d0 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
1a5e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a5f0 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
1a600 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1a610 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1a620 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64      afpUnlock(id
1a630 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
1a640 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1a650 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
1a660 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65  >pInode && pFile
1a670 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20  ->pInode->nLock 
1a680 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1a690 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
1a6a0 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
1a6b0 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
1a6c0 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
1a6d0 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63        ** yet bec
1a6e0 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
1a6f0 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
1a700 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
1a710 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
1a720 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  ** descriptor to
1a730 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e   pInode->aPendin
1a740 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  g.  It will be a
1a750 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
1a760 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  sed when.      *
1a770 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  * the last lock 
1a780 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
1a790 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65    */.      setPe
1a7a0 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a  ndingFd(pFile);.
1a7b0 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
1a7c0 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65  eInodeInfo(pFile
1a7d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1a7e0 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ree(pFile->locki
1a7f0 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
1a800 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
1a810 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78  le(id);.    unix
1a820 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
1a830 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a840 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
1a850 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
1a860 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1a870 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
1a880 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  ./*.** The code 
1a890 61 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50  above is the AFP
1a8a0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
1a8b0 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20  tion.  The code 
1a8c0 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74  is specific.** t
1a8d0 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65  o MacOSX and doe
1a8e0 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74  s not work on ot
1a8f0 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72  her unix platfor
1a900 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74  ms.  No alternat
1a910 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  ive.** is availa
1a920 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e  ble.  If you don
1a930 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61  't compile for a
1a940 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22   mac, then the "
1a950 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53  unix-afp".** VFS
1a960 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
1a970 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
1a980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
1a990 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  of the AFP lock 
1a9a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
1a9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9c0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
1a9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa10 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
1aa20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa60 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
1aa70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa80 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63  ** Begin NFS Loc
1aa90 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
1aaa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aab0 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  *****/..#if defi
1aac0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
1aad0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1aae0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
1aaf0 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  . ** Lower the l
1ab00 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
1ab10 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1ab20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
1ab30 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20  ck.  eFileLock. 
1ab40 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
1ab50 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
1ab60 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a  RED_LOCK.. **. *
1ab70 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
1ab80 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
1ab90 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
1aba0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
1abb0 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71  elow. ** the req
1abc0 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
1abd0 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
1abe0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ne is a no-op.. 
1abf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66  */.static int nf
1ac00 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  sUnlock(sqlite3_
1ac10 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
1ac20 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75  ileLock){.  retu
1ac30 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69  rn posixUnlock(i
1ac40 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29  d, eFileLock, 1)
1ac50 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
1ac60 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1ac70 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
1ac80 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1ac90 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
1aca0 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
1acb0 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
1acc0 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
1acd0 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
1ace0 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
1acf0 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
1ad00 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
1ad10 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
1ad20 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
1ad30 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a  ilable.  .**.***
1ad40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad50 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46  ** End of the NF
1ad60 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  S lock implement
1ad70 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
1ad80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
1ad90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ada0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1adb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1adc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1add0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
1ade0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1adf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1ae30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
1ae40 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74  on-locking sqlit
1ae50 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20  e3_file methods 
1ae60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1ae80 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76  .** The next div
1ae90 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69  ision contains i
1aea0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66  mplementations f
1aeb0 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f  or all methods o
1aec0 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  f the .** sqlite
1aed0 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74  3_file object ot
1aee0 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63  her than the loc
1aef0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54  king methods.  T
1af00 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65  he locking.** me
1af10 74 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e  thods were defin
1af20 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20  ed in divisions 
1af30 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69  above (one locki
1af40 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a  ng method per.**
1af50 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f   division).  Tho
1af60 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  se methods that 
1af70 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  are common to al
1af80 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a  l locking modes.
1af90 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f  ** are gather to
1afa0 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73  gether into this
1afb0 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f   division..*/../
1afc0 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
1afd0 20 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61   offset passed a
1afe0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
1aff0 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64  ument, then read
1b000 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69   cnt .** bytes i
1b010 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e  nto pBuf. Return
1b020 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1b030 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
1b040 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49  ad..**.** NB:  I
1b050 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45  f you define USE
1b060 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52  _PREAD or USE_PR
1b070 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d  EAD64, then it m
1b080 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20  ight also.** be 
1b090 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66  necessary to def
1b0a0 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43  ine _XOPEN_SOURC
1b0b0 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68  E to be 500.  Th
1b0c0 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a  is varies from.*
1b0d0 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20  * one system to 
1b0e0 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20  another.  Since 
1b0f0 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20  SQLite does not 
1b100 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
1b110 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d  .** any any form
1b120 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20   by default, we 
1b130 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74  will not attempt
1b140 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
1b150 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65  N_SOURCE..** See
1b160 20 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61   tickets #2741 a
1b170 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20  nd #2681..**.** 
1b180 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
1b190 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
1b1a0 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65  e on a failed re
1b1b0 61 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  ad the lastErrno
1b1c0 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
1b1d0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1b1e0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1b1f0 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69   seekAndRead(uni
1b200 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  xFile *id, sqlit
1b210 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c  e3_int64 offset,
1b220 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
1b230 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
1b240 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  ;.#if (!defined(
1b250 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64  USE_PREAD) && !d
1b260 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1b270 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66  64)).  i64 newOf
1b280 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54  fset;.#endif.  T
1b290 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20  IMER_START;.#if 
1b2a0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
1b2b0 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f  D).  do{ got = o
1b2c0 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  sPread(id->h, pB
1b2d0 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
1b2e0 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  ; }while( got<0 
1b2f0 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
1b300 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1b310 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
1b320 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1b330 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64  USE_PREAD64).  d
1b340 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64  o{ got = osPread
1b350 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  64(id->h, pBuf, 
1b360 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77  cnt, offset); }w
1b370 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
1b380 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 20 20  rrno==EINTR);.  
1b390 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1b3a0 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
1b3b0 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  se.  newOffset =
1b3c0 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
1b3d0 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
1b3e0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1b3f0 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20  or( newOffset-- 
1b400 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73  );.  if( newOffs
1b410 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20  et!=offset ){.  
1b420 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20    if( newOffset 
1b430 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28  == -1 ){.      (
1b440 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1b450 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1b460 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  o;.    }else{.  
1b470 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1b480 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
1b490 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20   0;....    }.   
1b4a0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
1b4b0 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65    do{ got = osRe
1b4c0 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
1b4d0 63 6e 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f  cnt); }while( go
1b4e0 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
1b4f0 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NTR );.#endif.  
1b500 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28  TIMER_END;.  if(
1b510 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28   got<0 ){.    ((
1b520 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
1b530 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1b540 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
1b550 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
1b560 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1b570 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66  , id->h, got, of
1b580 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50  fset, TIMER_ELAP
1b590 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  SED));.  return 
1b5a0 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  got;.}../*.** Re
1b5b0 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
1b5c0 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
1b5d0 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
1b5e0 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
1b5f0 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
1b600 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
1b610 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
1b620 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
1b630 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
1b640 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a  c int unixRead(.
1b650 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1b660 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75  id, .  void *pBu
1b670 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
1b680 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1b690 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46  ffset.){.  unixF
1b6a0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1b6b0 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69  ixFile *)id;.  i
1b6c0 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  nt got;.  assert
1b6d0 28 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ( id );..  /* If
1b6e0 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
1b6f0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
1b700 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
1b710 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
1b720 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
1b730 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
1b740 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
1b750 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
1b760 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
1b770 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
1b780 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
1b790 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1b7a0 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
1b7b0 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
1b7c0 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
1b7d0 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
1b7e0 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65  dif..  got = see
1b7f0 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
1b800 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
1b810 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61  t);.  if( got==a
1b820 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
1b830 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
1b840 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  lse if( got<0 ){
1b850 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e  .    /* lastErrn
1b860 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
1b870 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75  Read */.    retu
1b880 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1b890 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
1b8a0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1b8b0 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
1b8c0 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
1b8d0 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  /.    /* Unread 
1b8e0 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
1b8f0 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
1b900 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
1b910 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
1b920 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
1b930 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
1b940 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1b950 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
1b960 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  }../*.** Seek to
1b970 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69   the offset in i
1b980 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72  d->offset then r
1b990 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e  ead cnt bytes in
1b9a0 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75  to pBuf..** Retu
1b9b0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1b9c0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
1b9d0 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68  read.  Update th
1b9e0 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  e offset..**.** 
1b9f0 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
1ba00 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
1ba10 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72  e on a failed wr
1ba20 69 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ite the lastErrn
1ba30 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
1ba40 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
1ba50 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1ba60 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
1ba70 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  nixFile *id, i64
1ba80 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76   offset, const v
1ba90 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
1baa0 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
1bab0 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53  #if (!defined(US
1bac0 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66  E_PREAD) && !def
1bad0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
1bae0 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  )).  i64 newOffs
1baf0 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  et;.#endif.  TIM
1bb00 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
1bb10 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
1bb20 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50  .  do{ got = osP
1bb30 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75  write(id->h, pBu
1bb40 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
1bb50 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26   }while( got<0 &
1bb60 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
1bb70 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1bb80 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64  USE_PREAD64).  d
1bb90 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74  o{ got = osPwrit
1bba0 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  e64(id->h, pBuf,
1bbb0 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 7d 77   cnt, offset);}w
1bbc0 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
1bbd0 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65  rrno==EINTR);.#e
1bbe0 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 6e 65  lse.  do{.    ne
1bbf0 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
1bc00 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53  id->h, offset, S
1bc10 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
1bc20 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e  mulateIOError( n
1bc30 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20  ewOffset-- );.  
1bc40 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
1bc50 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  =offset ){.     
1bc60 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d   if( newOffset =
1bc70 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
1bc80 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1bc90 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1bca0 6e 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  no;.      }else{
1bcb0 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46  .        ((unixF
1bcc0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
1bcd0 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20  rno = 0;....    
1bce0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1bcf0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67   -1;.    }.    g
1bd00 6f 74 20 3d 20 6f 73 57 72 69 74 65 28 69 64 2d  ot = osWrite(id-
1bd10 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
1bd20 20 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20    }while( got<0 
1bd30 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
1bd40 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  );.#endif.  TIME
1bd50 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74  R_END;.  if( got
1bd60 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  <0 ){.    ((unix
1bd70 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
1bd80 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1bd90 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57  }..  OSTRACE(("W
1bda0 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20  RITE   %-3d %5d 
1bdb0 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69  %7lld %llu\n", i
1bdc0 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65  d->h, got, offse
1bdd0 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44  t, TIMER_ELAPSED
1bde0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74  ));.  return got
1bdf0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
1be00 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
1be10 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
1be20 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1be30 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
1be40 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
1be50 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
1be60 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
1be70 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a   int unixWrite(.
1be80 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1be90 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  id, .  const voi
1bea0 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
1beb0 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
1bec0 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a  nt64 offset .){.
1bed0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1bee0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1bef0 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d  d;.  int wrote =
1bf00 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   0;.  assert( id
1bf10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
1bf20 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  t>0 );..  /* If 
1bf30 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
1bf40 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
1bf50 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
1bf60 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
1bf70 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
1bf80 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
1bf90 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
1bfa0 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
1bfb0 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
1bfc0 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
1bfd0 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a  ile->pUnused==0.
1bfe0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1bff0 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
1c000 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
1c010 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
1c020 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
1c030 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  if..#ifndef NDEB
1c040 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  UG.  /* If we ar
1c050 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
1c060 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
1c070 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
1c080 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f  posed to.  ** do
1c090 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1c0a0 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
1c0b0 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69  write to some fi
1c0c0 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a  le other than a.
1c0d0 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61    ** normal data
1c0e0 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e 20  base file) then 
1c0f0 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
1c100 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1c110 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e 67  e.  ** has chang
1c120 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
1c130 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1c140 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65 63  is modified, rec
1c150 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66 61  ord that.  ** fa
1c160 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  ct too..  */.  i
1c170 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  f( pFile->inNorm
1c180 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70  alWrite ){.    p
1c190 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
1c1a0 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61   1;  /* The data
1c1b0 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  base has been mo
1c1c0 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66  dified */.    if
1c1d0 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20  ( offset<=24 && 
1c1e0 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29  offset+amt>=27 )
1c1f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
1c200 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e        char oldCn
1c210 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d  tr[4];.      Sim
1c220 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1c230 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20  gn(1);.      rc 
1c240 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46  = seekAndRead(pF
1c250 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72  ile, 24, oldCntr
1c260 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  , 4);.      Simu
1c270 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1c280 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
1c290 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28  rc!=4 || memcmp(
1c2a0 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72  oldCntr, &((char
1c2b0 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65  *)pBuf)[24-offse
1c2c0 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20  t], 4)!=0 ){.   
1c2d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e       pFile->tran
1c2e0 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20  sCntrChng = 1;  
1c2f0 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
1c300 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63  on counter has c
1c310 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20  hanged */.      
1c320 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
1c330 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d 74  if..  while( amt
1c340 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73  >0 && (wrote = s
1c350 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
1c360 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c  e, offset, pBuf,
1c370 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20   amt))>0 ){.    
1c380 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20  amt -= wrote;.  
1c390 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74    offset += wrot
1c3a0 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28  e;.    pBuf = &(
1c3b0 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f  (char*)pBuf)[wro
1c3c0 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c  te];.  }.  Simul
1c3d0 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f  ateIOError(( wro
1c3e0 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29  te=(-1), amt=1 )
1c3f0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  );.  SimulateDis
1c400 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f  kfullError(( wro
1c410 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a  te=0, amt=1 ));.
1c420 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
1c430 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20      if( wrote<0 
1c440 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  && pFile->lastEr
1c450 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20  rno!=ENOSPC ){. 
1c460 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e       /* lastErrn
1c470 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
1c480 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72  Write */.      r
1c490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1c4a0 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  RR_WRITE;.    }e
1c4b0 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
1c4c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
1c4d0 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
1c4e0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
1c4f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1c500 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  LL;.    }.  }.. 
1c510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c520 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
1c530 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
1c540 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
1c550 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
1c560 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
1c570 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
1c580 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
1c590 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
1c5a0 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61   are occurring a
1c5b0 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
1c5c0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1c5d0 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
1c5e0 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
1c5f0 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
1c600 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
1c610 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20  We do not trust 
1c620 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69  systems to provi
1c630 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61  de a working fda
1c640 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20  tasync().  Some 
1c650 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f  do..** Others do
1c660 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65   no.  To be safe
1c670 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20  , we will stick 
1c680 77 69 74 68 20 74 68 65 20 28 73 6c 6f 77 65 72  with the (slower
1c690 29 20 66 73 79 6e 63 28 29 2e 0a 2a 2a 20 49 66  ) fsync()..** If
1c6a0 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79   you know that y
1c6b0 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20  our system does 
1c6c0 73 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e  support fdatasyn
1c6d0 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a  c() correctly,.*
1c6e0 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f  * then simply co
1c6f0 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61  mpile with -Dfda
1c700 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63  tasync=fdatasync
1c710 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
1c720 28 66 64 61 74 61 73 79 6e 63 29 20 26 26 20 21  (fdatasync) && !
1c730 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
1c740 5f 29 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74  _).# define fdat
1c750 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64  async fsync.#end
1c760 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  if../*.** Define
1c770 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1c780 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64  to 0 or 1 depend
1c790 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
1c7a0 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46  r not.** the F_F
1c7b0 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69  ULLFSYNC macro i
1c7c0 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55  s defined.  F_FU
1c7d0 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65  LLFSYNC is curre
1c7e0 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61  ntly.** only ava
1c7f0 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53  ilable on Mac OS
1c800 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f   X.  But that co
1c810 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23  uld change..*/.#
1c820 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e  ifdef F_FULLFSYN
1c830 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  C.# define HAVE_
1c840 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73  FULLFSYNC 1.#els
1c850 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  e.# define HAVE_
1c860 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64  FULLFSYNC 0.#end
1c870 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1c880 45 5f 55 53 45 5f 52 45 51 55 45 53 54 5f 46 55  E_USE_REQUEST_FU
1c890 4c 4c 46 53 59 4e 43 0a 23 69 6d 70 6f 72 74 20  LLFSYNC.#import 
1c8a0 3c 6e 6f 74 69 66 79 2e 68 3e 0a 23 69 6d 70 6f  <notify.h>.#impo
1c8b0 72 74 20 3c 6c 69 62 6b 65 72 6e 2f 4f 53 41 74  rt <libkern/OSAt
1c8c0 6f 6d 69 63 2e 68 3e 0a 73 74 61 74 69 63 20 4f  omic.h>.static O
1c8d0 53 53 70 69 6e 4c 6f 63 6b 20 6e 6f 74 69 66 79  SSpinLock notify
1c8e0 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 23 64 65 66 69  _lock = 0;.#defi
1c8f0 6e 65 20 52 45 51 55 45 53 54 5f 46 55 4c 4c 53  ne REQUEST_FULLS
1c900 59 4e 43 5f 4e 4f 54 49 46 49 43 41 54 49 4f 4e  YNC_NOTIFICATION
1c910 20 20 20 20 22 63 6f 6d 2e 61 70 70 6c 65 2e 72      "com.apple.r
1c920 65 71 73 79 6e 63 22 0a 23 65 6e 64 69 66 0a 0a  eqsync".#endif..
1c930 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28  /*.** The fsync(
1c940 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f  ) system call do
1c950 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61  es not work as a
1c960 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e  dvertised on man
1c970 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d  y.** unix system
1c980 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
1c990 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61  g procedure is a
1c9a0 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b  n attempt to mak
1c9b0 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74  e.** it work bet
1c9c0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ter..**.** The S
1c9d0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61  QLITE_NO_SYNC ma
1c9e0 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c  cro disables all
1c9f0 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73   fsync()s.  This
1ca00 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f   is useful.** fo
1ca10 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77  r testing when w
1ca20 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68  e want to run th
1ca30 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73  rough the test s
1ca40 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a  uite quickly..**
1ca50 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c   You are strongl
1ca60 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20  y advised *not* 
1ca70 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53  to deploy with S
1ca80 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a  QLITE_NO_SYNC.**
1ca90 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65   enabled, howeve
1caa0 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51  r, since with SQ
1cab0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61  LITE_NO_SYNC ena
1cac0 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73  bled, an OS cras
1cad0 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  h.** or power fa
1cae0 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c  ilure will likel
1caf0 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61  y corrupt the da
1cb00 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1cb10 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20 74  ** SQLite sets t
1cb20 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67  he dataOnly flag
1cb30 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   if the size of 
1cb40 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68  the file is unch
1cb50 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64  anged..** The id
1cb60 65 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e  ea behind dataOn
1cb70 6c 79 20 69 73 20 74 68 61 74 20 69 74 20 73 68  ly is that it sh
1cb80 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20  ould only write 
1cb90 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74  the file content
1cba0 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74  .** to disk, not
1cbb0 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20   the inode.  We 
1cbc0 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c  only set dataOnl
1cbd0 79 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 69  y if the file si
1cbe0 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e  ze is .** unchan
1cbf0 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 66 69  ged since the fi
1cc00 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72 74 20  le size is part 
1cc10 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48  of the inode.  H
1cc20 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20  owever, .** Ted 
1cc30 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68  Ts'o tells us th
1cc40 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77  at fdatasync() w
1cc50 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74  ill also write t
1cc60 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a  he inode if the.
1cc70 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73  ** file size has
1cc80 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f   changed.  The o
1cc90 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72 65  nly real differe
1cca0 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64 61 74  nce between fdat
1ccb0 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66  async().** and f
1ccc0 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c  sync(), Ted tell
1ccd0 73 20 75 73 2c 20 69 73 20 74 68 61 74 20 66 64  s us, is that fd
1cce0 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e  atasync() will n
1ccf0 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20  ot flush the.** 
1cd00 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69  inode if the mti
1cd10 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f  me or owner or o
1cd20 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69  ther inode attri
1cd30 62 75 74 65 73 20 68 61 76 65 20 63 68 61 6e 67  butes have chang
1cd40 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63  ed..** We only c
1cd50 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 66 69  are about the fi
1cd60 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65  le size, not the
1cd70 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74 72   other file attr
1cd80 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73  ibutes, so.** as
1cd90 20 66 61 72 20 61 73 20 53 51 4c 69 74 65 20 69   far as SQLite i
1cda0 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20  s concerned, an 
1cdb0 66 64 61 74 61 73 79 6e 63 28 29 20 69 73 20 61  fdatasync() is a
1cdc0 6c 77 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a  lways adequate..
1cdd0 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73  ** So, we always
1cde0 20 75 73 65 20 66 64 61 74 61 73 79 6e 63 28 29   use fdatasync()
1cdf0 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61   if it is availa
1ce00 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ble, regardless 
1ce10 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  of.** the value 
1ce20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  of the dataOnly 
1ce30 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  flag..*/.static 
1ce40 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69  int full_fsync(i
1ce50 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53  nt fd, int fullS
1ce60 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c  ync, int dataOnl
1ce70 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  y){.  int rc;.. 
1ce80 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1ce90 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c  g "ifdef/elif/el
1cea0 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74  se/" block has t
1ceb0 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75 72  he same structur
1cec0 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e  e as.  ** the on
1ced0 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72  e below. It is r
1cee0 65 70 6c 69 63 61 74 65 64 20 68 65 72 65 20 73  eplicated here s
1cef0 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63  olely to avoid c
1cf00 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20  luttering .  ** 
1cf10 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65  up the real code
1cf20 20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45 44   with the UNUSED
1cf30 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63  _PARAMETER() mac
1cf40 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ros..  */.#ifdef
1cf50 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
1cf60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1cf70 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44  ER(fd);.  UNUSED
1cf80 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53  _PARAMETER(fullS
1cf90 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ync);.  UNUSED_P
1cfa0 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
1cfb0 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46  y);.#elif HAVE_F
1cfc0 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45  ULLFSYNC.  UNUSE
1cfd0 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1cfe0 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55  Only);.#else.  U
1cff0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1d000 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55  fullSync);.  UNU
1d010 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
1d020 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a  taOnly);.#endif.
1d030 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
1d040 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
1d050 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f   that we do a no
1d060 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64  rmal fsync() and
1d070 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e   .  ** FULLSYNC.
1d080 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64    This is used d
1d090 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f  uring testing to
1d0a0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
1d0b0 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  s procedure.  **
1d0c0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74   gets called wit
1d0d0 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72  h the correct ar
1d0e0 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69  guments..  */.#i
1d0f0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1d100 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
1d110 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  ) sqlite3_fullsy
1d120 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71  nc_count++;.  sq
1d130 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
1d140 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ++;.#endif..  /*
1d150 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20   If we compiled 
1d160 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
1d170 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68  NO_SYNC flag, th
1d180 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a  en syncing is a.
1d190 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a    ** no-op.  */.
1d1a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
1d1b0 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c  _SYNC.  rc = SQL
1d1c0 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41  ITE_OK;.#elif HA
1d1d0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69  VE_FULLFSYNC.  i
1d1e0 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 23  f( fullSync ){.#
1d1f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
1d200 5f 52 45 51 55 45 53 54 5f 46 55 4c 4c 46 53 59  _REQUEST_FULLFSY
1d210 4e 43 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73  NC.    rc = osFs
1d220 79 6e 63 28 66 64 29 3b 0a 20 20 20 20 69 66 20  ync(fd);.    if 
1d230 28 21 72 63 29 20 7b 0a 20 20 20 20 20 20 4f 53  (!rc) {.      OS
1d240 53 70 69 6e 4c 6f 63 6b 4c 6f 63 6b 28 26 6e 6f  SpinLockLock(&no
1d250 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20 20  tify_lock);.    
1d260 20 20 72 63 20 3d 20 6e 6f 74 69 66 79 5f 70 6f    rc = notify_po
1d270 73 74 28 52 45 51 55 45 53 54 5f 46 55 4c 4c 53  st(REQUEST_FULLS
1d280 59 4e 43 5f 4e 4f 54 49 46 49 43 41 54 49 4f 4e  YNC_NOTIFICATION
1d290 29 3b 0a 20 20 20 20 20 20 4f 53 53 70 69 6e 4c  );.      OSSpinL
1d2a0 6f 63 6b 55 6e 6c 6f 63 6b 28 26 6e 6f 74 69 66  ockUnlock(&notif
1d2b0 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 23  y_lock);.    }.#
1d2c0 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 6f 73  else.    rc = os
1d2d0 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  Fcntl(fd, F_FULL
1d2e0 46 53 59 4e 43 2c 20 30 29 3b 0a 23 65 6e 64 69  FSYNC, 0);.#endi
1d2f0 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  f.  }else{.    r
1d300 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20  c = 1;.  }.  /* 
1d310 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43  If the FULLFSYNC
1d320 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61   failed, fall ba
1d330 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67  ck to attempting
1d340 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a   an fsync()..  *
1d350 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62  * It shouldn't b
1d360 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66  e possible for f
1d370 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c  ullfsync to fail
1d380 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20   on the local . 
1d390 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20   ** file system 
1d3a0 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69  (on OSX), so fai
1d3b0 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74  lure indicates t
1d3c0 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20  hat FULLFSYNC.  
1d3d0 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74  ** isn't support
1d3e0 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ed for this file
1d3f0 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74   system. So, att
1d400 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20  empt an fsync . 
1d410 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77   ** and (for now
1d420 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65  ) ignore the ove
1d430 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72  rhead of a super
1d440 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c  fluous fcntl cal
1d450 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62  l.  .  ** It'd b
1d460 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65  e better to dete
1d470 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70  ct fullfsync sup
1d480 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76  port once and av
1d490 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63  oid .  ** the fc
1d4a0 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74  ntl call every t
1d4b0 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c  ime sync is call
1d4c0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ed..  */.  if( r
1d4d0 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66  c ) rc = fsync(f
1d4e0 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e  d);..#elif defin
1d4f0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1d500 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f  /* fdatasync() o
1d510 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79  n HFS+ doesn't y
1d520 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c  et flush the fil
1d530 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61  e size if it cha
1d540 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  nged correctly. 
1d550 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79   ** so currently
1d560 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74   we default to t
1d570 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65  he macro that re
1d580 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e  defines fdatasyn
1d590 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a  c to fsync.  */.
1d5a0 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1d5b0 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20  ;.#else .  rc = 
1d5c0 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23  fdatasync(fd);.#
1d5d0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1d5e0 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72  if( rc==-1 && er
1d5f0 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a  rno==ENOTSUP ){.
1d600 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66      rc = fsync(f
1d610 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  d);.  }.#endif /
1d620 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1d630 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20  #endif /* ifdef 
1d640 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
1d650 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1d660 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f  NC */..  if( OS_
1d670 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20  VXWORKS && rc!= 
1d680 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  -1 ){.    rc = 0
1d690 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1d6a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
1d6b0 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
1d6c0 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  or to the direct
1d6d0 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66  ory containing f
1d6e0 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a  ile zFilename..*
1d6f0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1d700 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
1d710 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20  the opened file 
1d720 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a  descriptor and.*
1d730 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1d740 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
1d750 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74  rror occurs, eit
1d760 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  her SQLITE_NOMEM
1d770 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41  .** or SQLITE_CA
1d780 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e  NTOPEN is return
1d790 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73  ed and *pFd is s
1d7a0 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e  et to an undefin
1d7b0 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a  ed.** value..**.
1d7c0 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79  ** The directory
1d7d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1d7e0 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c   is used for onl
1d7f0 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f  y one thing - to
1d800 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69  .** fsync() a di
1d810 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20  rectory to make 
1d820 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69  sure file creati
1d830 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20  on and deletion 
1d840 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c  events.** are fl
1d850 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ushed to disk.  
1d860 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20  Such fsyncs are 
1d870 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65  not needed on ne
1d880 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e  wer.** journalin
1d890 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62  g filesystems, b
1d8a0 75 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ut are required 
1d8b0 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73  on older filesys
1d8c0 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tems..**.** This
1d8d0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1d8e0 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67  overridden using
1d8f0 20 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c   the xSetSysCall
1d900 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54   interface..** T
1d910 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76  he ability to ov
1d920 65 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74  erride this rout
1d930 69 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e  ine was added in
1d940 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a   support of the.
1d950 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64  ** chromium sand
1d960 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20  box.  Opening a 
1d970 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73  directory is a s
1d980 65 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65  ecurity risk (we
1d990 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f   are.** told) so
1d9a0 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72   making it overr
1d9b0 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74  ideable allows t
1d9c0 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64  he chromium sand
1d9d0 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63  box to.** replac
1d9e0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1d9f0 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e  ith a harmless n
1da00 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74  o-op.  To make t
1da10 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
1da20 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20   no-op, replace 
1da30 69 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74  it with a stub t
1da40 68 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49  hat returns SQLI
1da50 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73  TE_OK but leaves
1da60 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20  .** *pFd set to 
1da70 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
1da80 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  r..**.** If SQLI
1da90 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1daa0 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  d, the caller is
1dab0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1dac0 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20   closing.** the 
1dad0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1dae0 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65  *pFd using close
1daf0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1db00 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  t openDirectory(
1db10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1db20 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29  ename, int *pFd)
1db30 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
1db40 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61  t fd = -1;.  cha
1db50 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50  r zDirname[MAX_P
1db60 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73  ATHNAME+1];..  s
1db70 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1db80 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44  MAX_PATHNAME, zD
1db90 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46  irname, "%s", zF
1dba0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  ilename);.  for(
1dbb0 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  ii=(int)strlen(z
1dbc0 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26  Dirname); ii>1 &
1dbd0 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d  & zDirname[ii]!=
1dbe0 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66  '/'; ii--);.  if
1dbf0 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44  ( ii>0 ){.    zD
1dc00 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30  irname[ii] = '\0
1dc10 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ';.    fd = robu
1dc20 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65  st_open(zDirname
1dc30 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e  , O_RDONLY|O_BIN
1dc40 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ARY, 0);.    if(
1dc50 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66   fd>=0 ){.#ifdef
1dc60 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20   FD_CLOEXEC.    
1dc70 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
1dc80 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66  SETFD, osFcntl(f
1dc90 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c  d, F_GETFD, 0) |
1dca0 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65   FD_CLOEXEC);.#e
1dcb0 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41  ndif.      OSTRA
1dcc0 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE(("OPENDIR %-3
1dcd0 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69  d %s\n", fd, zDi
1dce0 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  rname));.    }. 
1dcf0 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a   }.  *pFd = fd;.
1dd00 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f    return (fd>=0?
1dd10 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f  SQLITE_OK:unixLo
1dd20 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
1dd30 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
1dd40 65 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b  en", zDirname));
1dd50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1dd60 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74  ure all writes t
1dd70 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66  o a particular f
1dd80 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65  ile are committe
1dd90 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
1dda0 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20   If dataOnly==0 
1ddb0 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69  then both the fi
1ddc0 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74  le itself and it
1ddd0 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65  s metadata (file
1dde0 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73  .** size, access
1ddf0 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20   time, etc) are 
1de00 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61  synced.  If data
1de10 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c  Only!=0 then onl
1de20 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61  y the.** file da
1de30 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  ta is synced..**
1de40 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20  .** Under Unix, 
1de50 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  also make sure t
1de60 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72  hat the director
1de70 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
1de80 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e  file.** has been
1de90 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e   created by fsyn
1dea0 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74  c-ing the direct
1deb0 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ory that contain
1dec0 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49  s the file..** I
1ded0 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74  f we do not do t
1dee0 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75  his and we encou
1def0 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69  nter a power fai
1df00 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74  lure, the direct
1df10 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72  ory.** entry for
1df20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
1df30 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74  ht not exist aft
1df40 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54  er we reboot.  T
1df50 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74  he next.** SQLit
1df60 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  e to access the 
1df70 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e  file will not kn
1df80 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ow that the jour
1df90 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61  nal exists (beca
1dfa0 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  use.** the direc
1dfb0 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74  tory entry for t
1dfc0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e  he journal was n
1dfd0 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e  ever created) an
1dfe0 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
1dff0 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f  n.** will not ro
1e000 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62  ll back - possib
1e010 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61  ly leading to da
1e020 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1e030 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1e040 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65   unixSync(sqlite
1e050 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
1e060 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63  flags){.  int rc
1e070 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
1e080 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
1e090 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61  )id;..  int isDa
1e0a0 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26  taOnly = (flags&
1e0b0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
1e0c0 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46  ONLY);.  int isF
1e0d0 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73  ullsync = (flags
1e0e0 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
1e0f0 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20  YNC_FULL;..  /* 
1e100 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f  Check that one o
1e110 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  f SQLITE_SYNC_NO
1e120 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73  RMAL or FULL was
1e130 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73   passed */.  ass
1e140 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29  ert((flags&0x0F)
1e150 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  ==SQLITE_SYNC_NO
1e160 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66  RMAL.      || (f
1e170 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1e180 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29  TE_SYNC_FULL.  )
1e190 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e  ;..  /* Unix can
1e1a0 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79  not, but some sy
1e1b0 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e  stems may return
1e1c0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f   SQLITE_FULL fro
1e1d0 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a  m here. This.  *
1e1e0 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73  * line is to tes
1e1f0 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20  t that doing so 
1e200 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61  does not cause a
1e210 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
1e220 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  /.  SimulateDisk
1e230 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72  fullError( retur
1e240 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b  n SQLITE_FULL );
1e250 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
1e260 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
1e270 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22  "SYNC    %-3d\n"
1e280 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
1e290 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28  rc = full_fsync(
1e2a0 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c  pFile->h, isFull
1e2b0 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79  sync, isDataOnly
1e2c0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1e2d0 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
1e2e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46  if( rc ){.    pF
1e2f0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1e300 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75   errno;.    retu
1e310 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1e320 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
1e330 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22  NC, "full_fsync"
1e340 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1e350 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20  .  }..  /* Also 
1e360 66 73 79 6e 63 20 74 68 65 20 64 69 72 65 63 74  fsync the direct
1e370 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
1e380 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 20 44  he file if the D
1e390 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a  IRSYNC flag.  **
1e3a0 20 69 73 20 73 65 74 2e 20 20 54 68 69 73 20 69   is set.  This i
1e3b0 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63  s a one-time occ
1e3c0 75 72 72 61 6e 63 65 2e 20 20 4d 61 6e 79 20 73  urrance.  Many s
1e3d0 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c 65 73  ystems (examples
1e3e0 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72 65 20  : AIX).  ** are 
1e3f0 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e 63 20  unable to fsync 
1e400 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f 20  a directory, so 
1e410 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e  ignore errors on
1e420 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f   the fsync..  */
1e430 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74  .  if( pFile->ct
1e440 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
1e450 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20 20  LE_DIRSYNC ){.  
1e460 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20 20 20    int dirfd;.   
1e470 20 4f 53 54 52 41 43 45 28 28 22 44 49 52 53 59   OSTRACE(("DIRSY
1e480 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75 6c 6c  NC %s (have_full
1e490 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e  fsync=%d fullsyn
1e4a0 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  c=%d)\n", pFile-
1e4b0 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20  >zPath,.        
1e4c0 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59      HAVE_FULLFSY
1e4d0 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29  NC, isFullsync))
1e4e0 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65  ;.    rc = osOpe
1e4f0 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69 6c 65  nDirectory(pFile
1e500 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29  ->zPath, &dirfd)
1e510 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1e520 4c 49 54 45 5f 4f 4b 20 26 26 20 64 69 72 66 64  LITE_OK && dirfd
1e530 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 75 6c  >=0 ){.      ful
1e540 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30  l_fsync(dirfd, 0
1e550 2c 20 30 29 3b 0a 23 69 66 20 4f 53 43 4c 4f 53  , 0);.#if OSCLOS
1e560 45 5f 43 48 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f  E_CHECK_CLOSE_IO
1e570 45 52 52 0a 20 20 20 20 20 20 69 66 28 20 63 6c  ERR.      if( cl
1e580 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64  ose(pFile->dirfd
1e590 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
1e5a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1e5b0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
1e5c0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1e5d0 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  _DIR_CLOSE;.    
1e5e0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
1e5f0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
1e600 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e  le, dirfd, __LIN
1e610 45 5f 5f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  E__);.#endif.   
1e620 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
1e630 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
1e640 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1e650 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1e660 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1e670 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f  gs &= ~UNIXFILE_
1e680 44 49 52 53 59 4e 43 3b 0a 0a 20 20 7d 0a 20 20  DIRSYNC;..  }.  
1e690 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e6a0 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
1e6b0 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
1e6c0 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
1e6d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1e6e0 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
1e6f0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e  _file *id, i64 n
1e700 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c  Byte){.  unixFil
1e710 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1e720 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
1e730 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
1e740 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61  File );.  Simula
1e750 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
1e760 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  n SQLITE_IOERR_T
1e770 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a  RUNCATE );..  /*
1e780 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
1e790 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68   configured a ch
1e7a0 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69  unk-size for thi
1e7b0 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65  s file, truncate
1e7c0 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73   the.  ** file s
1e7d0 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73  o that it consis
1e7e0 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  ts of an integer
1e7f0 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b   number of chunk
1e800 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a  s (i.e. the.  **
1e810 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a   actual file siz
1e820 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72  e after the oper
1e830 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72  ation may be lar
1e840 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ger than the req
1e850 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65  uested.  ** size
1e860 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  )..  */.  if( pF
1e870 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a  ile->szChunk ){.
1e880 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
1e890 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
1e8a0 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
1e8b0 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
1e8c0 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
1e8d0 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  .  rc = robust_f
1e8e0 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
1e8f0 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29  h, (off_t)nByte)
1e900 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1e910 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1e920 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1e930 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1e940 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1e950 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
1e960 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
1e970 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
1e980 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1e990 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1e9a0 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77  doing a normal w
1e9b0 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61  rite to a databa
1e9c0 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f  se file (as oppo
1e9d0 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f  sed to.    ** do
1e9e0 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1e9f0 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
1ea00 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69  write to some fi
1ea10 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a  le other than a.
1ea20 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61      ** normal da
1ea30 74 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64  tabase file) and
1ea40 20 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65   we truncate the
1ea50 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
1ea60 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61  ngth,.    ** tha
1ea70 74 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70  t effectively up
1ea80 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
1ea90 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20   counter.  This 
1eaa0 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20  might happen.   
1eab0 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69   ** when restori
1eac0 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73  ng a database us
1ead0 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41  ing the backup A
1eae0 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c  PI from a zero-l
1eaf0 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75  ength.    ** sou
1eb00 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rce..    */.    
1eb10 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
1eb20 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74  malWrite && nByt
1eb30 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46  e==0 ){.      pF
1eb40 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
1eb50 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  ng = 1;.    }.#e
1eb60 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e  ndif..    return
1eb70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1eb80 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
1eb90 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
1eba0 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
1ebb0 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
1ebc0 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a   int unixFileSiz
1ebd0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1ebe0 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  id, i64 *pSize){
1ebf0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72  .  int rc;.  str
1ec00 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
1ec10 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
1ec20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75  rc = osFstat(((u
1ec30 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
1ec40 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61   &buf);.  Simula
1ec50 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1ec60 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
1ec70 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
1ec80 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
1ec90 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65   = errno;.    re
1eca0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1ecb0 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a  R_FSTAT;.  }.  *
1ecc0 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73  pSize = buf.st_s
1ecd0 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  ize;..  /* When 
1ece0 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73  opening a zero-s
1ecf0 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ize database, th
1ed00 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  e findInodeInfo(
1ed10 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  ) procedure.  **
1ed20 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65   writes a single
1ed30 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20   byte into that 
1ed40 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
1ed50 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62   work around a b
1ed60 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f  ug.  ** in the O
1ed70 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79  S-X msdos filesy
1ed80 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20  stem.  In order 
1ed90 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
1eda0 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a  s with upper.  *
1edb0 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65  * layers, we nee
1edc0 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73  d to report this
1edd0 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65   file size as ze
1ede0 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  ro even though i
1edf0 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79  t is.  ** really
1ee00 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32   1.   Ticket #32
1ee10 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a  60..  */.  if( *
1ee20 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a  pSize==1 ) *pSiz
1ee30 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72  e = 0;...  retur
1ee40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ee50 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1ee60 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1ee70 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
1ee80 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64  LE__)./*.** Hand
1ee90 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f  ler for proxy-lo
1eea0 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72  cking file-contr
1eeb0 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e  ol verbs.  Defin
1eec0 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a  ed below in the.
1eed0 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b  ** proxying lock
1eee0 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f  ing division..*/
1eef0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
1ef00 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  yFileControl(sql
1ef10 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76  ite3_file*,int,v
1ef20 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  oid*);.#endif../
1ef30 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  * .** This funct
1ef40 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1ef50 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51 4c 49   handle the SQLI
1ef60 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
1ef70 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74  NT .** file-cont
1ef80 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  rol operation..*
1ef90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72  *.** If the user
1efa0 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
1efb0 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
1efc0 20 74 68 69 73 20 66 69 6c 65 2c 20 69 74 20 63   this file, it c
1efd0 6f 75 6c 64 20 62 65 0a 2a 2a 20 74 68 61 74 20  ould be.** that 
1efe0 74 68 65 20 66 69 6c 65 20 6e 65 65 64 73 20 74  the file needs t
1eff0 6f 20 62 65 20 65 78 74 65 6e 64 65 64 20 61 74  o be extended at
1f000 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 4f 74 68   this point. Oth
1f010 65 72 77 69 73 65 2c 20 74 68 65 0a 2a 2a 20 53  erwise, the.** S
1f020 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
1f030 5f 48 49 4e 54 20 6f 70 65 72 61 74 69 6f 6e 20  _HINT operation 
1f040 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 55  is a no-op for U
1f050 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nix..*/.static i
1f060 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74  nt fcntlSizeHint
1f070 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
1f080 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
1f090 7b 20 2f 2a 20 70 72 65 73 65 72 76 65 20 69 6e  { /* preserve in
1f0a0 64 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 65 6d  dentation of rem
1f0b0 6f 76 65 64 20 22 69 66 22 20 2a 2f 0a 20 20 20  oved "if" */.   
1f0c0 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20 20   i64 nSize;     
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f0e0 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c 65 20  * Required file 
1f0f0 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 36 34 20  size */.    i64 
1f100 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1f110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75            /* Chu
1f120 6e 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  nk size */.    s
1f130 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 20  truct stat buf; 
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f150 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74  Used to hold ret
1f160 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73  urn values of fs
1f170 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20  tat() */.   .   
1f180 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 69   if( osFstat(pFi
1f190 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 20 72  le->h, &buf) ) r
1f1a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1f1b0 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20 73  RR_FSTAT;..    s
1f1c0 7a 43 68 75 6e 6b 20 3d 20 70 46 69 6c 65 2d 3e  zChunk = pFile->
1f1d0 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28  szChunk;.    if(
1f1e0 20 73 7a 43 68 75 6e 6b 3d 3d 30 20 29 7b 0a 20   szChunk==0 ){. 
1f1f0 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 42 79       nSize = nBy
1f200 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  te;.    }else{. 
1f210 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e       nSize = ((n
1f220 42 79 74 65 2b 73 7a 43 68 75 6e 6b 2d 31 29 20  Byte+szChunk-1) 
1f230 2f 20 73 7a 43 68 75 6e 6b 29 20 2a 20 73 7a 43  / szChunk) * szC
1f240 68 75 6e 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  hunk;.    }.    
1f250 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62  if( nSize>(i64)b
1f260 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23  uf.st_size ){..#
1f270 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
1f280 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
1f290 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
1f2a0 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f  ALLOCATE.      /
1f2b0 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77  * The code below
1f2c0 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65   is handling the
1f2d0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
1f2e0 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a   osFallocate() .
1f2f0 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74        ** correct
1f300 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ly. posix_falloc
1f310 61 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64  ate() is defined
1f320 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72   to "returns zer
1f330 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20  o on success, . 
1f340 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72       ** or an er
1f350 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66  ror number on  f
1f360 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65  ailure". See the
1f370 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74   manpage for det
1f380 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ails. */.      i
1f390 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f  nt err;.      do
1f3a0 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20  {.        err = 
1f3b0 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c  osFallocate(pFil
1f3c0 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a  e->h, buf.st_siz
1f3d0 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f  e, nSize-buf.st_
1f3e0 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68  size);.      }wh
1f3f0 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20  ile( err==EINTR 
1f400 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  );.      if( err
1f410 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1f420 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65  _IOERR_WRITE;.#e
1f430 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  lse.      /* If 
1f440 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20  the OS does not 
1f450 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  have posix_fallo
1f460 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e  cate(), fake it.
1f470 20 46 69 72 73 74 20 75 73 65 0a 20 20 20 20 20   First use.     
1f480 20 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29 20   ** ftruncate() 
1f490 74 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65 20  to set the file 
1f4a0 73 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74 65  size, then write
1f4b0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74   a single byte t
1f4c0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  o.      ** the l
1f4d0 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68  ast byte in each
1f4e0 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74 68   block within th
1f4f0 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f  e extended regio
1f500 6e 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a  n. This.      **
1f510 20 69 73 20 74 68 65 20 73 61 6d 65 20 74 65 63   is the same tec
1f520 68 6e 69 71 75 65 20 75 73 65 64 20 62 79 20 67  hnique used by g
1f530 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  libc to implemen
1f540 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  t posix_fallocat
1f550 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  e().      ** on 
1f560 73 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f 20  systems that do 
1f570 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20  not have a real 
1f580 66 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73 74  fallocate() syst
1f590 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a  em call..      *
1f5a0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b  /.      int nBlk
1f5b0 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a   = buf.st_blksiz
1f5c0 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74  e;  /* File-syst
1f5d0 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f  em block size */
1f5e0 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74  .      i64 iWrit
1f5f0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1f600 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65     /* Next offse
1f610 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  t to write to */
1f620 0a 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75  ..      if( robu
1f630 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69  st_ftruncate(pFi
1f640 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b  le->h, nSize) ){
1f650 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
1f660 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1f670 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
1f680 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1f690 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1f6a0 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
1f6b0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1f6c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f6d0 69 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e 73  iWrite = ((buf.s
1f6e0 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20  t_size + 2*nBlk 
1f6f0 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d  - 1)/nBlk)*nBlk-
1f700 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  1;.      while( 
1f710 69 57 72 69 74 65 3c 6e 53 69 7a 65 20 29 7b 0a  iWrite<nSize ){.
1f720 20 20 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69          int nWri
1f730 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1f740 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c  e(pFile, iWrite,
1f750 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   "", 1);.       
1f760 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29   if( nWrite!=1 )
1f770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1f780 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
1f790 20 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e 42      iWrite += nB
1f7a0 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  lk;.      }.#end
1f7b0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
1f7c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f7d0 3b 0a 7d 0a 0a 23 69 66 20 28 53 51 4c 49 54 45  ;.}..#if (SQLITE
1f7e0 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50  _ENABLE_APPLE_SP
1f7f0 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28  I>0) && defined(
1f800 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 69 6e 63 6c  __APPLE__).#incl
1f810 75 64 65 20 22 73 71 6c 69 74 65 33 5f 70 72 69  ude "sqlite3_pri
1f820 76 61 74 65 2e 68 22 0a 23 69 6e 63 6c 75 64 65  vate.h".#include
1f830 20 3c 63 6f 70 79 66 69 6c 65 2e 68 3e 0a 73 74   <copyfile.h>.st
1f840 61 74 69 63 20 69 6e 74 20 67 65 74 44 62 50 61  atic int getDbPa
1f850 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e  thForUnixFile(un
1f860 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63  ixFile *pFile, c
1f870 68 61 72 20 2a 64 62 50 61 74 68 29 3b 0a 23 65  har *dbPath);.#e
1f880 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20  ndif.static int 
1f890 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f  isProxyLockingMo
1f8a0 64 65 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a  de(unixFile *);.
1f8b0 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
1f8c0 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f  on and control o
1f8d0 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68  f an open file h
1f8e0 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
1f8f0 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e   int unixFileCon
1f900 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
1f910 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
1f920 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e  oid *pArg){.  un
1f930 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1f940 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1f950 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1f960 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1f970 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
1f980 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1f990 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69  Arg = pFile->eFi
1f9a0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65  leLock;.      re
1f9b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f9c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1f9d0 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
1f9e0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
1f9f0 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c  )pArg = pFile->l
1fa00 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
1fa10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1fa20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1fa30 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
1fa40 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
1fa50 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
1fa60 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
1fa70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1fa80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1fa90 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1faa0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
1fab0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
1fac0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1fad0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1fae0 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c        rc = fcntl
1faf0 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20  SizeHint(pFile, 
1fb00 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20  *(i64 *)pArg);. 
1fb10 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1fb20 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1fb30 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1fb40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1fb50 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
1fb60 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
1fb70 20 69 6e 74 20 62 50 65 72 73 69 73 74 20 3d 20   int bPersist = 
1fb80 2a 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20  *(int*)pArg;.   
1fb90 20 20 20 69 66 28 20 62 50 65 72 73 69 73 74 3c     if( bPersist<
1fba0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 69  0 ){.        *(i
1fbb0 6e 74 2a 29 70 41 72 67 20 3d 20 28 70 46 69 6c  nt*)pArg = (pFil
1fbc0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
1fbd0 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  NIXFILE_PERSIST_
1fbe0 57 41 4c 29 21 3d 30 3b 0a 20 20 20 20 20 20 7d  WAL)!=0;.      }
1fbf0 65 6c 73 65 20 69 66 28 20 62 50 65 72 73 69 73  else if( bPersis
1fc00 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1fc10 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1fc20 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 50 45   &= ~UNIXFILE_PE
1fc30 52 53 49 53 54 5f 57 41 4c 3b 0a 20 20 20 20 20  RSIST_WAL;.     
1fc40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fc50 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1fc60 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 45 52   |= UNIXFILE_PER
1fc70 53 49 53 54 5f 57 41 4c 3b 0a 20 20 20 20 20 20  SIST_WAL;.      
1fc80 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
1fc90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1fca0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1fcb0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
1fcc0 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f  calls this metho
1fcd0 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74  d to signal that
1fce0 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20   it has done.   
1fcf0 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61   ** a rollback a
1fd00 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61  nd that the data
1fd10 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f 72  base is therefor
1fd20 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a  e unchanged and.
1fd30 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20      ** it hence 
1fd40 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65  it is OK for the
1fd50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61   transaction cha
1fd60 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62  nge counter to b
1fd70 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67  e.    ** unchang
1fd80 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ed..    */.    c
1fd90 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1fda0 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b  _DB_UNCHANGED: {
1fdb0 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
1fdc0 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65  e*)id)->dbUpdate
1fdd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
1fde0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1fdf0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53    }.#endif.#if S
1fe00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1fe10 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1fe20 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1fe30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1fe40 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
1fe50 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  LE:.    case SQL
1fe60 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
1fe70 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72  YFILE: {.      r
1fe80 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43  eturn proxyFileC
1fe90 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72  ontrol(id,op,pAr
1fea0 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  g);.    }.#endif
1feb0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
1fec0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1fed0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
1fee0 4c 45 5f 5f 29 20 2a 2f 0a 23 69 66 20 28 53 51  LE__) */.#if (SQ
1fef0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c  LITE_ENABLE_APPL
1ff00 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69  E_SPI>0) && defi
1ff10 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1ff20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1ff30 52 55 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45  RUNCATE_DATABASE
1ff40 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69  : {.      unixFi
1ff50 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1ff60 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20  xFile*)id;.     
1ff70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ff80 5f 4f 4b 3b 0a 20 20 20 20 20 20 76 6f 69 64 20  _OK;.      void 
1ff90 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20  *pLock = NULL;. 
1ffa0 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
1ffb0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f   0;.      int co
1ffc0 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b 20 3d 20  rruptFileLock = 
1ffd0 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 43  0;.      int isC
1ffe0 6f 72 72 75 70 74 20 3d 20 30 3b 0a 0a 23 69 66  orrupt = 0;..#if
1fff0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
20000 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
20010 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 70 46       flags |= pF
20020 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b 0a  ile->protFlags;.
20030 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
20040 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
20050 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28  _STYLE.      if(
20060 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d   isProxyLockingM
20070 6f 64 65 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  ode(pFile) ){.  
20080 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
20090 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
200a0 52 4f 58 59 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ROXY;.      }.#e
200b0 6e 64 69 66 0a 20 20 20 20 20 20 0a 20 20 20 20  ndif.      .    
200c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65    rc = sqlite3de
200d0 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 70 46 69  mo_superlock(pFi
200e0 6c 65 2d 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c  le->zPath, 0, fl
200f0 61 67 73 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63  ags, 0, 0, &pLoc
20100 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
20110 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
20120 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  rc==SQLITE_CORRU
20130 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  PT || rc==SQLITE
20140 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20 20 20 20  _NOTADB ){.     
20150 20 20 20 20 20 69 73 43 6f 72 72 75 70 74 20 3d       isCorrupt =
20160 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   1;.          rc
20170 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73   = sqlite3demo_s
20180 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74  uperlock_corrupt
20190 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  (id, SQLITE_LOCK
201a0 5f 45 58 43 4c 55 53 49 56 45 2c 20 26 63 6f 72  _EXCLUSIVE, &cor
201b0 72 75 70 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  ruptFileLock);. 
201c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
201d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
201e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
201f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20200 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 46 69  }.      rc = pFi
20210 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 54 72  le->pMethod->xTr
20220 75 6e 63 61 74 65 28 69 64 2c 20 28 28 70 46 69  uncate(id, ((pFi
20230 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51  le->fsFlags & SQ
20240 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
20250 4d 53 44 4f 53 29 20 21 3d 20 30 29 20 3f 20 31  MSDOS) != 0) ? 1
20260 4c 20 3a 20 30 4c 29 3b 0a 0a 20 20 20 20 20 20  L : 0L);..      
20270 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20280 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  K ){.        cha
20290 72 20 6a 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  r jPath[MAXPATHL
202a0 45 4e 2b 39 5d 3b 0a 20 20 20 20 20 20 20 20 69  EN+9];.        i
202b0 6e 74 20 7a 4c 65 6e 20 3d 20 73 74 72 6c 63 70  nt zLen = strlcp
202c0 79 28 6a 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  y(jPath, pFile->
202d0 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  zPath, MAXPATHLE
202e0 4e 2b 39 29 3b 0a 20 20 20 20 20 20 20 20 69 66  N+9);.        if
202f0 28 20 7a 4c 65 6e 3c 4d 41 58 50 41 54 48 4c 45  ( zLen<MAXPATHLE
20300 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  N ){.          s
20310 69 7a 65 5f 74 20 6a 4c 65 6e 3b 0a 20 20 20 20  ize_t jLen;.    
20320 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
20330 20 65 78 74 65 6e 73 69 6f 6e 73 5b 32 5d 5b 39   extensions[2][9
20340 5d 20 3d 20 7b 20 22 2d 77 61 6c 22 2c 20 22 2d  ] = { "-wal", "-
20350 6a 6f 75 72 6e 61 6c 22 20 2f 2a 2c 20 22 2d 73  journal" /*, "-s
20360 68 6d 22 20 2a 2f 20 7d 3b 0a 20 20 20 20 20 20  hm" */ };.      
20370 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 0a 20      int j = 0;. 
20380 20 20 20 20 20 20 20 20 20 66 6f 72 28 20 6a 3d           for( j=
20390 30 3b 20 6a 3c 32 3b 20 6a 2b 2b 20 29 7b 0a 20  0; j<2; j++ ){. 
203a0 20 20 20 20 20 20 20 20 20 20 20 6a 4c 65 6e 20             jLen 
203b0 3d 20 73 74 72 6c 63 70 79 28 26 6a 50 61 74 68  = strlcpy(&jPath
203c0 5b 7a 4c 65 6e 5d 2c 20 65 78 74 65 6e 73 69 6f  [zLen], extensio
203d0 6e 73 5b 6a 5d 2c 20 39 29 3b 0a 20 20 20 20 20  ns[j], 9);.     
203e0 20 20 20 20 20 20 20 69 66 28 20 6a 4c 65 6e 20         if( jLen 
203f0 3c 20 39 20 29 7b 0a 20 20 20 20 20 20 20 20 20  < 9 ){.         
20400 20 20 20 20 20 69 6e 74 20 6a 66 64 20 3d 20 6f       int jfd = o
20410 70 65 6e 28 6a 50 61 74 68 2c 20 4f 5f 54 52 55  pen(jPath, O_TRU
20420 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NC);.           
20430 20 20 20 69 66 28 20 6a 66 64 3d 3d 28 2d 31 29     if( jfd==(-1)
20440 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20450 20 20 20 20 69 66 20 28 20 65 72 72 6e 6f 21 3d      if ( errno!=
20460 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20  ENOENT ){.      
20470 20 20 20 20 20 20 20 20 20 20 20 20 70 65 72 72              perr
20480 6f 72 28 6a 50 61 74 68 29 3b 0a 20 20 20 20 20  or(jPath);.     
20490 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
204a0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
204b0 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
204c0 20 20 20 20 66 73 79 6e 63 28 6a 66 64 29 3b 0a      fsync(jfd);.
204d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204e0 63 6c 6f 73 65 28 6a 66 64 29 3b 0a 20 20 20 20  close(jfd);.    
204f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20510 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
20520 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70          pFile->p
20530 4d 65 74 68 6f 64 2d 3e 78 53 79 6e 63 28 69 64  Method->xSync(id
20540 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  , SQLITE_SYNC_FU
20550 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
20560 20 20 20 69 66 28 20 69 73 43 6f 72 72 75 70 74     if( isCorrupt
20570 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20580 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
20590 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64 2c 20  ock_corrupt(id, 
205a0 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b 29  corruptFileLock)
205b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
205c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 64 65         sqlite3de
205d0 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70  mo_superunlock(p
205e0 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Lock);.      }. 
205f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20600 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
20610 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 50   case SQLITE_REP
20620 4c 41 43 45 5f 44 41 54 41 42 41 53 45 3a 20 7b  LACE_DATABASE: {
20630 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
20640 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
20650 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 73 71  le*)id;.      sq
20660 6c 69 74 65 33 20 2a 73 72 63 64 62 20 3d 20 28  lite3 *srcdb = (
20670 73 71 6c 69 74 65 33 20 2a 29 70 41 72 67 3b 0a  sqlite3 *)pArg;.
20680 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 53 72        Btree *pSr
20690 63 42 74 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a 20  cBtree = NULL;. 
206a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
206b0 65 20 2a 73 72 63 5f 66 69 6c 65 20 3d 20 4e 55  e *src_file = NU
206c0 4c 4c 3b 0a 20 20 20 20 20 20 75 6e 69 78 46 69  LL;.      unixFi
206d0 6c 65 20 2a 70 53 72 63 46 69 6c 65 20 3d 20 4e  le *pSrcFile = N
206e0 55 4c 4c 3b 0a 20 20 20 20 20 20 63 68 61 72 20  ULL;.      char 
206f0 73 72 63 57 61 6c 50 61 74 68 5b 4d 41 58 50 41  srcWalPath[MAXPA
20700 54 48 4c 45 4e 2b 35 5d 3b 0a 20 20 20 20 20 20  THLEN+5];.      
20710 69 6e 74 20 73 72 63 57 61 6c 46 44 20 3d 20 2d  int srcWalFD = -
20720 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  1;.      int rc 
20730 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
20740 20 20 20 76 6f 69 64 20 2a 70 4c 6f 63 6b 20 3d     void *pLock =
20750 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 69 6e 74   NULL;.      int
20760 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20   flags = 0;.    
20770 20 20 73 71 6c 69 74 65 33 20 2a 73 72 63 64 62    sqlite3 *srcdb
20780 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  2 = NULL;.      
20790 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 74  copyfile_state_t
207a0 20 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f   s;.      int co
207b0 72 72 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b  rruptSrcFileLock
207c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
207d0 63 6f 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f  corruptDstFileLo
207e0 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ck = 0;.      in
207f0 74 20 69 73 53 72 63 43 6f 72 72 75 70 74 20 3d  t isSrcCorrupt =
20800 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   0;.      int is
20810 44 73 74 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a  DstCorrupt = 0;.
20820 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69  .      if( !sqli
20830 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
20840 28 73 72 63 64 62 29 20 29 7b 0a 20 20 20 20 20  (srcdb) ){.     
20850 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20860 5f 4d 49 53 55 53 45 3b 0a 20 20 20 20 20 20 7d  _MISUSE;.      }
20870 0a 20 20 20 20 20 20 0a 23 69 66 20 53 51 4c 49  .      .#if SQLI
20880 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50  TE_ENABLE_DATA_P
20890 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20  ROTECTION.      
208a0 66 6c 61 67 73 20 7c 3d 20 70 46 69 6c 65 2d 3e  flags |= pFile->
208b0 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69  protFlags;.#endi
208c0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
208d0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
208e0 45 0a 20 20 20 20 20 20 69 66 28 20 69 73 50 72  E.      if( isPr
208f0 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  oxyLockingMode(p
20900 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 20  File) ){.       
20910 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
20920 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b  _OPEN_AUTOPROXY;
20930 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
20940 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
20950 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  = sqlite3demo_su
20960 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 7a  perlock(pFile->z
20970 50 61 74 68 2c 20 30 2c 20 66 6c 61 67 73 2c 20  Path, 0, flags, 
20980 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29 3b 0a 20  0, 0, &pLock);. 
20990 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
209a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
209b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
209c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 41   rc==SQLITE_NOTA
209d0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  DB ){.          
209e0 69 73 44 73 74 43 6f 72 72 75 70 74 20 3d 20 31  isDstCorrupt = 1
209f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
20a00 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
20a10 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69  erlock_corrupt(i
20a20 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45  d, SQLITE_LOCK_E
20a30 58 43 4c 55 53 49 56 45 2c 20 26 63 6f 72 72 75  XCLUSIVE, &corru
20a40 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a  ptDstFileLock);.
20a50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20a60 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
20a70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20a80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20a90 20 7d 0a 20 20 20 20 20 20 2f 2a 20 67 65 74 20   }.      /* get 
20aa0 74 68 65 20 73 72 63 20 66 69 6c 65 20 64 65 73  the src file des
20ab0 63 72 69 70 74 6f 72 20 61 64 68 65 72 69 6e 67  criptor adhering
20ac0 20 74 6f 20 74 68 65 20 64 62 20 73 74 72 75 63   to the db struc
20ad0 74 20 61 63 63 65 73 73 20 72 75 6c 65 73 20 0a  t access rules .
20ae0 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
20af0 6f 64 65 20 69 73 20 6d 6f 64 65 6c 65 64 20 61  ode is modeled a
20b00 66 74 65 72 20 73 71 6c 69 74 65 33 5f 66 69 6c  fter sqlite3_fil
20b10 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 69 6e 20 6d  e_control() in m
20b20 61 69 6e 2e 63 0a 20 20 20 20 20 20 20 2a 2f 20  ain.c.       */ 
20b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
20b40 75 74 65 78 5f 65 6e 74 65 72 28 73 72 63 64 62  utex_enter(srcdb
20b50 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
20b60 69 66 28 20 73 72 63 64 62 2d 3e 6e 44 62 3e 30  if( srcdb->nDb>0
20b70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63   ){.        pSrc
20b80 42 74 72 65 65 20 3d 20 73 72 63 64 62 2d 3e 61  Btree = srcdb->a
20b90 44 62 5b 30 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[0].pBt;.     
20ba0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 53 72   }.      if( pSr
20bb0 63 42 74 72 65 65 20 29 7b 0a 20 20 20 20 20 20  cBtree ){.      
20bc0 20 20 50 61 67 65 72 20 2a 70 53 72 63 50 61 67    Pager *pSrcPag
20bd0 65 72 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  er;.        sqli
20be0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 53  te3BtreeEnter(pS
20bf0 72 63 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20  rcBtree);.      
20c00 20 20 70 53 72 63 50 61 67 65 72 20 3d 20 73 71    pSrcPager = sq
20c10 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
20c20 70 53 72 63 42 74 72 65 65 29 3b 0a 20 20 20 20  pSrcBtree);.    
20c30 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
20c40 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Pager!=0 );.    
20c50 20 20 20 20 73 72 63 5f 66 69 6c 65 20 3d 20 73      src_file = s
20c60 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
20c70 70 53 72 63 50 61 67 65 72 29 3b 0a 20 20 20 20  pSrcPager);.    
20c80 20 20 20 20 61 73 73 65 72 74 28 20 73 72 63 5f      assert( src_
20c90 66 69 6c 65 21 3d 30 20 29 3b 0a 20 20 20 20 20  file!=0 );.     
20ca0 20 20 20 69 66 28 20 73 72 63 5f 66 69 6c 65 2d     if( src_file-
20cb0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
20cc0 20 20 20 20 20 20 20 69 6e 74 20 73 72 63 46 6c         int srcFl
20cd0 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ags = 0;.       
20ce0 20 20 20 70 53 72 63 46 69 6c 65 20 3d 20 28 75     pSrcFile = (u
20cf0 6e 69 78 46 69 6c 65 20 2a 29 73 72 63 5f 66 69  nixFile *)src_fi
20d00 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  le;.          /*
20d10 20 77 61 6c 20 6d 6f 64 65 20 64 62 20 63 61 6e   wal mode db can
20d20 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 20 72 65  not be opened re
20d30 61 64 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20 20 20  adonly */.      
20d40 20 20 20 20 69 66 20 28 28 70 53 72 63 46 69 6c      if ((pSrcFil
20d50 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f  e->openFlags & O
20d60 5f 52 44 57 52 29 20 3d 3d 20 4f 5f 52 44 57 52  _RDWR) == O_RDWR
20d70 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
20d80 73 72 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  srcFlags = SQLIT
20d90 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
20da0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ;.          } el
20db0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
20dc0 20 73 72 63 46 6c 61 67 73 20 3d 20 53 51 4c 49   srcFlags = SQLI
20dd0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
20de0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 69  ;.          }.#i
20df0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20e00 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a  DATA_PROTECTION.
20e10 20 20 20 20 20 20 20 20 20 20 73 72 63 46 6c 61            srcFla
20e20 67 73 20 7c 3d 20 70 53 72 63 46 69 6c 65 2d 3e  gs |= pSrcFile->
20e30 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69  protFlags;.#endi
20e40 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
20e50 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
20e60 45 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  E.          if( 
20e70 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f  isProxyLockingMo
20e80 64 65 28 70 53 72 63 46 69 6c 65 29 20 29 7b 0a  de(pSrcFile) ){.
20e90 20 20 20 20 20 20 20 20 20 20 20 20 73 72 63 46              srcF
20ea0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
20eb0 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20  PEN_AUTOPROXY;. 
20ec0 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
20ed0 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  f.          rc =
20ee0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
20ef0 28 70 53 72 63 46 69 6c 65 2d 3e 7a 50 61 74 68  (pSrcFile->zPath
20f00 2c 20 26 73 72 63 64 62 32 2c 20 73 72 63 46 6c  , &srcdb2, srcFl
20f10 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ags, 0);.       
20f20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20f30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20f40 20 20 20 20 2f 2a 20 73 74 61 72 74 20 61 20 64      /* start a d
20f50 65 66 65 72 72 65 64 20 74 72 61 6e 73 61 63 74  eferred transact
20f60 69 6f 6e 20 61 6e 64 20 72 65 61 64 20 74 6f 20  ion and read to 
20f70 65 73 74 61 62 6c 69 73 68 20 61 20 72 65 61 64  establish a read
20f80 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
20f90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20fa0 33 5f 65 78 65 63 28 73 72 63 64 62 32 2c 20 22  3_exec(srcdb2, "
20fb0 42 45 47 49 4e 20 44 45 46 45 52 52 45 44 3b 20  BEGIN DEFERRED; 
20fc0 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65  PRAGMA schema_ve
20fd0 72 73 69 6f 6e 22 2c 20 30 2c 20 30 2c 20 30 29  rsion", 0, 0, 0)
20fe0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
20ff0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  ( rc==SQLITE_COR
21000 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  RUPT || rc==SQLI
21010 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20 20  TE_NOTADB ){.   
21020 20 20 20 20 20 20 20 20 20 20 20 69 73 53 72 63             isSrc
21030 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20 20 20  Corrupt = 1;.   
21040 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
21050 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
21060 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73 72  rlock_corrupt(sr
21070 63 5f 66 69 6c 65 2c 20 53 51 4c 49 54 45 5f 4c  c_file, SQLITE_L
21080 4f 43 4b 5f 53 48 41 52 45 44 2c 20 26 63 6f 72  OCK_SHARED, &cor
21090 72 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29  ruptSrcFileLock)
210a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
210b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
210c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
210d0 20 20 20 20 69 66 28 20 21 73 72 63 64 62 32 20      if( !srcdb2 
210e0 7c 7c 20 70 53 72 63 46 69 6c 65 3d 3d 4e 55 4c  || pSrcFile==NUL
210f0 4c 20 7c 7c 20 70 53 72 63 46 69 6c 65 2d 3e 68  L || pSrcFile->h
21100 3c 30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  <0){.        rc 
21110 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  = SQLITE_INTERNA
21120 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
21130 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21140 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
21150 74 6f 20 65 6e 64 5f 72 65 70 6c 61 63 65 5f 64  to end_replace_d
21160 61 74 61 62 61 73 65 3b 0a 20 20 20 20 20 20 7d  atabase;.      }
21170 0a 20 20 20 20 20 20 2f 2a 20 62 6f 74 68 20 64  .      /* both d
21180 61 74 61 62 61 73 65 73 20 61 72 65 20 6c 6f 63  atabases are loc
21190 6b 65 64 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ked appropriatel
211a0 79 2c 20 63 6f 70 79 20 74 68 65 20 73 72 63 20  y, copy the src 
211b0 77 61 6c 20 6a 6f 75 72 6e 61 6c 20 69 66 20 0a  wal journal if .
211c0 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 65 78 69        ** one exi
211d0 73 74 73 20 61 6e 64 20 74 68 65 6e 20 74 68 65  sts and then the
211e0 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
211f0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20   file.      */. 
21200 20 20 20 20 20 73 74 72 6c 63 70 79 28 73 72 63       strlcpy(src
21210 57 61 6c 50 61 74 68 2c 20 70 53 72 63 46 69 6c  WalPath, pSrcFil
21220 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54  e->zPath, MAXPAT
21230 48 4c 45 4e 2b 35 29 3b 0a 20 20 20 20 20 20 73  HLEN+5);.      s
21240 74 72 6c 63 61 74 28 73 72 63 57 61 6c 50 61 74  trlcat(srcWalPat
21250 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41  h, "-wal", MAXPA
21260 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 20 20 20 20  THLEN+5);.      
21270 73 72 63 57 61 6c 46 44 20 3d 20 6f 70 65 6e 28  srcWalFD = open(
21280 73 72 63 57 61 6c 50 61 74 68 2c 20 4f 5f 52 44  srcWalPath, O_RD
21290 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28  ONLY);.      if(
212a0 20 21 28 73 72 63 57 61 6c 46 44 3c 30 29 20 29   !(srcWalFD<0) )
212b0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 64  {.        char d
212c0 73 74 57 61 6c 50 61 74 68 5b 4d 41 58 50 41 54  stWalPath[MAXPAT
212d0 48 4c 45 4e 2b 35 5d 3b 0a 20 20 20 20 20 20 20  HLEN+5];.       
212e0 20 69 6e 74 20 64 73 74 57 61 6c 46 44 20 3d 20   int dstWalFD = 
212f0 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 74 72 6c  -1;.        strl
21300 63 70 79 28 64 73 74 57 61 6c 50 61 74 68 2c 20  cpy(dstWalPath, 
21310 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41  pFile->zPath, MA
21320 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 20  XPATHLEN+5);.   
21330 20 20 20 20 20 73 74 72 6c 63 61 74 28 64 73 74       strlcat(dst
21340 57 61 6c 50 61 74 68 2c 20 22 2d 77 61 6c 22 2c  WalPath, "-wal",
21350 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a   MAXPATHLEN+5);.
21360 20 20 20 20 20 20 20 20 64 73 74 57 61 6c 46 44          dstWalFD
21370 20 3d 20 6f 70 65 6e 28 64 73 74 57 61 6c 50 61   = open(dstWalPa
21380 74 68 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  th, O_RDWR|O_CRE
21390 41 54 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  AT, SQLITE_DEFAU
213a0 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
213b0 4f 4e 53 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ONS);.        if
213c0 28 20 21 28 64 73 74 57 61 6c 46 44 3c 30 29 20  ( !(dstWalFD<0) 
213d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 20 3d  ){.          s =
213e0 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f   copyfile_state_
213f0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
21400 20 20 20 6c 73 65 65 6b 28 73 72 63 57 61 6c 46     lseek(srcWalF
21410 44 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b  D, 0, SEEK_SET);
21420 0a 20 20 20 20 20 20 20 20 20 20 6c 73 65 65 6b  .          lseek
21430 28 64 73 74 57 61 6c 46 44 2c 20 30 2c 20 53 45  (dstWalFD, 0, SE
21440 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20 20 20  EK_SET);.       
21450 20 20 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65     if( fcopyfile
21460 28 73 72 63 57 61 6c 46 44 2c 20 64 73 74 57 61  (srcWalFD, dstWa
21470 6c 46 44 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45  lFD, s, COPYFILE
21480 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
21490 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72       int err=err
214a0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  no;.            
214b0 73 77 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20  switch(err) {.  
214c0 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
214d0 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20 20   ENOMEM:.       
214e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
214f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
21500 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
21510 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
21520 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
21530 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
21540 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
21550 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21560 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
21570 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ERR;.           
21580 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
21590 20 20 20 20 20 20 20 20 20 63 6f 70 79 66 69 6c           copyfil
215a0 65 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b  e_state_free(s);
215b0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
215c0 28 64 73 74 57 61 6c 46 44 29 3b 0a 20 20 20 20  (dstWalFD);.    
215d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6c      }.        cl
215e0 6f 73 65 28 73 72 63 57 61 6c 46 44 29 3b 0a 20  ose(srcWalFD);. 
215f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
21600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21610 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 62 65 66  {.        /* bef
21620 6f 72 65 20 77 65 20 63 6f 70 79 2c 20 65 6e 73  ore we copy, ens
21630 75 72 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ure that the fil
21640 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
21650 20 77 69 6c 6c 20 62 65 20 6d 6f 64 69 66 69 65   will be modifie
21660 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 69 6e  d */.        uin
21670 74 33 32 5f 74 20 73 72 63 43 68 61 6e 67 65 20  t32_t srcChange 
21680 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 69 6e  = 0;.        uin
21690 74 33 32 5f 74 20 64 73 74 43 68 61 6e 67 65 20  t32_t dstChange 
216a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 72 65  = 0;.        pre
216b0 61 64 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20  ad(pSrcFile->h, 
216c0 26 73 72 63 43 68 61 6e 67 65 2c 20 34 2c 20 32  &srcChange, 4, 2
216d0 34 29 3b 0a 20 20 20 20 20 20 20 20 70 72 65 61  4);.        prea
216e0 64 28 70 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74  d(pFile->h, &dst
216f0 43 68 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a  Change, 4, 24);.
21700 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
21710 20 2f 2a 20 63 6f 70 79 20 74 68 65 20 61 63 74   /* copy the act
21720 75 61 6c 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ual database */.
21730 20 20 20 20 20 20 20 20 73 20 3d 20 63 6f 70 79          s = copy
21740 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63  file_state_alloc
21750 28 29 3b 0a 20 20 20 20 20 20 20 20 6c 73 65 65  ();.        lsee
21760 6b 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 30  k(pSrcFile->h, 0
21770 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20  , SEEK_SET);.   
21780 20 20 20 20 20 6c 73 65 65 6b 28 70 46 69 6c 65       lseek(pFile
21790 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54  ->h, 0, SEEK_SET
217a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
217b0 63 6f 70 79 66 69 6c 65 28 70 53 72 63 46 69 6c  copyfile(pSrcFil
217c0 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  e->h, pFile->h, 
217d0 73 2c 20 43 4f 50 59 46 49 4c 45 5f 41 4c 4c 29  s, COPYFILE_ALL)
217e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
217f0 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20  t err=errno;.   
21800 20 20 20 20 20 20 20 73 77 69 74 63 68 28 65 72         switch(er
21810 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r) {.           
21820 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20   case ENOMEM:.  
21830 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
21840 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
21860 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
21870 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
21880 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
21890 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 3b 0a 20  stErrno = err;. 
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
218b0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  = SQLITE_IOERR;.
218c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
218d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6f      }.        co
218e0 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66 72 65  pyfile_state_fre
218f0 65 28 73 29 3b 0a 20 20 20 20 20 20 20 20 0a 20  e(s);.        . 
21900 20 20 20 20 20 20 20 69 66 20 28 73 72 63 43 68         if (srcCh
21910 61 6e 67 65 20 3d 3d 20 64 73 74 43 68 61 6e 67  ange == dstChang
21920 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  e) {.          /
21930 2a 20 6d 6f 64 69 66 79 20 74 68 65 20 63 68 61  * modify the cha
21940 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 66  nge counter to f
21950 6f 72 63 65 20 70 61 67 65 20 7a 65 72 6f 20 74  orce page zero t
21960 6f 20 62 65 20 72 65 6c 6f 61 64 65 64 20 2a 2f  o be reloaded */
21970 0a 20 20 20 20 20 20 20 20 20 20 64 73 74 43 68  .          dstCh
21980 61 6e 67 65 20 2b 2b 3b 0a 20 20 20 20 20 20 20  ange ++;.       
21990 20 20 20 70 77 72 69 74 65 28 70 46 69 6c 65 2d     pwrite(pFile-
219a0 3e 68 2c 20 26 64 73 74 43 68 61 6e 67 65 2c 20  >h, &dstChange, 
219b0 34 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  4, 24);.        
219c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
219d0 69 66 28 20 69 73 53 72 63 43 6f 72 72 75 70 74  if( isSrcCorrupt
219e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
219f0 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
21a00 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73 72 63 5f  ock_corrupt(src_
21a10 66 69 6c 65 2c 20 63 6f 72 72 75 70 74 53 72 63  file, corruptSrc
21a20 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  FileLock);.     
21a30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21a40 2f 2a 20 64 6f 6e 65 20 77 69 74 68 20 74 68 65  /* done with the
21a50 20 73 6f 75 72 63 65 20 64 62 20 73 6f 20 65 6e   source db so en
21a60 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
21a70 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  n */.        sql
21a80 69 74 65 33 5f 65 78 65 63 28 73 72 63 64 62 32  ite3_exec(srcdb2
21a90 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
21aa0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
21ab0 20 20 20 20 2f 2a 20 7a 65 72 6f 20 6f 75 74 20      /* zero out 
21ac0 61 6e 79 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20  any old journal 
21ad0 63 6c 75 74 74 65 72 20 2a 2f 0a 20 20 20 20 20  clutter */.     
21ae0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21af0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  OK ){.        ch
21b00 61 72 20 6a 50 61 74 68 5b 4d 41 58 50 41 54 48  ar jPath[MAXPATH
21b10 4c 45 4e 2b 39 5d 3b 0a 20 20 20 20 20 20 20 20  LEN+9];.        
21b20 69 6e 74 20 7a 4c 65 6e 20 3d 20 73 74 72 6c 63  int zLen = strlc
21b30 70 79 28 6a 50 61 74 68 2c 20 70 46 69 6c 65 2d  py(jPath, pFile-
21b40 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  >zPath, MAXPATHL
21b50 45 4e 2b 39 29 3b 0a 20 20 20 20 20 20 20 20 69  EN+9);.        i
21b60 66 28 20 7a 4c 65 6e 3c 4d 41 58 50 41 54 48 4c  f( zLen<MAXPATHL
21b70 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
21b80 73 69 7a 65 5f 74 20 6a 4c 65 6e 3b 0a 20 20 20  size_t jLen;.   
21b90 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
21ba0 72 20 65 78 74 65 6e 73 69 6f 6e 73 5b 32 5d 5b  r extensions[2][
21bb0 39 5d 20 3d 20 7b 20 22 2d 77 61 6c 22 2c 20 22  9] = { "-wal", "
21bc0 2d 6a 6f 75 72 6e 61 6c 22 20 2f 2a 20 22 2d 73  -journal" /* "-s
21bd0 68 6d 22 20 2a 2f 20 7d 3b 0a 20 20 20 20 20 20  hm" */ };.      
21be0 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 73 72 63      int j = (src
21bf0 57 61 6c 46 44 3c 30 29 3f 30 3a 31 3b 20 2f 2a  WalFD<0)?0:1; /*
21c00 20 73 6b 69 70 20 74 68 65 20 77 61 6c 20 69 66   skip the wal if
21c10 20 77 65 20 72 65 70 6c 61 63 65 64 20 69 74 20   we replaced it 
21c20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  */.          for
21c30 28 20 3b 20 6a 3c 32 3b 20 6a 2b 2b 20 29 7b 0a  ( ; j<2; j++ ){.
21c40 20 20 20 20 20 20 20 20 20 20 20 20 6a 4c 65 6e              jLen
21c50 20 3d 20 73 74 72 6c 63 70 79 28 26 6a 50 61 74   = strlcpy(&jPat
21c60 68 5b 7a 4c 65 6e 5d 2c 20 65 78 74 65 6e 73 69  h[zLen], extensi
21c70 6f 6e 73 5b 6a 5d 2c 20 39 29 3b 0a 20 20 20 20  ons[j], 9);.    
21c80 20 20 20 20 20 20 20 20 69 66 28 20 6a 4c 65 6e          if( jLen
21c90 20 3c 20 39 20 29 7b 0a 20 20 20 20 20 20 20 20   < 9 ){.        
21ca0 20 20 20 20 20 20 69 6e 74 20 6a 66 64 20 3d 20        int jfd = 
21cb0 6f 70 65 6e 28 6a 50 61 74 68 2c 20 4f 5f 54 52  open(jPath, O_TR
21cc0 55 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  UNC);.          
21cd0 20 20 20 20 69 66 28 20 6a 66 64 3d 3d 28 2d 31      if( jfd==(-1
21ce0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
21cf0 20 20 20 20 20 69 66 20 28 20 65 72 72 6e 6f 21       if ( errno!
21d00 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
21d10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 65 72               per
21d20 72 6f 72 28 6a 50 61 74 68 29 3b 0a 20 20 20 20  ror(jPath);.    
21d30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21d40 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
21d50 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
21d60 20 20 20 20 20 66 73 79 6e 63 28 6a 66 64 29 3b       fsync(jfd);
21d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21d80 20 63 6c 6f 73 65 28 6a 66 64 29 3b 0a 20 20 20   close(jfd);.   
21d90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21da0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
21dc0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
21dd0 70 4d 65 74 68 6f 64 2d 3e 78 53 79 6e 63 28 69  pMethod->xSync(i
21de0 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  d, SQLITE_SYNC_F
21df0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULL);.      }.  
21e00 20 20 20 20 0a 20 20 20 20 65 6e 64 5f 72 65 70      .    end_rep
21e10 6c 61 63 65 5f 64 61 74 61 62 61 73 65 3a 0a 20  lace_database:. 
21e20 20 20 20 20 20 69 66 28 20 70 53 72 63 42 74 72       if( pSrcBtr
21e30 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ee ){.        sq
21e40 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 72 63 64  lite3_close(srcd
21e50 62 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  b2);.        sql
21e60 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
21e70 53 72 63 42 74 72 65 65 29 3b 0a 20 20 20 20 20  SrcBtree);.     
21e80 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
21e90 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 72 63  _mutex_leave(src
21ea0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
21eb0 20 20 69 66 28 20 69 73 44 73 74 43 6f 72 72 75    if( isDstCorru
21ec0 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pt ){.        sq
21ed0 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75  lite3demo_superu
21ee0 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64  nlock_corrupt(id
21ef0 2c 20 63 6f 72 72 75 70 74 44 73 74 46 69 6c 65  , corruptDstFile
21f00 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Lock);.      }el
21f10 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
21f20 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
21f30 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ock(pLock);.    
21f40 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
21f50 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   rc;.    }.#endi
21f60 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f 45 4e 41  f /* (SQLITE_ENA
21f70 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29  BLE_APPLE_SPI>0)
21f80 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
21f90 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 20 20 63 61  PLE__) */.    ca
21fa0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
21fb0 53 59 4e 43 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a  SYNC_OMITTED: {.
21fc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21fd0 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 41 20 6e 6f  ITE_OK;  /* A no
21fe0 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  -op */.    }.  }
21ff0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22000 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
22010 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
22020 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
22030 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
22040 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
22050 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
22060 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
22070 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
22080 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
22090 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
220a0 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
220b0 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
220c0 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
220d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
220e0 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
220f0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
22100 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
22110 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
22120 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
22130 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
22140 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
22150 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
22160 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
22170 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
22180 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
22190 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
221a0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
221b0 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
221c0 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  file *NotUsed){.
221d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
221e0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
221f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
22200 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
22210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22220 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
22230 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72  racteristics for
22240 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
22250 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f 72 20  is always 0 for 
22260 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unix..*/.static 
22270 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
22280 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
22290 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
222a0 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
222b0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
222c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
222d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
222e0 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a  _OMIT_WAL.../*.*
222f0 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
22300 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68   represent an sh
22310 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  ared memory buff
22320 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  er.  .**.** When
22330 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
22340 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
22350 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64  the same wal-ind
22360 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a  ex, each thread.
22370 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75  ** has its own u
22380 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62  nixShm object, b
22390 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e  ut they all poin
223a0 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
223b0 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69  stance.** of thi
223c0 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
223d0 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
223e0 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d  words, each wal-
223f0 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a  index is opened.
22400 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ** only once per
22410 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
22420 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Each unixShmNode
22430 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65   object is conne
22440 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  cted to a single
22450 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
22460 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75  bject..** We cou
22470 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73  ld coalesce this
22480 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69   object into uni
22490 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20  xInodeInfo, but 
224a0 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a  that would mean.
224b0 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69  ** every open fi
224c0 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
224d0 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   use shared memo
224e0 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ry (in other wor
224f0 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e  ds, most.** open
22500 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61   files) would ha
22510 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75  ve to carry arou
22520 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e  nd this extra in
22530 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a  formation.  So.*
22540 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * the unixInodeI
22550 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  nfo object conta
22560 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
22570 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
22580 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20  e object.** and 
22590 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
225a0 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
225b0 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64  d only when need
225c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ed..**.** unixMu
225d0 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
225e0 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
225f0 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
22600 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
22610 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
22620 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
22630 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
22640 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
22650 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  Ref.**.** The fo
22660 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
22670 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
22680 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
22690 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
226a0 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
226b0 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
226c0 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d  * Either unixShm
226d0 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
226e0 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53  be held or unixS
226f0 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
22700 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  nd.** unixMutexH
22710 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
22720 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
22730 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
22740 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
22750 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
22760 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
22770 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e {.  unixInodeI
22780 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
22790 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66   /* unixInodeInf
227a0 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  o that owns this
227b0 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73   SHM node */.  s
227c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
227d0 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
227e0 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
227f0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
22800 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
22810 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
22820 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20   of the mmapped 
22830 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  file */.  int h;
22840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22850 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
22860 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
22870 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22890 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
228a0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
228b0 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20  .  u16 nRegion; 
228c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
228d0 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
228e0 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  pRegion */.  u8 
228f0 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20  isReadonly;     
22900 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
22910 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  if read-only */.
22920 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f    char **apRegio
22930 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
22940 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20  Array of mapped 
22950 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
22960 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  gions */.  int n
22970 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
22980 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22990 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  of unixShm objec
229a0 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
229b0 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  his */.  unixShm
229c0 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
229d0 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53      /* All unixS
229e0 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
229f0 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23  ing to this */.#
22a00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22a10 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b  UG.  u8 exclMask
22a20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22a30 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
22a40 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
22a50 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61  */.  u8 sharedMa
22a60 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
22a70 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
22a80 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
22a90 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ab0 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75  Next available u
22ac0 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  nixShm.id value 
22ad0 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
22ae0 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
22af0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
22b00 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
22b10 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
22b20 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
22b30 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
22b40 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
22b50 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
22b60 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
22b70 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
22b80 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
22b90 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
22ba0 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
22bb0 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70  .**    unixShm.p
22bc0 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53  File.**    unixS
22bd0 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  hm.id.**.** All 
22be0 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
22bf0 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68   read/write.  Th
22c00 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d  e unixShm.pFile-
22c10 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
22c20 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
22c30 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
22c40 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
22c50 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20  .struct unixShm 
22c60 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
22c70 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f  *pShmNode;     /
22c80 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
22c90 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
22ca0 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ect */.  unixShm
22cb0 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
22cc0 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78      /* Next unix
22cd0 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
22ce0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  e unixShmNode */
22cf0 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
22d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22d10 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
22d20 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
22d30 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20   mutex */.  u16 
22d40 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
22d50 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
22d60 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
22d70 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
22d80 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
22d90 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
22da0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
22db0 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  eld */.#ifdef SQ
22dc0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
22dd0 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
22de0 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66          /* Id of
22df0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
22e00 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78   within its unix
22e10 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69  ShmNode */.#endi
22e20 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  f.};../*.** Cons
22e30 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
22e40 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
22e50 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
22e60 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
22e70 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
22e80 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
22e90 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
22ea0 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20  e UNIX_SHM_DMS  
22eb0 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45    (UNIX_SHM_BASE
22ec0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
22ed0 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
22ee0 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
22ef0 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69  Apply posix advi
22f00 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
22f10 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66  ll bytes from of
22f20 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b  st through ofst+
22f30 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73  n-1..**.** Locks
22f40 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61   block if the ma
22f50 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e  sk is exactly UN
22f60 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65  IX_SHM_C and are
22f70 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a   non-blocking.**
22f80 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
22f90 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
22fa0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75  mSystemLock(.  u
22fb0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
22fc0 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c  Node, /* Apply l
22fd0 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
22fe0 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
22ff0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
23000 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
23010 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
23020 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
23030 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
23040 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
23050 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
23060 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
23070 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23090 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
230a0 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
230b0 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66    struct flock f
230c0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
230d0 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
230e0 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
230f0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
23100 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65  LITE_OK;   /* Re
23110 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
23120 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
23130 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
23140 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
23150 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
23160 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
23170 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23180 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68  3_mutex_held(pSh
23190 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c  mNode->mutex) ||
231a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
231b0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72  =0 );..  /* Shar
231c0 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73  ed locks never s
231d0 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  pan more than on
231e0 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65  e byte */.  asse
231f0 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b  rt( n==1 || lock
23200 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b  Type!=F_RDLCK );
23210 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65  ..  /* Locks are
23220 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f   within range */
23230 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
23240 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f  && n<SQLITE_SHM_
23250 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  NLOCK );..  if( 
23260 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
23270 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
23280 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ize the locking 
23290 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
232a0 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20    memset(&f, 0, 
232b0 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20  sizeof(f));.    
232c0 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54  f.l_type = lockT
232d0 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65  ype;.    f.l_whe
232e0 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
232f0 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20      f.l_start = 
23300 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65  ofst;.    f.l_le
23310 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d  n = n;..    rc =
23320 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64   osFcntl(pShmNod
23330 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
23340 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63  f);.    rc = (rc
23350 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
23360 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
23370 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  Y;.  }..  /* Upd
23380 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  ate the global l
23390 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f  ock state and do
233a0 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a   debug tracing *
233b0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
233c0 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61  DEBUG.  { u16 ma
233d0 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  sk;.  OSTRACE(("
233e0 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20  SHM-LOCK "));.  
233f0 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74  mask = (1<<(ofst
23400 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29  +n)) - (1<<ofst)
23410 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
23420 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
23430 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c   lockType==F_UNL
23440 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
23450 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20  ACE(("unlock %d 
23460 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
23470 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
23480 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
23490 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
234a0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
234b0 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ask;.    }else i
234c0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
234d0 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
234e0 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
234f0 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
23500 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
23510 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
23520 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
23530 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
23540 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c  |= mask;.    }el
23550 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
23560 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
23570 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
23580 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
23590 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
235a0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
235b0 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
235c0 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
235d0 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  de->sharedMask &
235e0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  = ~mask;.    }. 
235f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
23600 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43  lockType==F_UNLC
23610 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
23620 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66  CE(("unlock %d f
23630 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
23640 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
23650 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
23660 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
23670 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69  (("read-lock fai
23680 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73  led"));.    }els
23690 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
236a0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c   lockType==F_WRL
236b0 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  CK );.      OSTR
236c0 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b  ACE(("write-lock
236d0 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
236e0 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
236f0 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61 66   OSTRACE((" - af
23700 74 65 72 77 61 72 64 73 20 25 30 33 78 2c 25 30  terwards %03x,%0
23710 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3x\n",.         
23720 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
23730 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65  edMask, pShmNode
23740 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
23750 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
23760 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d  rn rc;        .}
23770 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  .../*.** Purge t
23780 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69  he unixShmNodeLi
23790 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
237a0 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78  ntries with unix
237b0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
237c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
237d0 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
237e0 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
237f0 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
23800 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
23810 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
23820 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
23830 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
23840 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78  nixShmPurge(unix
23850 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e  File *pFd){.  un
23860 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70  ixShmNode *p = p
23870 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
23880 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
23890 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
238a0 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
238b0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
238c0 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72  int i;.    asser
238d0 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46  t( p->pInode==pF
238e0 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  d->pInode );.   
238f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
23900 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
23910 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
23920 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a  >nRegion; i++){.
23930 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d        if( p->h>=
23940 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 75 6e  0 ){.        mun
23950 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  map(p->apRegion[
23960 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29  i], p->szRegion)
23970 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
23980 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
23990 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  ree(p->apRegion[
239a0 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
239b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
239c0 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29  ree(p->apRegion)
239d0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d  ;.    if( p->h>=
239e0 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  0 ){.      robus
239f0 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e  t_close(pFd, p->
23a00 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
23a10 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20      p->h = -1;. 
23a20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f     }.    p->pIno
23a30 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30  de->pShmNode = 0
23a40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
23a50 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  ee(p);.  }.}..st
23a60 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
23a70 2a 70 72 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f  *proxySharedMemo
23a80 72 79 42 61 73 65 50 61 74 68 28 75 6e 69 78 46  ryBasePath(unixF
23a90 69 6c 65 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  ile *);../*.** O
23aa0 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  pen a shared-mem
23ab0 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61  ory area associa
23ac0 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61  ted with open da
23ad0 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
23ae0 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72  d.  .** This par
23af0 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e  ticular implemen
23b00 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70  tation uses mmap
23b10 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ped files..**.**
23b20 20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74   The file used t
23b30 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72  o implement shar
23b40 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20  ed-memory is in 
23b50 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
23b60 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65  ry.** as the ope
23b70 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
23b80 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65  and has the same
23b90 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65   name as the ope
23ba0 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  n database.** fi
23bb0 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68  le with the "-sh
23bc0 6d 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e  m" suffix added.
23bd0 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
23be0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
23bf0 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65  ile.** is "/home
23c00 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
23c10 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20  " then the file 
23c20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
23c30 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66  and mmapped.** f
23c40 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  or shared memory
23c50 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
23c60 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e  "/home/user1/con
23c70 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a  fig.db-shm".  .*
23c80 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70  *.** Another app
23c90 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75  roach to is to u
23ca0 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76  se files in /dev
23cb0 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70  /shm or /dev/tmp
23cc0 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f   or an.** some o
23cd0 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74  ther tmpfs mount
23ce0 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20  . But if a file 
23cf0 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64  in a different d
23d00 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d  irectory.** from
23d10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23d20 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
23d30 20 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73   differing acces
23d40 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a  s permissions.**
23d50 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d   or a chroot() m
23d60 69 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64  ight cause two d
23d70 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73  ifferent process
23d80 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  es on the same.*
23d90 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e  * database to en
23da0 64 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65  d up using diffe
23db0 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73  rent files for s
23dc0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a  hared memory - .
23dd0 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  ** meaning that 
23de0 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75  their memory wou
23df0 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  ld not really be
23e00 20 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74   shared - result
23e10 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61  ing.** in databa
23e20 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
23e30 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68  Nevertheless, th
23e40 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73  is tmpfs file us
23e50 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e  age.** can be en
23e60 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
23e70 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51  -time using -DSQ
23e80 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
23e90 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a  RY="/dev/shm".**
23ea0 20 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65   or the equivale
23eb0 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  nt.  The use of 
23ec0 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  the SQLITE_SHM_D
23ed0 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
23ee0 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20  -time.** option 
23ef0 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e  results in an in
23f00 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64  compatible build
23f10 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69   of SQLite;  bui
23f20 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a  lds of SQLite.**
23f30 20 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65   that with diffe
23f40 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f  ring SQLITE_SHM_
23f50 44 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e  DIRECTORY settin
23f60 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  gs attempt to us
23f70 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61  e the.** same da
23f80 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
23f90 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61  he same time, da
23fa0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
23fb0 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  n will likely.**
23fc0 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c   result. The SQL
23fd0 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
23fe0 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  Y compile-time o
23ff0 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65  ption is conside
24000 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72  red.** "unsuppor
24010 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20  ted" and may go 
24020 61 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65  away in a future
24030 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e   SQLite release.
24040 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e  .**.** When open
24050 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64  ing a new shared
24060 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66  -memory file, if
24070 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e   no other instan
24080 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66  ces of that.** f
24090 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ile are currentl
240a0 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20  y open, in this 
240b0 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74  process or in ot
240c0 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74  her processes, t
240d0 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  hen.** the file 
240e0 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65  must be truncate
240f0 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  d to zero length
24100 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61   or have its hea
24110 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a  der cleared..**.
24120 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  ** If the origin
24130 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
24140 20 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e   (pDbFd) is usin
24150 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c  g the "unix-excl
24160 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65  " VFS.** that me
24170 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c  ans that an excl
24180 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65  usive lock is he
24190 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
241a0 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74  se file and.** t
241b0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
241c0 63 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20  cesses are able 
241d0 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
241e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
241f0 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c  In.** that case,
24200 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c   we do not reall
24210 79 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65  y need shared me
24220 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64  mory.  No shared
24230 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20   memory.** file 
24240 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
24250 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
24260 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64  ill be simulated
24270 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72   with heap memor
24280 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
24290 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
242a0 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a  emory(unixFile *
242b0 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74  pDbFd){.  struct
242c0 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b   unixShm *p = 0;
242d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
242e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
242f0 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
24300 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
24310 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a   *pShmNode;   /*
24320 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
24330 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
24340 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
24350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24360 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
24370 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
24380 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
24390 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f        /* The ino
243a0 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68  de of fd */.  ch
243b0 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  ar *zShmFilename
243c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
243d0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
243e0 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a  e used for SHM *
243f0 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65  /.  int nShmFile
24400 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
24410 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
24420 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20  he SHM filename 
24430 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f  in bytes */..  /
24440 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
24450 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69   for the new uni
24460 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  xShm object. */.
24470 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
24480 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
24490 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
244a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
244b0 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
244c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
244d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ;.  assert( pDbF
244e0 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20  d->pShm==0 );.. 
244f0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
24500 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64   if a unixShmNod
24510 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79  e object already
24520 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61   exists. Reuse a
24530 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
24540 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20  one if present. 
24550 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
24560 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
24570 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
24580 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
24590 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65   = pDbFd->pInode
245a0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
245b0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
245c0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d  .  if( pShmNode=
245d0 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
245e0 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
245f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24600 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72  fstat() info for
24610 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
24620 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66  /..    /* Call f
24630 73 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65  stat() to figure
24640 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73   out the permiss
24650 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61  ions on the data
24660 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20  base file. If.  
24670 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d    ** a new *-shm
24680 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
24690 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c  , an attempt wil
246a0 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65  l be made to cre
246b0 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69  ate it.    ** wi
246c0 74 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  th the same perm
246d0 69 73 73 69 6f 6e 73 2e 20 54 68 65 20 61 63 74  issions. The act
246e0 75 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ual permissions 
246f0 74 68 65 20 66 69 6c 65 20 69 73 20 63 72 65 61  the file is crea
24700 74 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ted.    ** with 
24710 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 74  are subject to t
24720 68 65 20 63 75 72 72 65 6e 74 20 75 6d 61 73 6b  he current umask
24730 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f   setting..    */
24740 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
24750 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61  (pDbFd->h, &sSta
24760 74 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50  t) && pInode->bP
24770 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
24780 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
24790 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
247a0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
247b0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
247c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
247d0 7a 42 61 73 65 50 61 74 68 20 3d 20 70 44 62 46  zBasePath = pDbF
247e0 64 2d 3e 7a 50 61 74 68 3b 0a 23 69 66 20 64 65  d->zPath;.#if de
247f0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
24800 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
24810 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
24820 20 20 20 20 2f 2a 20 49 66 20 70 44 62 46 64 20      /* If pDbFd 
24830 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 77 69  is configured wi
24840 74 68 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  th proxy locking
24850 20 6d 6f 64 65 2c 20 75 73 65 20 74 68 65 20 6c   mode, use the l
24860 6f 63 61 6c 20 0a 20 20 20 20 20 2a 2a 20 6c 6f  ocal .     ** lo
24870 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74 6f 20  ck file path to 
24880 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 2d 73  determine the -s
24890 68 6d 20 66 69 6c 65 20 70 61 74 68 0a 20 20 20  hm file path.   
248a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 50    */.    if( isP
248b0 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  roxyLockingMode(
248c0 70 44 62 46 64 29 20 29 7b 0a 20 20 20 20 20 20  pDbFd) ){.      
248d0 7a 42 61 73 65 50 61 74 68 20 3d 20 70 72 6f 78  zBasePath = prox
248e0 79 53 68 61 72 65 64 4d 65 6d 6f 72 79 42 61 73  ySharedMemoryBas
248f0 65 50 61 74 68 28 70 44 62 46 64 29 3b 0a 20 20  ePath(pDbFd);.  
24900 20 20 20 20 69 66 28 20 21 7a 42 61 73 65 50 61      if( !zBasePa
24910 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  th ){.        rc
24920 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
24930 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EN_BKPT;.       
24940 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
24950 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
24960 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69  }.#endif.    .#i
24970 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
24980 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53  DIRECTORY.    nS
24990 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a  hmFilename = siz
249a0 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44  eof(SQLITE_SHM_D
249b0 49 52 45 43 54 4f 52 59 29 20 2b 20 33 30 3b 0a  IRECTORY) + 30;.
249c0 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69  #else.    nShmFi
249d0 6c 65 6e 61 6d 65 20 3d 20 35 20 2b 20 28 69 6e  lename = 5 + (in
249e0 74 29 73 74 72 6c 65 6e 28 7a 42 61 73 65 50 61  t)strlen(zBasePa
249f0 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  th);.#endif.    
24a00 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74  pShmNode = sqlit
24a10 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
24a20 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
24a30 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20  ShmFilename );. 
24a40 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d     if( pShmNode=
24a50 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
24a60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
24a70 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
24a80 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
24a90 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64    memset(pShmNod
24aa0 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53  e, 0, sizeof(*pS
24ab0 68 6d 4e 6f 64 65 29 29 3b 0a 20 20 20 20 7a 53  hmNode));.    zS
24ac0 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68  hmFilename = pSh
24ad0 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
24ae0 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e   = (char*)&pShmN
24af0 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53  ode[1];.#ifdef S
24b00 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
24b10 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ORY.    sqlite3_
24b20 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c  snprintf(nShmFil
24b30 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e  ename, zShmFilen
24b40 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ame, .          
24b50 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
24b60 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
24b70 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d  "/sqlite-shm-%x-
24b80 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %x",.           
24b90 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73            (u32)s
24ba0 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33  Stat.st_ino, (u3
24bb0 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b  2)sStat.st_dev);
24bc0 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74  .#else.    sqlit
24bd0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d  e3_snprintf(nShm
24be0 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69  Filename, zShmFi
24bf0 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22  lename, "%s-shm"
24c00 2c 20 7a 42 61 73 65 50 61 74 68 29 3b 0a 20 20  , zBasePath);.  
24c10 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
24c20 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74  fix3(pDbFd->zPat
24c30 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  h, zShmFilename)
24c40 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68  ;.#endif.    pSh
24c50 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  mNode->h = -1;. 
24c60 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65     pDbFd->pInode
24c70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
24c80 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  mNode;.    pShmN
24c90 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44  ode->pInode = pD
24ca0 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20  bFd->pInode;.   
24cb0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
24cc0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
24cd0 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
24ce0 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69  TEX_FAST);.    i
24cf0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  f( pShmNode->mut
24d00 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ex==0 ){.      r
24d10 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
24d20 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
24d30 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
24d40 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ..    if( pInode
24d50 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
24d60 30 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e  0 ){.      pShmN
24d70 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f  ode->h = robust_
24d80 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d  open(zShmFilenam
24d90 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  e, O_RDWR|O_CREA
24da0 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
24db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dc0 20 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65    (sStat.st_mode
24dd0 20 26 20 30 37 37 37 29 29 3b 0a 20 20 20 20 20   & 0777));.     
24de0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
24df0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  <0 ){.        co
24e00 6e 73 74 20 63 68 61 72 20 2a 7a 52 4f 3b 0a 20  nst char *zRO;. 
24e10 20 20 20 20 20 20 20 7a 52 4f 20 3d 20 73 71 6c         zRO = sql
24e20 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
24e30 65 72 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  er(pDbFd->zPath,
24e40 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 29   "readonly_shm")
24e50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 52  ;.        if( zR
24e60 4f 20 26 26 20 73 71 6c 69 74 65 33 47 65 74 42  O && sqlite3GetB
24e70 6f 6f 6c 65 61 6e 28 7a 52 4f 29 20 29 7b 0a 20  oolean(zRO) ){. 
24e80 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
24e90 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70  e->h = robust_op
24ea0 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  en(zShmFilename,
24eb0 20 4f 5f 52 44 4f 4e 4c 59 2c 0a 20 20 20 20 20   O_RDONLY,.     
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
24ee0 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20  sStat.st_mode & 
24ef0 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 20 20  0777));.        
24f00 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65    pShmNode->isRe
24f10 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adonly = 1;.    
24f20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
24f30 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
24f40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
24f50 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
24f60 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
24f70 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68  KPT, "open", zSh
24f80 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
24f90 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
24fa0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 20  pen_err;.       
24fb0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20   }.      }.  .  
24fc0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
24fd0 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70  see if another p
24fe0 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
24ff0 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73  g the dead-man s
25000 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20  witch..      ** 
25010 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65  If not, truncate
25020 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
25030 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 20  o length. .     
25040 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
25050 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
25060 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65  if( unixShmSyste
25070 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
25080 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48  F_WRLCK, UNIX_SH
25090 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54  M_DMS, 1)==SQLIT
250a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
250b0 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  if( robust_ftrun
250c0 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cate(pShmNode->h
250d0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
250e0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
250f0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
25100 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e  _SHMOPEN, "ftrun
25110 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e  cate", zShmFilen
25120 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ame);.        }e
25130 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
25140 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 61 73 20  * If running as 
25150 72 6f 6f 74 20 73 65 74 20 74 68 65 20 75 69 64  root set the uid
25160 2f 67 69 64 20 6f 66 20 74 68 65 20 73 68 6d 20  /gid of the shm 
25170 66 69 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68  file to match th
25180 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
25190 20 20 20 20 20 20 20 20 75 69 64 5f 74 20 65 75          uid_t eu
251a0 69 64 20 3d 20 67 65 74 65 75 69 64 28 29 3b 0a  id = geteuid();.
251b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 75            if( eu
251c0 69 64 3d 3d 30 20 26 26 20 28 65 75 69 64 21 3d  id==0 && (euid!=
251d0 73 53 74 61 74 2e 73 74 5f 75 69 64 20 7c 7c 20  sStat.st_uid || 
251e0 67 65 74 65 67 69 64 28 29 21 3d 73 53 74 61 74  getegid()!=sStat
251f0 2e 73 74 5f 67 69 64 29 20 29 7b 0a 20 20 20 20  .st_gid) ){.    
25200 20 20 20 20 20 20 20 20 69 66 28 20 66 63 68 6f          if( fcho
25210 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  wn(pShmNode->h, 
25220 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53  sStat.st_uid, sS
25230 74 61 74 2e 73 74 5f 67 69 64 29 20 29 7b 0a 20  tat.st_gid) ){. 
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
25250 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  = SQLITE_IOERR_S
25260 48 4d 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20  HMOPEN;.        
25270 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25280 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
25290 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
252a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
252b0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
252c0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
252d0 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c  hmNode, F_RDLCK,
252e0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
252f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
25300 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
25310 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
25320 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
25330 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
25340 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
25350 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
25360 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
25370 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
25380 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
25390 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
253a0 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
253b0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
253c0 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
253d0 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
253e0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
253f0 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
25400 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
25410 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
25420 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
25430 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
25440 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
25450 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
25460 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
25470 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
25480 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
25490 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a  uct unixShm) obj
254a0 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
254b0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
254c0 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
254d0 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
254e0 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
254f0 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
25500 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
25510 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
25520 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
25530 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
25540 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
25550 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
25560 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
25570 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
25580 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
25590 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
255a0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
255b0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
255c0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
255d0 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
255e0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
255f0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
25600 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25610 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
25620 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
25630 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
25640 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
25650 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54  bFd);       /* T
25660 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
25670 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
25680 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
25690 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78  _free(p);.  unix
256a0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
256b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
256c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
256d0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
256e0 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
256f0 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
25700 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
25710 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
25720 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
25730 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
25740 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
25750 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
25760 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
25770 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
25780 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
25790 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
257a0 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
257b0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
257c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
257d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
257e0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
257f0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
25800 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
25810 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
25820 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
25830 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
25840 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
25850 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
25860 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
25870 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
25880 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
25890 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
258a0 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
258b0 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
258c0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
258d0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
258e0 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64  . If .** bExtend
258f0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
25900 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
25910 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
25920 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
25930 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
25940 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
25950 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
25960 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
25970 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
25980 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
25990 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
259a0 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
259b0 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
259c0 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
259d0 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
259e0 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
259f0 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
25a00 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
25a10 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
25a20 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
25a30 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
25a40 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
25a50 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
25a60 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
25a70 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
25a80 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
25a90 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
25aa0 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
25ab0 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
25ac0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
25ad0 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25af0 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
25b00 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
25b10 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
25b20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
25b30 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
25b40 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20  int bExtend,    
25b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b60 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
25b70 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
25b80 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
25b90 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
25ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
25bb0 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
25bc0 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
25bd0 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
25be0 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
25bf0 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  m *p;.  unixShmN
25c00 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
25c10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25c20 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  _OK;..  /* If th
25c30 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
25c40 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
25c50 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
25c60 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
25c70 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  if( pDbFd->pShm=
25c80 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75  =0 ){.    rc = u
25c90 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
25ca0 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
25cb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25cc0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
25cd0 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d   }..  p = pDbFd-
25ce0 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64  >pShm;.  pShmNod
25cf0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
25d00 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
25d10 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
25d20 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
25d30 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68  t( szRegion==pSh
25d40 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
25d50 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
25d60 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  gion==0 );.  ass
25d70 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
25d80 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
25d90 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
25da0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
25db0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
25dc0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
25dd0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
25de0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
25df0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
25e00 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
25e10 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
25e20 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
25e30 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  gion ){.    char
25e40 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20   **apNew;       
25e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e60 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d  * New apRegion[]
25e70 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
25e80 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69  t nByte = (iRegi
25e90 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20  on+1)*szRegion; 
25ea0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
25eb0 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
25ec0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
25ed0 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
25ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
25ef0 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a   by fstat() */..
25f00 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
25f10 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
25f20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d  n;..    if( pShm
25f30 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
25f40 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
25f50 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
25f60 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
25f70 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
25f80 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
25f90 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
25fa0 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65  ee if it has bee
25fb0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65  n allocated (i.e
25fc0 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  . if the wal-ind
25fd0 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20  ex file is.     
25fe0 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
25ff0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
26000 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
26010 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
26020 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53    if( osFstat(pS
26030 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61  hmNode->h, &sSta
26040 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
26050 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
26060 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  SHMSIZE;.       
26070 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
26080 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  t;.      }.  .  
26090 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74      if( sStat.st
260a0 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20  _size<nByte ){. 
260b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
260c0 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
260d0 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
260e0 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64  xist. If bExtend
260f0 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
26100 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69     ** false, exi
26110 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
26120 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
26130 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
26140 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20  eturned..       
26150 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
26160 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66  lternatively, if
26170 20 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65   bExtend is true
26180 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28  , use ftruncate(
26190 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ) to allocate.  
261a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71        ** the req
261b0 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
261c0 67 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  gion..        */
261d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 62 45  .        if( !bE
261e0 78 74 65 6e 64 20 29 20 67 6f 74 6f 20 73 68 6d  xtend ) goto shm
261f0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
26200 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
26210 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
26220 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20  >h, nByte) ){.  
26230 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
26240 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
26250 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
26260 22 66 74 72 75 6e 63 61 74 65 22 2c 0a 20 20 20  "ftruncate",.   
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26280 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
26290 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
262a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
262b0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
262c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
262d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
262e0 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
262f0 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
26300 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
26310 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
26320 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68  .    apNew = (ch
26330 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65  ar **)sqlite3_re
26340 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
26350 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
26360 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73  n, (iRegion+1)*s
26370 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20  izeof(char *).  
26380 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70    );.    if( !ap
26390 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20  New ){.      rc 
263a0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
263b0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
263c0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
263d0 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65    }.    pShmNode
263e0 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e  ->apRegion = apN
263f0 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 70 53  ew;.    while(pS
26400 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
26410 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20 20  =iRegion){.     
26420 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20   void *pMem;.   
26430 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
26440 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >h>=0 ){.       
26450 20 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30 2c 20   pMem = mmap(0, 
26460 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20  szRegion,.      
26470 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
26480 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f  isReadonly ? PRO
26490 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45  T_READ : PROT_RE
264a0 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a  AD|PROT_WRITE, .
264b0 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f              MAP_
264c0 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65  SHARED, pShmNode
264d0 2d 3e 68 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ->h, pShmNode->n
264e0 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 0a  Region*szRegion.
264f0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
26500 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50     if( pMem==MAP
26510 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
26520 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
26530 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
26540 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61  ERR_SHMMAP, "mma
26550 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  p", pShmNode->zF
26560 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
26570 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
26580 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
26590 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
265a0 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69       pMem = sqli
265b0 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67  te3_malloc(szReg
265c0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ion);.        if
265d0 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20  ( pMem==0 ){.   
265e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
265f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
26600 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
26610 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
26620 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
26630 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e  Mem, 0, szRegion
26640 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
26650 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
26660 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
26670 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20  egion] = pMem;. 
26680 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
26690 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  Region++;.    }.
266a0 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
266b0 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
266c0 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
266d0 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70  n ){.    *pp = p
266e0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
266f0 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65  n[iRegion];.  }e
26700 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
26710 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d  ;.  }.  if( pShm
26720 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
26730 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
26740 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  K ) rc = SQLITE_
26750 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69  READONLY;.  sqli
26760 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
26770 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
26780 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
26790 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
267a0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
267b0 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
267c0 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  y segment..**.**
267d0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72   Note that the r
267e0 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
267f0 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45  een SHAREd and E
26800 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69  XCLUSIVE locks i
26810 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69  s a little.** di
26820 66 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61  fferent here tha
26830 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20  n in posix.  In 
26840 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20  xShmLock(), one 
26850 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f  can go from unlo
26860 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65  cked.** to share
26870 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72  d and back or fr
26880 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65  om unlocked to e
26890 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63  xclusive and bac
268a0 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a  k.  But one may.
268b0 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73  ** not go from s
268c0 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69  hared to exclusi
268d0 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75  ve or from exclu
268e0 73 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a  sive to shared..
268f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
26900 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  ixShmLock(.  sql
26910 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
26920 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
26930 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
26940 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
26950 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
26960 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26970 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
26980 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
26990 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
269a0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
269b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
269c0 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
269d0 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
269e0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
269f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a00 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
26a10 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
26a20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
26a30 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
26a40 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  )fd;      /* Con
26a50 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
26a60 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
26a70 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  .  unixShm *p = 
26a80 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
26a90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26aa0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
26ab0 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
26ac0 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20  unixShm *pX;    
26ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ae0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
26af0 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
26b00 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78  blings */.  unix
26b10 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
26b20 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
26b30 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
26b40 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a  ing file iNode *
26b50 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
26b60 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
26b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
26b80 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  ult code */.  u1
26b90 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  6 mask;         
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bb0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c      /* Mask of l
26bc0 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20  ocks to take or 
26bd0 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73  release */..  as
26be0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
26bf0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
26c00 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
26c10 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
26c20 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
26c30 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
26c40 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73  ( ofst>=0 && ofs
26c50 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  t+n<=SQLITE_SHM_
26c60 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  NLOCK );.  asser
26c70 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73  t( n>=1 );.  ass
26c80 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c  ert( flags==(SQL
26c90 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
26ca0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
26cb0 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
26cc0 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
26cd0 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
26ce0 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20  _EXCLUSIVE).    
26cf0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
26d00 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
26d10 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
26d20 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
26d30 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
26d40 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
26d50 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
26d60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
26d70 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  =1 || (flags & S
26d80 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
26d90 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  IVE)!=0 );.  ass
26da0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
26db0 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
26dc0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
26dd0 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
26de0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
26df0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
26e00 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
26e10 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
26e20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  (1<<(ofst+n)) - 
26e30 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73  (1<<ofst);.  ass
26e40 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
26e50 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
26e60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
26e70 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
26e80 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
26e90 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
26ea0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
26eb0 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
26ec0 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
26ed0 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
26ee0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
26ef0 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
26f00 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
26f10 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
26f20 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
26f30 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
26f40 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
26f50 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
26f60 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
26f70 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
26f80 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
26f90 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
26fa0 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
26fb0 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
26fc0 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
26fd0 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
26fe0 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
26ff0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
27000 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
27010 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
27020 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
27030 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43  pShmNode, F_UNLC
27040 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
27050 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
27060 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
27070 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
27080 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
27090 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
270a0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
270b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
270c0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
270d0 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
270e0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
270f0 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
27100 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
27110 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
27120 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
27130 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
27140 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
27150 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
27160 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
27170 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
27180 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
27190 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
271a0 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
271b0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
271c0 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
271d0 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
271e0 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
271f0 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
27200 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
27210 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
27220 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
27230 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
27240 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
27250 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
27260 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
27270 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
27280 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27290 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
272a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
272b0 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
272c0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
272d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
272e0 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
272f0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
27300 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
27310 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
27320 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27330 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
27340 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
27350 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
27360 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
27370 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c  (pShmNode, F_RDL
27380 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
27390 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
273a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
273b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
273c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
273d0 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c      /* Get the l
273e0 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b  ocal shared lock
273f0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
27400 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27410 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
27420 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
27430 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
27440 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69   Make sure no si
27450 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
27460 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61  s hold locks tha
27470 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69  t will block thi
27480 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20  s.    ** lock.  
27490 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72  If any do, retur
274a0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69  n SQLITE_BUSY ri
274b0 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f  ght away..    */
274c0 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
274d0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
274e0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
274f0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
27500 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
27510 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72  !=0 || (pX->shar
27520 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  edMask & mask)!=
27530 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
27540 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
27550 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
27560 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
27570 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78     /* Get the ex
27580 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74  clusive locks at
27590 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
275a0 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63  l.  Then if succ
275b0 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c  essful.    ** al
275c0 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61  so mark the loca
275d0 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20  l connection as 
275e0 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20  being locked..  
275f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
27600 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27610 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
27620 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
27630 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66  ode, F_WRLCK, of
27640 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
27650 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
27660 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27670 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27680 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20   (p->sharedMask 
27690 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20  & mask)==0 );.  
276a0 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
276b0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
276c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
276d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
276e0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
276f0 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
27700 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d  "SHM-LOCK shmid-
27710 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25  %d, pid-%d got %
27720 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
27730 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67          p->id, g
27740 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61 72  etpid(), p->shar
27750 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d  edMask, p->exclM
27760 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ask));.  return 
27770 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
27780 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
27790 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
277a0 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
277b0 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a  d memory.  .**.*
277c0 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
277d0 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
277e0 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
277f0 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
27800 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
27810 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
27820 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
27830 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
27840 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72  d unixShmBarrier
27850 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
27860 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20   *fd            
27870 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
27880 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
27890 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
278a0 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
278b0 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 75  RAMETER(fd);.  u
278c0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
278d0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
278e0 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  x();.}../*.** Cl
278f0 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ose a connection
27900 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   to shared-memor
27910 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75  y.  Delete the u
27920 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74  nderlying .** st
27930 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46  orage if deleteF
27940 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lag is true..**.
27950 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  ** If there is n
27960 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  o shared memory 
27970 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
27980 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
27990 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
279a0 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73  ine is a harmles
279b0 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  s no-op..*/.stat
279c0 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e  ic int unixShmUn
279d0 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
279e0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
279f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
27a00 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
27a10 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
27a20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20  deleteFlag      
27a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
27a40 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d  elete shared-mem
27a50 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ory if true */.)
27a60 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20  {.  unixShm *p; 
27a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a80 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
27a90 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73  ction to be clos
27aa0 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  ed */.  unixShmN
27ab0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
27ac0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
27ad0 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
27ae0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
27af0 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20    unixShm **pp; 
27b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b10 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
27b20 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f   over sibling co
27b30 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75  nnections */.  u
27b40 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  nixFile *pDbFd; 
27b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27b60 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
27b70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
27b80 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e  /..  pDbFd = (un
27b90 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  ixFile*)fd;.  p 
27ba0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
27bb0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
27bc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
27bd0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
27be0 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72  hmNode;..  asser
27bf0 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
27c00 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
27c10 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
27c20 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
27c30 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
27c40 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  e );..  /* Remov
27c50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66  e connection p f
27c60 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63  rom the set of c
27c70 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63  onnections assoc
27c80 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20  iated.  ** with 
27c90 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71  pShmNode */.  sq
27ca0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
27cb0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
27cc0 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53  x);.  for(pp=&pS
27cd0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
27ce0 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26  (*pp)!=p; pp = &
27cf0 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a  (*pp)->pNext){}.
27d00 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
27d10 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
27d20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f   connection p */
27d30 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
27d40 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  p);.  pDbFd->pSh
27d50 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  m = 0;.  sqlite3
27d60 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
27d70 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  mNode->mutex);..
27d80 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65    /* If pShmNode
27d90 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68  ->nRef has reach
27da0 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ed 0, then close
27db0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
27dc0 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f    ** shared-memo
27dd0 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a  ry file, too */.
27de0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
27df0 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ();.  assert( pS
27e00 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29  hmNode->nRef>0 )
27e10 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ;.  pShmNode->nR
27e20 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d  ef--;.  if( pShm
27e30 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Node->nRef==0 ){
27e40 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46  .    if( deleteF
27e50 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d  lag && pShmNode-
27e60 3e 68 3e 3d 30 20 29 20 6f 73 55 6e 6c 69 6e 6b  >h>=0 ) osUnlink
27e70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
27e80 6e 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78 53  name);.    unixS
27e90 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a  hmPurge(pDbFd);.
27ea0 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
27eb0 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
27ec0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
27ed0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
27ee0 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30  unixShmMap     0
27ef0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
27f00 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66  mLock    0.# def
27f10 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69  ine unixShmBarri
27f20 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e  er 0.# define un
27f30 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23  ixShmUnmap   0.#
27f40 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
27f50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
27f60 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20   */../*.** Here 
27f70 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ends the impleme
27f80 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  ntation of all s
27f90 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
27fa0 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ods..**.********
27fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
27fc0 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nd sqlite3_file 
27fd0 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  Methods ********
27fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ff0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
28000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28040 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
28050 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
28060 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
28070 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f  s of sqlite3_io_
28080 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
28090 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  that.** implemen
280a0 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c  t various file l
280b0 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
280c0 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74  s.  It also cont
280d0 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
280e0 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20  .** of "finder" 
280f0 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69  functions.  A fi
28100 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
28110 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20   used to locate 
28120 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  the appropriate.
28130 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ** sqlite3_io_me
28140 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72  thods object for
28150 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
28160 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
28170 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69  e pAppData.** fi
28180 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74  eld of the sqlit
28190 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63  e3_vfs VFS objec
281a0 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ts are initializ
281b0 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72  ed to be pointer
281c0 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72  s to.** the corr
281d0 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ect finder-funct
281e0 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53  ion for that VFS
281f0 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e  ..**.** Most fin
28200 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  der functions re
28210 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
28220 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65  o a fixed sqlite
28230 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
28240 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c  object.  The onl
28250 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69  y interesting fi
28260 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
28270 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
28280 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b  r, which.** look
28290 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73  s at the filesys
282a0 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69  tem type and tri
282b0 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20  es to guess the 
282c0 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  best locking.** 
282d0 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68  strategy from th
282e0 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69  at..**.** For fi
282f0 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20  nder-funtion F, 
28300 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20  two objects are 
28310 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  created:.**.**  
28320 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66    (1) The real f
28330 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e  inder-function n
28340 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a  amed "FImpt()"..
28350 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63  **.**    (2) A c
28360 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20  onstant pointer 
28370 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
28380 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e   named just "F".
28390 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e  .**.**.** A poin
283a0 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69  ter to the F poi
283b0 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20  nter is used as 
283c0 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c  the pAppData val
283d0 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62  ue for VFS.** ob
283e0 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20  jects.  We have 
283f0 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65  to do this inste
28400 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41  ad of letting pA
28410 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20  ppData point.** 
28420 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20  directly at the 
28430 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
28440 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20  since C90 rules 
28450 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a  prevent a void*.
28460 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20  ** from be cast 
28470 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  into a function 
28480 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a  pointer..**.**.*
28490 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20  * Each instance 
284a0 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65  of this macro ge
284b0 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65  nerates two obje
284c0 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  cts:.**.**   *  
284d0 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74  A constant sqlit
284e0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
284f0 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44  ject call METHOD
28500 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e   that has lockin
28510 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64  g.**      method
28520 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  s CLOSE, LOCK, U
28530 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b  NLOCK, CKRESLOCK
28540 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  ..**.**   *  An 
28550 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65  I/O method finde
28560 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  r function calle
28570 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65  d FINDER that re
28580 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
28590 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d  **      to the M
285a0 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20  ETHOD object in 
285b0 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c  the previous bul
285c0 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  let..*/.#define 
285d0 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52  IOMETHODS(FINDER
285e0 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49 4f  , METHOD, VERSIO
285f0 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  N, CLOSE, LOCK, 
28600 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20  UNLOCK, CKLOCK) 
28610 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
28620 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
28630 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20  ethods METHOD = 
28640 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28660 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e      \.   VERSION
28670 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28680 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
28690 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
286a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286b0 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20     \.   CLOSE,  
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286d0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
286e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c    \.   unixRead,
28710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28720 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20     /* xRead */  
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c   \.   unixWrite,
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28770 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20    /* xWrite */  
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74  \.   unixTruncat
287b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
287c0 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
287f0 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20  .   unixSync,   
28800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28810 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20  /* xSync */     
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28840 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c     unixFileSize,
28850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28860 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20  * xFileSize */  
28870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28890 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20    LOCK,         
288a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
288b0 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20   xLock */       
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288d0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
288e0 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   UNLOCK,        
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28900 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  xUnlock */      
28910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28920 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28930 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  CKLOCK,         
28940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28950 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
28960 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
28970 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
28980 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  nixFileControl, 
28990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
289a0 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20  ileControl */   
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289c0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
289d0 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  ixSectorSize,   
289e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
289f0 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20  ctorSize */     
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28a20 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
28a30 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76  istics,  /* xDev
28a40 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20  iceCapabilities 
28a50 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28a60 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28a70 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20  ShmMap,         
28a80 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
28a90 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ab0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
28ac0 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
28ad0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
28ae0 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b00 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
28b10 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
28b20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
28b30 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20  rier */         
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b50 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
28b60 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20 20  Unmap           
28b70 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
28b80 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20     \.};         
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bf0 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
28c00 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28c10 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70  ods *FINDER##Imp
28c20 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  l(const char *z,
28c30 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20   unixFile *p){  
28c40 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41   \.  UNUSED_PARA
28c50 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44  METER(z); UNUSED
28c60 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20  _PARAMETER(p);  
28c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c90 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48  \.  return &METH
28ca0 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OD;             
28cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28ce0 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .}              
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28d30 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
28d40 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
28d50 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29  *(*const FINDER)
28d60 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
28d70 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20  xFile *p)    \. 
28d80 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70     = FINDER##Imp
28d90 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61  l;../*.** Here a
28da0 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71  re all of the sq
28db0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
28dc0 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63   objects for eac
28dd0 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  h of the.** lock
28de0 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
28df0 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   Functions that 
28e00 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20  return pointers 
28e10 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73  to these methods
28e20 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65  .** are also cre
28e30 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f  ated..*/.IOMETHO
28e40 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e  DS(.  posixIoFin
28e50 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
28e60 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
28e70 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73  on name */.  pos
28e80 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ixIoMethods,    
28e90 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
28ea0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
28eb0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c  ect name */.  2,
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ed0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
28ee0 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62  d memory is enab
28ef0 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
28f00 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
28f10 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
28f20 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
28f30 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
28f40 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
28f50 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f  od */.  unixUnlo
28f60 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
28f70 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
28f80 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65  hod */.  unixChe
28f90 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
28fa0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
28fb0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
28fc0 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  */.).IOMETHODS(.
28fd0 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72    nolockIoFinder
28fe0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
28ff0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
29000 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49  ame */.  nolockI
29010 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
29020 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
29030 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
29040 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
29050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29060 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
29070 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
29080 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73   */.  nolockClos
29090 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
290a0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
290b0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b   */.  nolockLock
290c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
290d0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
290e0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63  */.  nolockUnloc
290f0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
29100 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
29110 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63   */.  nolockChec
29120 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
29130 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
29140 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
29150 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64  ).IOMETHODS(.  d
29160 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  otlockIoFinder, 
29170 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
29180 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
29190 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d   */.  dotlockIoM
291a0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
291b0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
291c0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
291d0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291f0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
29200 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
29210 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c  .  dotlockClose,
29220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29230 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
29240 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20  .  dotlockLock, 
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29260 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
29270 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c    dotlockUnlock,
29280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29290 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
292a0 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  .  dotlockCheckR
292b0 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20  eservedLock  /* 
292c0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
292d0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a  ck method */.)..
292e0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
292f0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
29300 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49  && !OS_VXWORKS.I
29310 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63  OMETHODS(.  floc
29320 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
29330 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
29340 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
29350 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  .  flockIoMethod
29360 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
29370 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29380 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
29390 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
293a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
293b0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
293c0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
293d0 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  flockClose,     
293e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
293f0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
29400 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  flockLock,      
29410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
29420 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
29430 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
29440 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
29450 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29460 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
29470 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68  edLock    /* xCh
29480 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29490 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
294a0 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  if..#if OS_VXWOR
294b0 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  KS.IOMETHODS(.  
294c0 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  semIoFinder,    
294d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
294e0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
294f0 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68  e */.  semIoMeth
29500 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
29510 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
29520 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
29530 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
29540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29550 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
29560 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
29570 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20  /.  semClose,   
29580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29590 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
295a0 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20  /.  semLock,    
295b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
295c0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
295d0 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20  .  semUnlock,   
295e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
295f0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
29600 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65  /.  semCheckRese
29610 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
29620 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
29630 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
29640 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
29650 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
29660 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
29670 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
29680 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f  METHODS(.  afpIo
29690 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
296a0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
296b0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
296c0 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20    afpIoMethods, 
296d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
296e0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
296f0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
29700 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
29710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29720 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
29730 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61   disabled */.  a
29740 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  fpClose,        
29750 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
29760 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  se method */.  a
29770 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  fpLock,         
29780 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
29790 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  k method */.  af
297a0 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  pUnlock,        
297b0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
297c0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
297d0 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
297e0 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
297f0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
29800 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
29810 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  f../*.** The pro
29820 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  xy locking metho
29830 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65  d is a "super-me
29840 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e  thod" in the sen
29850 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70  se that it.** op
29860 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69  ens secondary fi
29870 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
29880 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64  or the conch and
29890 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a   lock files and.
298a0 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79  ** it uses proxy
298b0 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c  , dot-file, AFP,
298c0 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63   and flock() loc
298d0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
298e0 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61  those.** seconda
298f0 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74  ry files.  For t
29900 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
29910 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
29920 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78  plements.** prox
29930 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63  y locking is loc
29940 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65  ated much furthe
29950 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69  r down in the fi
29960 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  le.  But we need
29970 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20  .** to go ahead 
29980 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73  and define the s
29990 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
299a0 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e  s and finder fun
299b0 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f  ction.** for pro
299c0 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e  xy locking here.
299d0 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20    So we forward 
299e0 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20  declare the I/O 
299f0 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20  methods..*/.#if 
29a00 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
29a10 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
29a20 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
29a30 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  E.static int pro
29a40 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
29a50 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69  file*);.static i
29a60 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c  nt proxyLock(sql
29a70 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
29a80 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
29a90 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
29aa0 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
29ab0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68  atic int proxyCh
29ac0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
29ad0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
29ae0 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28  nt*);.IOMETHODS(
29af0 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72  .  proxyIoFinder
29b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
29b10 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
29b20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49  name */.  proxyI
29b30 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
29b40 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
29b50 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
29b60 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20   name */.  2,   
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b80 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
29b90 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c 65 64  emory is enabled
29ba0 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65   */.  proxyClose
29bb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29bc0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
29bd0 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c   */.  proxyLock,
29be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bf0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
29c00 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b  */.  proxyUnlock
29c10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
29c20 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
29c30 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b   */.  proxyCheck
29c40 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
29c50 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
29c60 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
29c70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73  ).#endif../* nfs
29c80 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30   lockd on OSX 10
29c90 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61  .3+ doesn't clea
29ca0 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68  r write locks wh
29cb0 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
29cc0 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66  s set */.#if def
29cd0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
29ce0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
29cf0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
29d00 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49  OMETHODS(.  nfsI
29d10 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
29d20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
29d30 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
29d40 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73  /.  nfsIoMethods
29d50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
29d60 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
29d70 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
29d80 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
29d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29da0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
29db0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
29dc0 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20  .  unixClose,   
29dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29de0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
29df0 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
29e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29e10 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
29e20 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20  /.  nfsUnlock,  
29e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29e40 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
29e50 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
29e60 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
29e70 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
29e80 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
29e90 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .).#endif..#if d
29ea0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
29eb0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
29ec0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
29ed0 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69  ./* .** This "fi
29ee0 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61  nder" function a
29ef0 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72  ttempts to deter
29f00 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f  mine the best lo
29f10 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a  cking strategy .
29f20 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ** for the datab
29f30 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61  ase file "filePa
29f40 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65  th".  It then re
29f50 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65  turns the sqlite
29f60 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
29f70 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c  object that impl
29f80 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61  ements that stra
29f90 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tegy..**.** This
29fa0 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f   is for MacOSX o
29fb0 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  nly..*/.static c
29fc0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
29fd0 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63  methods *autoloc
29fe0 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20  kIoFinderImpl(. 
29ff0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
2a000 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d  ePath,    /* nam
2a010 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2a020 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
2a030 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20  File *pNew      
2a040 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c       /* open fil
2a050 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  e object for the
2a060 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2a070 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  /.){.  static co
2a080 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70 69  nst struct Mappi
2a090 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ng {.    const c
2a0a0 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d  har *zFilesystem
2a0b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2a0c0 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70  * Filesystem typ
2a0d0 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f  e name */.    co
2a0e0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2a0f0 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73  ethods *pMethods
2a100 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61  ;   /* Appropria
2a110 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  te locking metho
2a120 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20  d */.  } aMap[] 
2a130 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c  = {.    { "hfs",
2a140 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
2a150 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66  ods },.    { "uf
2a160 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d  s",    &posixIoM
2a170 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
2a180 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f  "afpfs",  &afpIo
2a190 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
2a1a0 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49   "smbfs",  &afpI
2a1b0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
2a1c0 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c  { "webdav", &nol
2a1d0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  ockIoMethods },.
2a1e0 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d      { 0, 0 }.  }
2a1f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
2a200 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
2a210 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  o;.  struct floc
2a220 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69  k lockInfo;..  i
2a230 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a  f( !filePath ){.
2a240 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61      /* If filePa
2a250 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  th==NULL that me
2a260 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
2a270 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69  ng with a transi
2a280 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  ent file.    ** 
2a290 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
2a2a0 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e  ed to be locked.
2a2b0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26   */.    return &
2a2c0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
2a2d0 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66  .  }.  if( statf
2a2e0 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49  s(filePath, &fsI
2a2f0 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20  nfo) != -1 ){.  
2a300 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66    if( fsInfo.f_f
2a310 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c  lags & MNT_RDONL
2a320 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  Y ){.      retur
2a330 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
2a340 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ds;.    }.    fo
2a350 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a  r(i=0; aMap[i].z
2a360 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29  Filesystem; i++)
2a370 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
2a380 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
2a390 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e  pename, aMap[i].
2a3a0 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20  zFilesystem)==0 
2a3b0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2a3c0 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f  n aMap[i].pMetho
2a3d0 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ds;.      }.    
2a3e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61  }.  }..  /* Defa
2a3f0 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65  ult case. Handle
2a400 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72  s, amongst other
2a410 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54  s, "nfs"..  ** T
2a420 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  est byte-range l
2a430 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28  ock using fcntl(
2a440 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73  ). If the call s
2a450 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61  ucceeds, .  ** a
2a460 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66  ssume that the f
2a470 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f  ile-system suppo
2a480 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20  rts POSIX style 
2a490 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c  locks. .  */.  l
2a4a0 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20  ockInfo.l_len = 
2a4b0 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  1;.  lockInfo.l_
2a4c0 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63  start = 0;.  loc
2a4d0 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d  kInfo.l_whence =
2a4e0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
2a4f0 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46  kInfo.l_type = F
2a500 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73  _RDLCK;.  if( os
2a510 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46  Fcntl(pNew->h, F
2a520 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66  _GETLK, &lockInf
2a530 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  o)!=-1 ) {.    i
2a540 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
2a550 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22  .f_fstypename, "
2a560 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nfs")==0 ){.    
2a570 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d    return &nfsIoM
2a580 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c  ethods;.    } el
2a590 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  se {.      retur
2a5a0 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
2a5b0 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  s;.    }.  }else
2a5c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f  {.    return &do
2a5d0 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  tlockIoMethods;.
2a5e0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e    }.}.static con
2a5f0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2a600 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73  thods .  *(*cons
2a610 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  t autolockIoFind
2a620 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  er)(const char*,
2a630 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74  unixFile*) = aut
2a640 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
2a650 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  l;..#endif /* de
2a660 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2a670 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2a680 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
2a690 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  */..#if OS_VXWOR
2a6a0 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  KS && SQLITE_ENA
2a6b0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2a6c0 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66  E./* .** This "f
2a6d0 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20  inder" function 
2a6e0 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
2a6f0 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c  rmine the best l
2a700 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
2a710 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61  .** for the data
2a720 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50  base file "fileP
2a730 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72  ath".  It then r
2a740 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74  eturns the sqlit
2a750 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
2a760 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
2a770 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72  lements that str
2a780 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ategy..**.** Thi
2a790 73 20 69 73 20 66 6f 72 20 56 58 57 6f 72 6b 73  s is for VXWorks
2a7a0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
2a7b0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2a7c0 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c  o_methods *autol
2a7d0 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28  ockIoFinderImpl(
2a7e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
2a7f0 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e  ilePath,    /* n
2a800 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2a810 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ase file */.  un
2a820 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20  ixFile *pNew    
2a830 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70         /* the op
2a840 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a  en file object *
2a850 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  /.){.  struct fl
2a860 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20  ock lockInfo;.. 
2a870 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29   if( !filePath )
2a880 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65  {.    /* If file
2a890 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Path==NULL that 
2a8a0 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
2a8b0 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e  ling with a tran
2a8c0 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a  sient file.    *
2a8d0 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  * that does not 
2a8e0 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
2a8f0 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
2a900 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2a910 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73  s;.  }..  /* Tes
2a920 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20  t if fcntl() is 
2a930 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73  supported and us
2a940 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  e POSIX style lo
2a950 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  cks..  ** Otherw
2a960 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ise fall back to
2a970 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
2a980 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a  hore method..  *
2a990 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
2a9a0 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
2a9b0 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
2a9c0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
2a9d0 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
2a9e0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
2a9f0 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
2aa00 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d  f( osFcntl(pNew-
2aa10 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
2aa20 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a  ckInfo)!=-1 ) {.
2aa30 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69      return &posi
2aa40 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  xIoMethods;.  }e
2aa50 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2aa60 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &semIoMethods;. 
2aa70 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73   }.}.static cons
2aa80 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2aa90 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74  hods .  *(*const
2aaa0 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
2aab0 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  r)(const char*,u
2aac0 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f  nixFile*) = auto
2aad0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
2aae0 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  ;..#endif /* OS_
2aaf0 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54  VXWORKS && SQLIT
2ab00 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2ab10 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STYLE */../*.**
2ab20 20 41 6e 20 61 62 73 74 72 61 63 74 20 74 79 70   An abstract typ
2ab30 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20  e for a pointer 
2ab40 74 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64 20 66  to a IO method f
2ab50 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a  inder function:.
2ab60 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74  */.typedef const
2ab70 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2ab80 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79  ods *(*finder_ty
2ab90 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pe)(const char*,
2aba0 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a  unixFile*);.../*
2abb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
2ac00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac10 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33  ******** sqlite3
2ac20 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
2ac30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac40 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
2ac50 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
2ac60 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
2ac70 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74  mentation of met
2ac80 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73  hods on the.** s
2ac90 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
2aca0 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  t..*/../*.** Ini
2acb0 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74  tialize the cont
2acc0 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78  ents of the unix
2acd0 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  File structure p
2ace0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64  ointed to by pId
2acf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ad00 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a  fillInUnixFile(.
2ad10 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2ad20 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  Vfs,      /* Poi
2ad30 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
2ad40 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20  ct */.  int h,  
2ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad60 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
2ad70 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20  criptor of file 
2ad80 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
2ad90 20 20 69 6e 74 20 73 79 6e 63 44 69 72 2c 20 20    int syncDir,  
2ada0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2adb0 65 20 74 6f 20 73 79 6e 63 20 64 69 72 65 63 74  e to sync direct
2adc0 6f 72 79 20 6f 6e 20 66 69 72 73 74 20 73 79 6e  ory on first syn
2add0 63 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  c */.  sqlite3_f
2ade0 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f  ile *pId,      /
2adf0 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
2ae00 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
2ae10 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
2ae20 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2ae30 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
2ae40 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
2ae50 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  ened */.  int no
2ae60 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2ae70 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e    /* Omit lockin
2ae80 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69  g if true */.  i
2ae90 6e 74 20 69 73 44 65 6c 65 74 65 2c 20 20 20 20  nt isDelete,    
2aea0 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
2aeb0 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75   on close if tru
2aec0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65 61  e */.  int isRea
2aed0 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 2f  dOnly          /
2aee0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 66 69  * True if the fi
2aef0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
2af00 64 2d 6f 6e 6c 79 20 2a 2f 0a 29 7b 0a 20 20 63  d-only */.){.  c
2af10 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2af20 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e  methods *pLockin
2af30 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69  gStyle;.  unixFi
2af40 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78  le *pNew = (unix
2af50 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e  File *)pId;.  in
2af60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2af70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
2af80 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20  w->pInode==NULL 
2af90 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74  );..  /* Paramet
2afa0 65 72 20 69 73 44 65 6c 65 74 65 20 69 73 20 6f  er isDelete is o
2afb0 6e 6c 79 20 75 73 65 64 20 6f 6e 20 76 78 77 6f  nly used on vxwo
2afc0 72 6b 73 2e 20 45 78 70 72 65 73 73 20 74 68 69  rks. Express thi
2afd0 73 20 65 78 70 6c 69 63 69 74 6c 79 20 0a 20 20  s explicitly .  
2afe0 2a 2a 20 68 65 72 65 20 74 6f 20 70 72 65 76 65  ** here to preve
2aff0 6e 74 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  nt compiler warn
2b000 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73 65  ings about unuse
2b010 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20  d parameters..  
2b020 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
2b030 4d 45 54 45 52 28 69 73 44 65 6c 65 74 65 29 3b  METER(isDelete);
2b040 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74  ..  /* Usually t
2b050 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d  he path zFilenam
2b060 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
2b070 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
2b080 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78  ame. The.  ** ex
2b090 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20  ception is when 
2b0a0 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78  opening the prox
2b0b0 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69  y "conch" file i
2b0c0 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20  n builds that.  
2b0d0 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73  ** include the s
2b0e0 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63  pecial Apple loc
2b0f0 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a  king styles..  *
2b100 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
2b110 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2b120 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2b130 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74  G_STYLE.  assert
2b140 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
2b150 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
2b160 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73  '/' .    || pVfs
2b170 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69  ->pAppData==(voi
2b180 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  d*)&autolockIoFi
2b190 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20  nder );.#else.  
2b1a0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
2b1b0 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
2b1c0 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e  e[0]=='/' );.#en
2b1d0 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
2b1e0 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
2b1f0 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
2b200 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d  e));.  pNew->h =
2b210 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74   h;.  pNew->zPat
2b220 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
2b230 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 56 66 73   if( memcmp(pVfs
2b240 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78  ->zName,"unix-ex
2b250 63 6c 22 2c 31 30 29 3d 3d 30 20 29 7b 0a 20 20  cl",10)==0 ){.  
2b260 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2b270 73 20 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43  s = UNIXFILE_EXC
2b280 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
2b290 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2b2a0 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  = 0;.  }.  if( i
2b2b0 73 52 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  sReadOnly ){.   
2b2c0 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2b2d0 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f   |= UNIXFILE_RDO
2b2e0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  NLY;.  }.  if( s
2b2f0 79 6e 63 44 69 72 20 29 7b 0a 20 20 20 20 70 4e  yncDir ){.    pN
2b300 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  ew->ctrlFlags |=
2b310 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2b320 43 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  C;.  }..#if OS_V
2b330 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70  XWORKS.  pNew->p
2b340 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64  Id = vxworksFind
2b350 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65  FileId(zFilename
2b360 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70  );.  if( pNew->p
2b370 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 4c  Id==0 ){.    noL
2b380 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20  ock = 1;.    rc 
2b390 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2b3a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
2b3b0 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( noLock ){.    
2b3c0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20  pLockingStyle = 
2b3d0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2b3e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2b3f0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28  LockingStyle = (
2b400 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29  **(finder_type*)
2b410 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28  pVfs->pAppData)(
2b420 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29  zFilename, pNew)
2b430 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
2b440 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2b450 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a  E.    /* Cache z
2b460 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20  Filename in the 
2b470 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
2b480 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b  (AFP and dotlock
2b490 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20   override) for. 
2b4a0 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20     ** proxyLock 
2b4b0 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f  activation is po
2b4c0 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70  ssible (remote p
2b4d0 72 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e  roxy is based on
2b4e0 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a   db name).    **
2b4f0 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69   zFilename remai
2b500 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66  ns valid until f
2b510 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74  ile is closed, t
2b520 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20  o support */.   
2b530 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
2b540 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a  ntext = (void*)z
2b550 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66  Filename;.#endif
2b560 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63  .  }..  if( pLoc
2b570 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f  kingStyle == &po
2b580 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66  sixIoMethods.#if
2b590 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2b5a0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2b5b0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2b5c0 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69  LE.    || pLocki
2b5d0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49  ngStyle == &nfsI
2b5e0 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a  oMethods.#endif.
2b5f0 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74    ){.    unixEnt
2b600 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
2b610 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
2b620 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
2b630 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  Inode);.    if( 
2b640 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2b650 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20  .      /* If an 
2b660 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e  error occured in
2b670 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
2b680 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  , close the file
2b690 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20   descriptor.    
2b6a0 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
2b6b0 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69  , before releasi
2b6c0 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69  ng the mutex. fi
2b6d0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61  ndInodeInfo() ma
2b6e0 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20  y fail.      ** 
2b6f0 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
2b700 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
2b710 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c   **   (a) A call
2b720 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c   to fstat() fail
2b730 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28  ed..      **   (
2b740 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  b) A malloc fail
2b750 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
2b760 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28     ** Scenario (
2b770 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75  b) may only occu
2b780 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73  r if the process
2b790 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f   is holding no o
2b7a0 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69  ther.      ** fi
2b7b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
2b7c0 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
2b7d0 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77  file. If there w
2b7e0 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20  ere other file. 
2b7f0 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
2b800 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ors on this file
2b810 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63  , then no malloc
2b820 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72   would be requir
2b830 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66  ed by.      ** f
2b840 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20  indInodeInfo(). 
2b850 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
2b860 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65  ase, it is quite
2b870 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20   safe to close. 
2b880 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68       ** handle h
2b890 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72   - as it is guar
2b8a0 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70  anteed that no p
2b8b0 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  osix locks will 
2b8c0 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  be released.    
2b8d0 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f    ** by doing so
2b8e0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2b8f0 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20   ** If scenario 
2b900 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65  (a) caused the e
2b910 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73  rror then things
2b920 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65   are not so safe
2b930 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  . The.      ** i
2b940 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69  mplicit assumpti
2b950 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20  on here is that 
2b960 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73  if fstat() fails
2b970 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a  , things are in.
2b980 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61        ** such ba
2b990 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f  d shape that dro
2b9a0 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20  pping a lock or 
2b9b0 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  two doesn't matt
2b9c0 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a  er much..      *
2b9d0 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  /.      robust_c
2b9e0 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2b9f0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68  LINE__);.      h
2ba00 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2ba10 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2ba20 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
2ba30 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2ba40 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
2ba50 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
2ba60 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2ba70 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f  gStyle == &afpIo
2ba80 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2ba90 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73  * AFP locking us
2baa0 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
2bab0 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
2bac0 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
2bad0 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
2bae0 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20  kingContext..   
2baf0 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69   */.    afpLocki
2bb00 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
2bb10 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2bb20 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
2bb30 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2bb40 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  c( sizeof(*pCtx)
2bb50 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78   );.    if( pCtx
2bb60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2bb70 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2bb80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bb90 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d   /* NB: zFilenam
2bba0 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d  e exists and rem
2bbb0 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
2bbc0 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
2bbd0 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63  sed.      ** acc
2bbe0 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72  ording to requir
2bbf0 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53  ement F11141.  S
2bc00 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  o we do not need
2bc10 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20   to make a.     
2bc20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
2bc30 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  filename. */.   
2bc40 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
2bc50 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  = zFilename;.   
2bc60 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65     pCtx->reserve
2bc70 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61  d = 0;.      sra
2bc80 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20  ndomdev();.     
2bc90 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2bca0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  );.      rc = fi
2bcb0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
2bcc0 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
2bcd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2bce0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bcf0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2bd00 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43  e(pNew->lockingC
2bd10 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
2bd20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2bd30 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2bd40 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31  ;.        h = -1
2bd50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bd60 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2bd70 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a  ;        .    }.
2bd80 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c    }.#endif..  el
2bd90 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
2bda0 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  tyle == &dotlock
2bdb0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2bdc0 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b   /* Dotfile lock
2bdd0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
2bde0 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
2bdf0 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
2be00 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
2be10 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
2be20 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20  ntext .    */.  
2be30 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
2be40 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  e;.    int nFile
2be50 6e 61 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e  name;.    nFilen
2be60 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ame = (int)strle
2be70 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36  n(zFilename) + 6
2be80 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20  ;.    zLockFile 
2be90 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
2bea0 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61  3_malloc(nFilena
2beb0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f  me);.    if( zLo
2bec0 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  ckFile==0 ){.   
2bed0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2bee0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
2bef0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2bf00 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d  nprintf(nFilenam
2bf10 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25  e, zLockFile, "%
2bf20 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  s" DOTLOCK_SUFFI
2bf30 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  X, zFilename);. 
2bf40 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c     }.    pNew->l
2bf50 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
2bf60 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a  zLockFile;.  }..
2bf70 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2bf80 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2bf90 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49  ngStyle == &semI
2bfa0 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2bfb0 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  /* Named semapho
2bfc0 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  re locking uses 
2bfd0 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
2bfe0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a   it needs to be.
2bff0 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20      ** included 
2c000 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e  in the semLockin
2c010 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a  gContext.    */.
2c020 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2c030 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
2c040 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
2c050 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
2c060 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d  );.    if( (rc==
2c070 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70  SQLITE_OK) && (p
2c080 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
2c090 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  m==NULL) ){.    
2c0a0 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65    char *zSemName
2c0b0 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d   = pNew->pInode-
2c0c0 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20  >aSemName;.     
2c0d0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71   int n;.      sq
2c0e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
2c0f0 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65  AX_PATHNAME, zSe
2c100 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22  mName, "/%s.sem"
2c110 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c120 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
2c130 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
2c140 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20  me);.      for( 
2c150 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  n=1; zSemName[n]
2c160 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20  ; n++ ).        
2c170 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d  if( zSemName[n]=
2c180 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b  ='/' ) zSemName[
2c190 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20  n] = '_';.      
2c1a0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2c1b0 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53  em = sem_open(zS
2c1c0 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c  emName, O_CREAT,
2c1d0 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20   0666, 1);.     
2c1e0 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64   if( pNew->pInod
2c1f0 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46  e->pSem == SEM_F
2c200 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
2c210 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2c220 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EM;.        pNew
2c230 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
2c240 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  me[0] = '\0';.  
2c250 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2c260 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2c270 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
2c280 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e    pNew->lastErrn
2c290 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58  o = 0;.#if OS_VX
2c2a0 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d  WORKS.  if( rc!=
2c2b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c2c0 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75   if( h>=0 ) robu
2c2d0 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
2c2e0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2c2f0 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55   h = -1;.    osU
2c300 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
2c310 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d  ;.    isDelete =
2c320 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
2c330 69 73 44 65 6c 65 74 65 20 3d 20 69 73 44 65 6c  isDelete = isDel
2c340 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ete;.#endif.  if
2c350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c360 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20  ){.    if( h>=0 
2c370 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
2c380 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
2c390 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c3a0 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
2c3b0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
2c3c0 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b     OpenCounter(+
2c3d0 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
2c3e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
2c3f0 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
2c400 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20   a directory in 
2c410 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d  which to put tem
2c420 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a  porary files..**
2c430 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20   If no suitable 
2c440 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64  temporary file d
2c450 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20  irectory can be 
2c460 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55  found, return NU
2c470 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  LL..*/.static co
2c480 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65  nst char *unixTe
2c490 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b  mpFileDir(void){
2c4a0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2c4b0 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d  char *azDirs[] =
2c4c0 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20   {.     0,.     
2c4d0 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  0,.     "/var/tm
2c4e0 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74  p",.     "/usr/t
2c4f0 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22  mp",.     "/tmp"
2c500 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20 20 20  ,.     0        
2c510 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74  /* List terminat
2c520 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73  or */.  };.  uns
2c530 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73  igned int i;.  s
2c540 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
2c550 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2c560 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72  ir = 0;..  azDir
2c570 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74  s[0] = sqlite3_t
2c580 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
2c590 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20   if( !azDirs[1] 
2c5a0 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65  ) azDirs[1] = ge
2c5b0 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a  tenv("TMPDIR");.
2c5c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
2c5d0 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65  eof(azDirs)/size
2c5e0 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a  of(azDirs[0]); z
2c5f0 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29  Dir=azDirs[i++])
2c600 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d  {.    if( zDir==
2c610 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2c620 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69    if( osStat(zDi
2c630 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69  r, &buf) ) conti
2c640 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f  nue;.    if( !S_
2c650 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
2c660 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
2c670 20 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28     if( osAccess(
2c680 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74  zDir, 07) ) cont
2c690 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b  inue;.    break;
2c6a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44  .  }.  return zD
2c6b0 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ir;.}../*.** Cre
2c6c0 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
2c6d0 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75  file name in zBu
2c6e0 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65  f.  zBuf must be
2c6f0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
2c700 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
2c710 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65  cess and must be
2c720 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
2c730 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  old at least.** 
2c740 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2c750 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
2c760 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d  c int unixGetTem
2c770 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
2c780 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
2c790 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
2c7a0 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73  gned char zChars
2c7b0 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
2c7c0 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
2c7d0 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
2c7e0 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
2c7f0 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
2c800 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67  456789";.  unsig
2c810 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ned int i, j;.  
2c820 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
2c830 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
2c840 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
2c850 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
2c860 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
2c870 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
2c880 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
2c890 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
2c8a0 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
2c8b0 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
2c8c0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
2c8d0 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69  ling. .  */.  Si
2c8e0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
2c8f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2c900 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20  RR );..  zDir = 
2c910 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
2c920 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  );.  if( zDir==0
2c930 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a   ) zDir = ".";..
2c940 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2c950 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
2c960 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  r is large enoug
2c970 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  h for the tempor
2c980 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e  ary file .  ** n
2c990 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ame. If it is no
2c9a0 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
2c9b0 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69  _ERROR..  */.  i
2c9c0 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29  f( (strlen(zDir)
2c9d0 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45   + strlen(SQLITE
2c9e0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
2c9f0 58 29 20 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a  X) + 17) >= (siz
2ca00 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20  e_t)nBuf ){.    
2ca10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2ca20 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a  ROR;.  }..  do{.
2ca30 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2ca40 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42  intf(nBuf-17, zB
2ca50 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f  uf, "%s/"SQLITE_
2ca60 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
2ca70 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d  , zDir);.    j =
2ca80 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75   (int)strlen(zBu
2ca90 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  f);.    sqlite3_
2caa0 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  randomness(15, &
2cab0 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f  zBuf[j]);.    fo
2cac0 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b  r(i=0; i<15; i++
2cad0 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42  , j++){.      zB
2cae0 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
2caf0 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
2cb00 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
2cb10 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
2cb20 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ) ];.    }.    z
2cb30 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77  Buf[j] = 0;.  }w
2cb40 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a  hile( osAccess(z
2cb50 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72  Buf,0)==0 );.  r
2cb60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2cb70 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
2cb80 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2cb90 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
2cba0 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
2cbb0 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73  Routine to trans
2cbc0 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20  form a unixFile 
2cbd0 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63  into a proxy-loc
2cbe0 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a  king unixFile..*
2cbf0 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
2cc00 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f   in the proxy-lo
2cc10 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74  ck division, but
2cc20 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65   used by unixOpe
2cc30 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45  n().** if SQLITE
2cc40 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
2cc50 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64  CKING is defined
2cc60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cc70 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
2cc80 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a  ixFile(unixFile*
2cc90 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
2cca0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
2ccb0 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73  arch for an unus
2ccc0 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
2ccd0 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  or that was open
2cce0 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
2ccf0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74  se .** file (not
2cd00 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61   a journal or ma
2cd10 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
2cd20 65 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  e) identified by
2cd30 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61   pathname.** zPa
2cd40 74 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  th with SQLITE_O
2cd50 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61  PEN_XXX flags ma
2cd60 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73  tching those pas
2cd70 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
2cd80 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f  d.** argument to
2cd90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
2cda0 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c  **.** Such a fil
2cdb0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79  e descriptor may
2cdc0 20 65 78 69 73 74 20 69 66 20 61 20 64 61 74 61   exist if a data
2cdd0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2cde0 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75  was closed.** bu
2cdf0 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
2ce00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2ce10 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c   could not be cl
2ce20 6f 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d  osed because som
2ce30 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20  e.** other file 
2ce40 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20  descriptor open 
2ce50 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  on the same file
2ce60 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69   is holding a fi
2ce70 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65  le-lock..** Refe
2ce80 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  r to comments in
2ce90 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29   the unixClose()
2cea0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68   function and th
2ceb0 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e  e lengthy commen
2cec0 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20  t.** describing 
2ced0 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20  "Posix Advisory 
2cee0 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20  Locking" at the 
2cef0 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 66 69  start of this fi
2cf00 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68  le for .** furth
2cf10 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f  er details. Also
2cf20 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a  , ticket #4018..
2cf30 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61  **.** If a suita
2cf40 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ble file descrip
2cf50 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  tor is found, th
2cf60 65 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  en it is returne
2cf70 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68  d. If no.** such
2cf80 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2cf90 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20   is located, -1 
2cfa0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2cfb0 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65  static UnixUnuse
2cfc0 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c  dFd *findReusabl
2cfd0 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eFd(const char *
2cfe0 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73  zPath, int flags
2cff0 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  ){.  UnixUnusedF
2d000 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  d *pUnused = 0;.
2d010 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61  .  /* Do not sea
2d020 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65  rch for an unuse
2d030 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
2d040 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f  r on vxworks. No
2d050 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76  t because.  ** v
2d060 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74  xworks would not
2d070 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68   benefit from th
2d080 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67  e change (it mig
2d090 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75  ht, we're not su
2d0a0 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65  re),.  ** but be
2d0b0 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20  cause no way to 
2d0c0 74 65 73 74 20 69 74 20 69 73 20 63 75 72 72 65  test it is curre
2d0d0 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20  ntly available. 
2d0e0 49 74 20 69 73 20 62 65 74 74 65 72 20 0a 20 20  It is better .  
2d0f0 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62  ** not to risk b
2d100 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20  reaking vxworks 
2d110 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20  support for the 
2d120 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20  sake of such an 
2d130 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65  obscure .  ** fe
2d140 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21  ature.  */.#if !
2d150 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
2d160 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
2d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d180 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20    /* Results of 
2d190 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a  stat() call */..
2d1a0 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61    /* A stat() ca
2d1b0 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20  ll may fail for 
2d1c0 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e  various reasons.
2d1d0 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
2d1e0 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d  , it is.  ** alm
2d1f0 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74  ost certain that
2d200 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20   an open() call 
2d210 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68  on the same path
2d220 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e   will also fail.
2d230 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72  .  ** For this r
2d240 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72  eason, if an err
2d250 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
2d260 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72   stat() call her
2d270 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67  e, it is.  ** ig
2d280 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20  nored and -1 is 
2d290 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
2d2a0 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f  ller will try to
2d2b0 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
2d2c0 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  .  ** descriptor
2d2d0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74   on the same pat
2d2e0 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74  h, fail, and ret
2d2f0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  urn an error to 
2d300 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a  SQLite..  **.  *
2d310 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75 62 73  * Even if a subs
2d320 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61  equent open() ca
2d330 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c  ll does succeed,
2d340 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65   the consequence
2d350 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65  s of.  ** not se
2d360 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65  arching for a re
2d370 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73  susable file des
2d380 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20  criptor are not 
2d390 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  dire.  */.  if( 
2d3a0 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c  0==osStat(zPath,
2d3b0 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
2d3c0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
2d3d0 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78  Inode;..    unix
2d3e0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2d3f0 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
2d400 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  List;.    while(
2d410 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f   pInode && (pIno
2d420 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d  de->fileId.dev!=
2d430 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20  sStat.st_dev.   
2d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d450 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c    || pInode->fil
2d460 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73  eId.ino!=sStat.s
2d470 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  t_ino) ){.      
2d480 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
2d490 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
2d4a0 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b     if( pInode ){
2d4b0 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65  .      UnixUnuse
2d4c0 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20  dFd **pp;.      
2d4d0 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e  for(pp=&pInode->
2d4e0 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20  pUnused; *pp && 
2d4f0 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c  (*pp)->flags!=fl
2d500 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  ags; pp=&((*pp)-
2d510 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20  >pNext));.      
2d520 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20  pUnused = *pp;. 
2d530 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64       if( pUnused
2d540 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
2d550 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74  = pUnused->pNext
2d560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2d570 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2d580 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
2d590 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58      /* if !OS_VX
2d5a0 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72  WORKS */.  retur
2d5b0 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a  n pUnused;.}../*
2d5c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2d5d0 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75  n is called by u
2d5e0 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74  nixOpen() to det
2d5f0 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20  ermine the unix 
2d600 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74  permissions.** t
2d610 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c  o create new fil
2d620 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65  es with. If no e
2d630 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
2d640 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
2d650 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61  eturned.** and a
2d660 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20   value suitable 
2d670 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74  for passing as t
2d680 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
2d690 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a  t to open(2) is.
2d6a0 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
2d6b0 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65  Mode. If an IO e
2d6c0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
2d6d0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
2d6e0 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
2d6f0 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
2d700 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74  of *pMode is not
2d710 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
2d720 20 49 66 20 74 68 65 20 66 69 6c 65 20 62 65 69   If the file bei
2d730 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 74  ng opened is a t
2d740 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 69  emporary file, i
2d750 74 20 69 73 20 61 6c 77 61 79 73 20 63 72 65 61  t is always crea
2d760 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
2d770 6f 63 74 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e  octal permission
2d780 73 20 30 36 30 30 20 28 72 65 61 64 2f 77 72 69  s 0600 (read/wri
2d790 74 61 62 6c 65 20 62 79 20 6f 77 6e 65 72 20 6f  table by owner o
2d7a0 6e 6c 79 29 2e 20 49 66 20 74 68 65 20 66 69 6c  nly). If the fil
2d7b0 65 0a 2a 2a 20 69 73 20 61 20 64 61 74 61 62 61  e.** is a databa
2d7c0 73 65 20 6f 72 20 6d 61 73 74 65 72 20 6a 6f 75  se or master jou
2d7d0 72 6e 61 6c 20 66 69 6c 65 2c 20 69 74 20 69 73  rnal file, it is
2d7e0 20 63 72 65 61 74 65 64 20 77 69 74 68 20 74 68   created with th
2d7f0 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a  e permissions .*
2d800 2a 20 6d 61 73 6b 20 53 51 4c 49 54 45 5f 44 45  * mask SQLITE_DE
2d810 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2d820 53 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20 46 69  SSIONS..**.** Fi
2d830 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65 20 66 69  nally, if the fi
2d840 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
2d850 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75  is a WAL or regu
2d860 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lar journal file
2d870 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
2d880 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73  function queries
2d890 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2d8a0 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73   for the permiss
2d8b0 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ions on the .** 
2d8c0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61  corresponding da
2d8d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
2d8e0 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74  sets *pMode to t
2d8f0 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65  his value. Whene
2d900 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  ver .** possible
2d910 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61  , WAL and journa
2d920 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  l files are crea
2d930 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  ted using the sa
2d940 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a  me permissions .
2d950 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69  ** as the associ
2d960 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
2d970 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
2d980 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
2d990 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20  _3_NAMES option 
2d9a0 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
2d9b0 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
2d9c0 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61   filename is una
2d9d0 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38  vailable.  But 8
2d9e0 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79  _3_NAMES is only
2d9f0 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54   used for.** FAT
2da00 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64   filesystems and
2da10 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20   permissions do 
2da20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65  not matter there
2da30 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a  , so just use.**
2da40 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72   the default per
2da50 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  missions..*/.sta
2da60 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61  tic int findCrea
2da70 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f  teFileMode(.  co
2da80 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2daa0 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70   Path of file (p
2dab0 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63  ossibly) being c
2dac0 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  reated */.  int 
2dad0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2dae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2daf0 6c 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34  lags passed as 4
2db00 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  th argument to x
2db10 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65  Open() */.  mode
2db20 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20  _t *pMode,      
2db30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2db40 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20  UT: Permissions 
2db50 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74  to open file wit
2db60 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55  h */.  uid_t *pU
2db70 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
2db80 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75         /* OUT: u
2db90 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
2dba0 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74   file */.  gid_t
2dbb0 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20   *pGid          
2dbc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2dbd0 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e  T: gid to set on
2dbe0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a   the file */.){.
2dbf0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2dc00 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2dc10 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
2dc20 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 53   */.  *pMode = S
2dc30 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
2dc40 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a  LE_PERMISSIONS;.
2dc50 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53    if( flags & (S
2dc60 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53  QLITE_OPEN_WAL|S
2dc70 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2dc80 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20  JOURNAL) ){.    
2dc90 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54  char zDb[MAX_PAT
2dca0 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a  HNAME+1];     /*
2dcb0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   Database file p
2dcc0 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ath */.    int n
2dcd0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2dce0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2dcf0 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65  er of valid byte
2dd00 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20  s in zDb */.    
2dd10 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
2dd20 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2dd30 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74 28   Output of stat(
2dd40 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  ) on database fi
2dd50 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50  le */..    /* zP
2dd60 61 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f  ath is a path to
2dd70 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61   a WAL or journa
2dd80 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  l file. The foll
2dd90 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69  owing block deri
2dda0 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ves.    ** the p
2ddb0 61 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63  ath to the assoc
2ddc0 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
2ddd0 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20  ile from zPath. 
2dde0 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c  This block handl
2ddf0 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f  es.    ** the fo
2de00 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63  llowing naming c
2de10 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20  onventions:.    
2de20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  **.    **   "<pa
2de30 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
2de40 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
2de50 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20  th to db>-wal". 
2de60 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2de70 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22  o db>-journalNN"
2de80 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2de90 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20   to db>-walNN". 
2dea0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65     **.    ** whe
2deb0 72 65 20 4e 4e 20 69 73 20 61 20 34 20 64 69 67  re NN is a 4 dig
2dec0 69 74 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65  it decimal numbe
2ded0 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67  r. The NN naming
2dee0 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20   schemes are .  
2def0 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65    ** used by the
2df00 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e   test_multiplex.
2df10 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f  c module..    */
2df20 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74  .    nDb = sqlit
2df30 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2df40 29 20 2d 20 31 3b 20 0a 20 20 20 20 77 68 69 6c  ) - 1; .    whil
2df50 65 28 20 6e 44 62 3e 30 20 26 26 20 7a 50 61 74  e( nDb>0 && zPat
2df60 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 20 6e 44  h[nDb]!='-' ) nD
2df70 62 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62  b--;.    if( nDb
2df80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2df90 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 6d 65 6d 63  ITE_OK;.    memc
2dfa0 70 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e  py(zDb, zPath, n
2dfb0 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62  Db);.    zDb[nDb
2dfc0 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69  ] = '\0';..    i
2dfd0 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62  f( 0==osStat(zDb
2dfe0 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
2dff0 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61     *pMode = sSta
2e000 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37  t.st_mode & 0777
2e010 3b 0a 20 20 20 20 20 20 2a 70 55 69 64 20 3d 20  ;.      *pUid = 
2e020 73 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20  sStat.st_uid;.  
2e030 20 20 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61      *pGid = sSta
2e040 74 2e 73 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65  t.st_gid;.    }e
2e050 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2e060 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
2e070 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  AT;.    }.  }els
2e080 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
2e090 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
2e0a0 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a  ONCLOSE ){.    *
2e0b0 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20  pMode = 0600;.  
2e0c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2e0d0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
2e0e0 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20   file zPath..** 
2e0f0 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20  .** Previously, 
2e100 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61  the SQLite OS la
2e110 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66  yer used three f
2e120 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63  unctions in plac
2e130 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65  e of this.** one
2e140 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
2e150 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
2e160 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  te();.**     sql
2e170 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
2e180 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  ly();.**     sql
2e190 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
2e1a0 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ive();.**.** The
2e1b0 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70  se calls corresp
2e1c0 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ond to the follo
2e1d0 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
2e1e0 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  s of flags:.**.*
2e1f0 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28  *     ReadWrite(
2e200 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52  ) ->     (READWR
2e210 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a  ITE | CREATE).**
2e220 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20       ReadOnly() 
2e230 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c   ->     (READONL
2e240 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45  Y) .**     OpenE
2e250 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52  xclusive() -> (R
2e260 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
2e270 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a  E | EXCLUSIVE).*
2e280 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65  *.** The old Ope
2e290 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63  nExclusive() acc
2e2a0 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20  epted a boolean 
2e2b0 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46  argument - "delF
2e2c0 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65  lag". If.** true
2e2d0 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63  , the file was c
2e2e0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20  onfigured to be 
2e2f0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
2e300 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a  leted when the.*
2e310 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c  * file handle cl
2e320 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65  osed. To achieve
2e330 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74   the same effect
2e340 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20   using this new 
2e350 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61  .** interface, a
2e360 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43  dd the DELETEONC
2e370 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f  LOSE flag to tho
2e380 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f  se specified abo
2e390 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45  ve for .** OpenE
2e3a0 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73  xclusive()..*/.s
2e3b0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70  tatic int unixOp
2e3c0 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
2e3d0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
2e3e0 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f     /* The VFS fo
2e3f0 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
2e400 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64  the xOpen method
2e410 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2e420 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
2e430 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f     /* Pathname o
2e440 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65  f file to be ope
2e450 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
2e460 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  _file *pFile,   
2e470 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
2e480 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
2e490 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a  be filled in */.
2e4a0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e4c0 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f  * Input flags to
2e4d0 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65   control the ope
2e4e0 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ning */.  int *p
2e4f0 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
2e500 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
2e510 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
2e520 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a  to SQLite core *
2e530 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
2e540 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  *p = (unixFile *
2e550 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64  )pFile;.  int fd
2e560 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
2e570 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2e580 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75   descriptor retu
2e590 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a  rned by open() *
2e5a0 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  /.  int openFlag
2e5b0 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
2e5c0 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70     /* Flags to p
2e5d0 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f  ass to open() */
2e5e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2e5f0 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49  LE_DATA_PROTECTI
2e600 4f 4e 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  ON.  int eType =
2e610 20 66 6c 61 67 73 26 30 78 46 46 30 46 46 46 30   flags&0xFF0FFF0
2e620 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
2e630 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23  ile to open */.#
2e640 65 6c 73 65 0a 20 20 69 6e 74 20 65 54 79 70 65  else.  int eType
2e650 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
2e660 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
2e670 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2e680 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 6f  .#endif.  int no
2e690 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
2e6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2e6b0 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67   to omit locking
2e6c0 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20   primitives */. 
2e6d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e6e0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2e6f0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
2e700 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e  rn Code */..  in
2e710 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
2e720 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2e730 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
2e740 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
2e750 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
2e760 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
2e770 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
2e780 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
2e790 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2e7a0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
2e7b0 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
2e7c0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2e7d0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2e7e0 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
2e7f0 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
2e800 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
2e810 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51  ADWRITE);.#if SQ
2e820 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2e830 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
2e840 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28  isAutoProxy  = (
2e850 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2e860 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a  PEN_AUTOPROXY);.
2e870 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
2e880 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65  creating a maste
2e890 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a  r or main-file j
2e8a0 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e  ournal, this fun
2e8b0 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a  ction will open.
2e8c0 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63    ** a file-desc
2e8d0 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69  riptor on the di
2e8e0 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65  rectory too. The
2e8f0 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78   first time unix
2e900 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63  Sync().  ** is c
2e910 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63 74  alled the direct
2e920 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
2e930 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e  tor will be fsyn
2e940 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28  c()ed and close(
2e950 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73  )d..  */.  int s
2e960 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65 61  yncDir = (isCrea
2e970 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  te && (.        
2e980 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2e990 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
2e9a0 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
2e9b0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2e9c0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  IN_JOURNAL .    
2e9d0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2e9e0 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
2e9f0 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
2ea00 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55  nt zPath is a NU
2ea10 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  LL pointer, this
2ea20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71   function is req
2ea30 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20  uired to open.  
2ea40 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
2ea50 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75  ile. Use this bu
2ea60 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
2ea70 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a  e file name in..
2ea80 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70    */.  char zTmp
2ea90 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
2eaa0 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  E+1];.  const ch
2eab0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74  ar *zName = zPat
2eac0 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  h;..  /* Check t
2ead0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
2eae0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
2eaf0 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  : .  **.  **   (
2eb00 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
2eb10 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
2eb20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
2eb30 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
2eb40 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20  and .  **   (b) 
2eb50 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74  if CREATE is set
2eb60 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45  , then READWRITE
2eb70 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
2eb80 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  t, and.  **   (c
2eb90 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69  ) if EXCLUSIVE i
2eba0 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
2ebb0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
2ebc0 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20  set..  **   (d) 
2ebd0 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  if DELETEONCLOSE
2ebe0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
2ebf0 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
2ec00 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e set..  */.  as
2ec10 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79  sert((isReadonly
2ec20 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
2ec30 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61  te==0) && (isRea
2ec40 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64  dWrite || isRead
2ec50 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74  only));.  assert
2ec60 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20  (isCreate==0 || 
2ec70 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20  isReadWrite);.  
2ec80 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69  assert(isExclusi
2ec90 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  ve==0 || isCreat
2eca0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44  e);.  assert(isD
2ecb0 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72  elete==0 || isCr
2ecc0 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eate);..  /* The
2ecd0 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
2ece0 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65  ournal, WAL file
2ecf0 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
2ed00 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20  nal are never . 
2ed10 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
2ed20 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
2ed30 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
2ed40 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
2ed50 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
2ed60 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
2ed70 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
2ed80 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
2ed90 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
2eda0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
2edb0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
2edc0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2edd0 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
2ede0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
2edf0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
2ee00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
2ee10 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
2ee20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
2ee30 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
2ee40 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
2ee50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
2ee60 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
2ee70 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
2ee80 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
2ee90 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
2eea0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
2eeb0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2eec0 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
2eed0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2eee0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
2eef0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2ef00 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2ef10 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
2ef20 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
2ef30 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
2ef40 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2ef50 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
2ef60 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
2ef70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
2ef80 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
2ef90 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2efa0 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
2efb0 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d  NT_DB || eType==
2efc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
2efd0 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70    );..  memset(p
2efe0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
2eff0 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65  File));..  if( e
2f000 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2f010 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20  N_MAIN_DB ){.   
2f020 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
2f030 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75  Unused;.    pUnu
2f040 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62  sed = findReusab
2f050 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67  leFd(zName, flag
2f060 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75  s);.    if( pUnu
2f070 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20  sed ){.      fd 
2f080 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20  = pUnused->fd;. 
2f090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f0a0 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
2f0b0 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
2f0c0 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
2f0d0 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29    if( !pUnused )
2f0e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2f0f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2f100 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2f110 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55   p->pUnused = pU
2f120 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69  nused;.  }else i
2f130 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  f( !zName ){.   
2f140 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
2f150 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20  NULL, the upper 
2f160 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74  layer is request
2f170 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e  ing a temp file.
2f180 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69   */.    assert(i
2f190 73 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63  sDelete && !sync
2f1a0 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75  Dir);.    rc = u
2f1b0 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d  nixGetTempname(M
2f1c0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c 20 7a  AX_PATHNAME+1, z
2f1d0 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
2f1e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f1f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2f200 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  rc;.    }.    zN
2f210 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
2f220 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d    }..  /* Determ
2f230 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ine the value of
2f240 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2f250 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50  eter passed to P
2f260 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20  OSIX function.  
2f270 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65  ** open(). These
2f280 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61   must be calcula
2f290 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e  ted even if open
2f2a0 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
2f2b0 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d  , as.  ** they m
2f2c0 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
2f2d0 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
2f2e0 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64   handle and used
2f2f0 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63   by the .  ** 'c
2f300 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69  onch file' locki
2f310 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74  ng functions lat
2f320 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  er on.  */.  if(
2f330 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f   isReadonly )  o
2f340 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
2f350 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65  ONLY;.  if( isRe
2f360 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c  adWrite ) openFl
2f370 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20  ags |= O_RDWR;. 
2f380 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20   if( isCreate ) 
2f390 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
2f3a0 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69  O_CREAT;.  if( i
2f3b0 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65  sExclusive ) ope
2f3c0 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43  nFlags |= (O_EXC
2f3d0 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20  L|O_NOFOLLOW);. 
2f3e0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
2f3f0 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
2f400 41 52 59 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  ARY);..#if SQLIT
2f410 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
2f420 4f 54 45 43 54 49 4f 4e 0a 20 20 70 2d 3e 70 72  OTECTION.  p->pr
2f430 6f 74 46 6c 61 67 73 20 3d 20 28 66 6c 61 67 73  otFlags = (flags
2f440 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46   & SQLITE_OPEN_F
2f450 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41  ILEPROTECTION_MA
2f460 53 4b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  SK);.#endif.    
2f470 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
2f480 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f     mode_t openMo
2f490 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
2f4a0 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20   /* Permissions 
2f4b0 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77  to create file w
2f4c0 69 74 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74  ith */.    uid_t
2f4d0 20 75 69 64 3b 0a 20 20 20 20 67 69 64 5f 74 20   uid;.    gid_t 
2f4e0 67 69 64 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  gid;.    rc = fi
2f4f0 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65  ndCreateFileMode
2f500 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26  (zName, flags, &
2f510 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20  openMode, &uid, 
2f520 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72  &gid);.    if( r
2f530 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f540 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
2f550 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20  ->pUnused );.   
2f560 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
2f570 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
2f580 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
2f590 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2f5a0 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65  RNAL );.      re
2f5b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2f5c0 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
2f5d0 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  pen(zName, openF
2f5e0 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b  lags, openMode);
2f5f0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f  .    OSTRACE(("O
2f600 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30  PENX   %-3d %s 0
2f610 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65  %o\n", fd, zName
2f620 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20  , openFlags));. 
2f630 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
2f640 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20  rrno!=EISDIR && 
2f650 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21  isReadWrite && !
2f660 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
2f670 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74       /* Failed t
2f680 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
2f690 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2f6a0 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d  ccess. Try read-
2f6b0 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66  only. */.      f
2f6c0 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45  lags &= ~(SQLITE
2f6d0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
2f6e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
2f6f0 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46  TE);.      openF
2f700 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52  lags &= ~(O_RDWR
2f710 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20  |O_CREAT);.     
2f720 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
2f730 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
2f740 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
2f750 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20  |= O_RDONLY;.   
2f760 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20     isReadonly = 
2f770 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f  1;.      fd = ro
2f780 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
2f790 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
2f7a0 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mode);.    }.   
2f7b0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2f7c0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
2f7d0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
2f7e0 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
2f7f0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
2f800 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
2f810 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  hed;.    }.    /
2f820 2a 20 69 66 20 77 65 27 72 65 20 6f 70 65 6e 69  * if we're openi
2f830 6e 67 20 74 68 65 20 77 61 6c 20 6f 72 20 6a 6f  ng the wal or jo
2f840 75 72 6e 61 6c 20 61 6e 64 20 72 75 6e 6e 69 6e  urnal and runnin
2f850 67 20 61 73 20 72 6f 6f 74 2c 20 73 65 74 20 74  g as root, set t
2f860 68 65 20 6a 6f 75 72 6e 61 6c 20 75 69 64 2f 67  he journal uid/g
2f870 69 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69  id */.    if( !i
2f880 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 28 66 6c  sReadonly && (fl
2f890 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
2f8a0 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
2f8b0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
2f8c0 29 20 29 7b 0a 20 20 20 20 20 20 75 69 64 5f 74  ) ){.      uid_t
2f8d0 20 65 75 69 64 20 3d 20 67 65 74 65 75 69 64 28   euid = geteuid(
2f8e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 75 69  );.      if( eui
2f8f0 64 3d 3d 30 20 26 26 20 28 65 75 69 64 21 3d 75  d==0 && (euid!=u
2f900 69 64 20 7c 7c 20 67 65 74 65 67 69 64 28 29 21  id || getegid()!
2f910 3d 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20  =gid) ){.       
2f920 20 69 66 28 20 66 63 68 6f 77 6e 28 66 64 2c 20   if( fchown(fd, 
2f930 75 69 64 2c 20 67 69 64 29 20 29 7b 0a 20 20 20  uid, gid) ){.   
2f940 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2f950 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2f960 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2f970 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
2f980 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f990 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
2f9a0 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20  sert( fd>=0 );. 
2f9b0 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
2f9c0 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73  {.    *pOutFlags
2f9d0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
2f9e0 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20   if( p->pUnused 
2f9f0 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65  ){.    p->pUnuse
2fa00 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20  d->fd = fd;.    
2fa10 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  p->pUnused->flag
2fa20 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
2fa30 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
2fa40 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
2fa50 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61  .    zPath = zNa
2fa60 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73  me;.#else.    os
2fa70 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23  Unlink(zName);.#
2fa80 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51  endif.  }.#if SQ
2fa90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2faa0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65  ING_STYLE.  else
2fab0 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61  {.    p->openFla
2fac0 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
2fad0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
2fae0 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20  ef FD_CLOEXEC.  
2faf0 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45  osFcntl(fd, F_SE
2fb00 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c  TFD, osFcntl(fd,
2fb10 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46   F_GETFD, 0) | F
2fb20 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64  D_CLOEXEC);.#end
2fb30 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65  if..  noLock = e
2fb40 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2fb50 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23  N_MAIN_DB;..  .#
2fb60 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2fb70 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f  LE__) || SQLITE_
2fb80 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2fb90 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74  TYLE.  struct st
2fba0 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 69  atfs fsInfo;.  i
2fbb0 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20 26  f( fstatfs(fd, &
2fbc0 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b  fsInfo) == -1 ){
2fbd0 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
2fbe0 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72  )pFile)->lastErr
2fbf0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
2fc00 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20  robust_close(p, 
2fc10 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2fc20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fc30 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
2fc40 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74   }.  if (0 == st
2fc50 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66  rncmp("msdos", f
2fc60 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
2fc70 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28  me, 5)) {.    ((
2fc80 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
2fc90 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c  ->fsFlags |= SQL
2fca0 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
2fcb0 53 44 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28  SDOS;.  }.  if (
2fcc0 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65 78  0 == strncmp("ex
2fcd0 66 61 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66  fat", fsInfo.f_f
2fce0 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b  stypename, 5)) {
2fcf0 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
2fd00 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73  )pFile)->fsFlags
2fd10 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41   |= SQLITE_FSFLA
2fd20 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d  GS_IS_MSDOS;.  }
2fd30 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20 53  .#endif.  .#if S
2fd40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2fd50 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53  KING_STYLE.#if S
2fd60 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
2fd70 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41  XY_LOCKING.  isA
2fd80 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65  utoProxy = 1;.#e
2fd90 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75 74  ndif.  if( isAut
2fda0 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68  oProxy && (zPath
2fdb0 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c  !=NULL) && (!noL
2fdc0 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f  ock) && pVfs->xO
2fdd0 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  pen ){.    char 
2fde0 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65  *envforce = gete
2fdf0 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45  nv("SQLITE_FORCE
2fe00 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29  _PROXY_LOCKING")
2fe10 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f  ;.    int usePro
2fe20 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  xy = 0;..    /* 
2fe30 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
2fe40 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65  XY_LOCKING==1 me
2fe50 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73  ans force always
2fe60 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65   use proxy, 0 me
2fe70 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65  ans .    ** neve
2fe80 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c  r use proxy, NUL
2fe90 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78  L means use prox
2fea0 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20  y for non-local 
2feb0 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a  files only.  */.
2fec0 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65      if( envforce
2fed0 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  !=NULL ){.      
2fee0 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28  useProxy = atoi(
2fef0 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20  envforce)>0;.   
2ff00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
2ff10 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
2ff20 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  fo;.      if( st
2ff30 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49  atfs(zPath, &fsI
2ff40 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  nfo) == -1 ){.  
2ff50 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
2ff60 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66 64  ry, the close(fd
2ff70 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70  ) call is sub-op
2ff80 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66 69  timal. If the fi
2ff90 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20  le opened.      
2ffa0 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73 20    ** with fd is 
2ffb0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
2ffc0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6f   and there are o
2ffd0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
2ffe0 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
2fff0 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
30000 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
30010 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f 72   holding advisor
30020 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20  y locks on it,. 
30030 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
30040 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65  he call to close
30050 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74  () will cancel t
30060 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70  hose locks. In p
30070 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20 20  ractice,.       
30080 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69   ** we're assumi
30090 6e 67 20 74 68 61 74 20 73 74 61 74 66 73 28 29  ng that statfs()
300a0 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76 65   doesn't fail ve
300b0 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61  ry often. At lea
300c0 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  st.        ** no
300d0 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66 69  t while other fi
300e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
300f0 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d  pened by the sam
30100 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20  e process on.   
30110 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65       ** the same
30120 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e   file are workin
30130 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  g.  */.        p
30140 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
30150 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 6f 62  rno;.        rob
30160 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
30170 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
30180 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30190 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20  IOERR_ACCESS;.  
301a0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
301b0 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20  finished;.      
301c0 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  }.      useProxy
301d0 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c   = !(fsInfo.f_fl
301e0 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a  ags&MNT_LOCAL);.
301f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
30200 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  eProxy ){.      
30210 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
30220 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 73 79  ile(pVfs, fd, sy
30230 6e 63 44 69 72 2c 20 70 46 69 6c 65 2c 20 7a 50  ncDir, pFile, zP
30240 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20  ath, noLock,.   
30250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30260 20 20 20 20 20 20 20 69 73 44 65 6c 65 74 65 2c         isDelete,
30270 20 69 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20   isReadonly);.  
30280 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30290 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
302a0 20 2f 2a 20 63 61 63 68 65 20 74 68 65 20 70 4d   /* cache the pM
302b0 65 74 68 6f 64 20 69 6e 20 63 61 73 65 20 74 68  ethod in case th
302c0 65 20 74 72 61 6e 73 66 6f 72 6d 20 66 61 69 6c  e transform fail
302d0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  s */.        con
302e0 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  st struct sqlite
302f0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
30300 65 74 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70  ethod = pFile->p
30310 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 20  Methods;.       
30320 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73   rc = proxyTrans
30330 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e  formUnixFile((un
30340 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22  ixFile*)pFile, "
30350 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20  :auto:");.      
30360 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30370 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30380 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73   /* Use unixClos
30390 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68  e to clean up th
303a0 65 20 72 65 73 6f 75 72 63 65 73 20 61 64 64 65  e resources adde
303b0 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46  d in fillInUnixF
303c0 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ile .          *
303d0 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20  * and clear all 
303e0 74 68 65 20 73 74 72 75 63 74 75 72 65 27 73 20  the structure's 
303f0 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65  references.  Spe
30400 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20  cifically, .    
30410 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e        ** pFile->
30420 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65  pMethods will be
30430 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33   NULL so sqlite3
30440 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20  OsClose will be 
30450 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20  a no-op .       
30460 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
30470 69 66 28 20 70 4d 65 74 68 6f 64 21 3d 4e 55 4c  if( pMethod!=NUL
30480 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
30490 20 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65   pMethod->xClose
304a0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
304b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
304c0 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28        unixClose(
304d0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
304e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 65    }.          re
304f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
30500 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
30510 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
30520 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  hed;.    }.  }.#
30530 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20  endif.  .  rc = 
30540 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
30550 56 66 73 2c 20 66 64 2c 20 73 79 6e 63 44 69 72  Vfs, fd, syncDir
30560 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20  , pFile, zPath, 
30570 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  noLock,.        
30580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
30590 44 65 6c 65 74 65 2c 20 69 73 52 65 61 64 6f 6e  Delete, isReadon
305a0 6c 79 29 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68  ly);.open_finish
305b0 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
305c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
305d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70  qlite3_free(p->p
305e0 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72  Unused);.  }.  r
305f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
30600 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
30610 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ile at zPath. If
30620 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
30630 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66  ument is true, f
30640 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69  sync().** the di
30650 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
30660 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
30670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
30680 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  nixDelete(.  sql
30690 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
306a0 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f  d,     /* VFS co
306b0 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73  ntaining this as
306c0 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74   the xDelete met
306d0 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
306e0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
306f0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
30700 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
30710 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e   */.  int dirSyn
30720 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
30730 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e  /* If true, fsyn
30740 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66  c() directory af
30750 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c  ter deleting fil
30760 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
30770 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
30780 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
30790 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
307a0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
307b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
307c0 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20  _DELETE);.  if( 
307d0 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d  osUnlink(zPath)=
307e0 3d 28 2d 31 29 20 26 26 20 65 72 72 6e 6f 21 3d  =(-1) && errno!=
307f0 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 65  ENOENT ){.    re
30800 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
30810 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
30820 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c  ELETE, "unlink",
30830 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 69 66   zPath);.  }.#if
30840 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
30850 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66  BLE_DIRSYNC.  if
30860 28 20 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20  ( dirSync ){.   
30870 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
30880 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  = osOpenDirector
30890 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20  y(zPath, &fd);. 
308a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
308b0 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56  E_OK ){.#if OS_V
308c0 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28  XWORKS.      if(
308d0 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29   fsync(fd)==-1 )
308e0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28  .#else.      if(
308f0 20 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e   fsync(fd) ).#en
30900 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
30910 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
30920 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
30930 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66  RR_DIR_FSYNC, "f
30940 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20  sync", zPath);. 
30950 20 20 20 20 20 7d 0a 23 69 66 20 4f 53 43 4c 4f       }.#if OSCLO
30960 53 45 5f 43 48 45 43 4b 5f 43 4c 4f 53 45 5f 49  SE_CHECK_CLOSE_I
30970 4f 45 52 52 0a 20 20 20 20 20 20 69 66 28 20 63  OERR.      if( c
30980 6c 6f 73 65 28 66 64 29 26 26 21 72 63 20 29 7b  lose(fd)&&!rc ){
30990 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
309a0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43  LITE_IOERR_DIR_C
309b0 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65  LOSE;.      }.#e
309c0 6c 73 65 0a 20 20 20 20 20 20 72 6f 62 75 73 74  lse.      robust
309d0 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f  _close(0, fd, __
309e0 4c 49 4e 45 5f 5f 29 3b 0a 23 65 6e 64 69 66 0a  LINE__);.#endif.
309f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
30a00 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
30a10 4e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  N ){.      rc = 
30a20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
30a30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
30a40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
30a50 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74  * Test the exist
30a60 61 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73  ance of or acces
30a70 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  s permissions of
30a80 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65   file zPath. The
30a90 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d  .** test perform
30aa0 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
30ab0 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73  e value of flags
30ac0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
30ad0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
30ae0 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
30af0 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a  e file exists.**
30b00 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
30b10 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65  SS_READWRITE: Re
30b20 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
30b30 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77  le is read and w
30b40 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  ritable..**     
30b50 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
30b60 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31  ADONLY: Return 1
30b70 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
30b80 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  readable..**.** 
30b90 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
30ba0 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
30bb0 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20  t unixAccess(.  
30bc0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
30bd0 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56  Used,   /* The V
30be0 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  FS containing th
30bf0 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f  is xAccess metho
30c00 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
30c10 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f  r *zPath,      /
30c20 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69  * Path of the fi
30c30 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f  le to examine */
30c40 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
30c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
30c60 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f  at do we want to
30c70 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65   learn about the
30c80 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a   zPath file? */.
30c90 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20    int *pResOut  
30ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
30cb0 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61  te result boolea
30cc0 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  n here */.){.  i
30cd0 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  nt amode = 0;.  
30ce0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
30cf0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
30d00 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
30d10 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
30d20 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73  R_ACCESS; );.  s
30d30 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a  witch( flags ){.
30d40 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
30d50 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
30d60 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f       amode = F_O
30d70 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
30d80 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
30d90 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
30da0 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
30db0 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20  W_OK|R_OK;.     
30dc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
30dd0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
30de0 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  EAD:.      amode
30df0 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = R_OK;.      b
30e00 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
30e10 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
30e20 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
30e30 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
30e40 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f  .  *pResOut = (o
30e50 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61  sAccess(zPath, a
30e60 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28  mode)==0);.  if(
30e70 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
30e80 43 43 45 53 53 5f 45 58 49 53 54 53 20 26 26 20  CCESS_EXISTS && 
30e90 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20 20  *pResOut ){.    
30ea0 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
30eb0 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74  .    if( 0==osSt
30ec0 61 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29 20  at(zPath, &buf) 
30ed0 26 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  && buf.st_size==
30ee0 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 ){.      *pRes
30ef0 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Out = 0;.    }. 
30f00 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
30f10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
30f20 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
30f30 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
30f40 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
30f50 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  The relative pat
30f60 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61  h.** is stored a
30f70 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  s a nul-terminat
30f80 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65  ed string in the
30f90 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
30fa0 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20  to by.** zPath. 
30fb0 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e  .**.** zOut poin
30fc0 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  ts to a buffer o
30fd0 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74  f at least sqlit
30fe0 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
30ff0 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20  e bytes .** (in 
31000 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50  this case, MAX_P
31010 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20  ATHNAME bytes). 
31020 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73  The full-path is
31030 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74   written to.** t
31040 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72  his buffer befor
31050 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
31060 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
31070 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
31080 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
31090 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
310a0 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
310b0 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
310c0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
310d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73           /* Poss
310e0 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e  ibly relative in
310f0 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e  put path */.  in
31100 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20  t nOut,         
31110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
31120 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
31130 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
31140 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20  .  char *zOut   
31150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31160 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
31170 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74  r */.){..  /* It
31180 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
31190 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
311a0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
311b0 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
311c0 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
311d0 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
311e0 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
311f0 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
31200 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
31210 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73  on failing. This
31220 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20   function could 
31230 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61  fail if, for exa
31240 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63  mple, the.  ** c
31250 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
31260 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
31270 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f  n unlinked..  */
31280 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
31290 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
312a0 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73  E_ERROR );..  as
312b0 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61  sert( pVfs->mxPa
312c0 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48  thname==MAX_PATH
312d0 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44  NAME );.  UNUSED
312e0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
312f0 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31  ;..  zOut[nOut-1
31300 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20  ] = '\0';.  if( 
31310 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b  zPath[0]=='/' ){
31320 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
31330 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74  rintf(nOut, zOut
31340 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a  , "%s", zPath);.
31350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
31360 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20 6f   nCwd;.    if( o
31370 73 47 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f  sGetcwd(zOut, nO
31380 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ut-1)==0 ){.    
31390 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
313a0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
313b0 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74  TOPEN_BKPT, "get
313c0 63 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  cwd", zPath);.  
313d0 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28    }.    nCwd = (
313e0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29  int)strlen(zOut)
313f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
31400 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64  printf(nOut-nCwd
31410 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22  , &zOut[nCwd], "
31420 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  /%s", zPath);.  
31430 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
31440 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  E_OK;.}...#ifnde
31450 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
31460 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
31470 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
31480 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
31490 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
314a0 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
314b0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
314c0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
314d0 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
314e0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
314f0 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63  /.#include <dlfc
31500 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64  n.h>.static void
31510 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c   *unixDlOpen(sql
31520 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
31530 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
31540 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55  Filename){.  UNU
31550 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31560 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
31570 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   dlopen(zFilenam
31580 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54  e, RTLD_NOW | RT
31590 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f  LD_GLOBAL);.}../
315a0 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c  *.** SQLite call
315b0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
315c0 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
315d0 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78  r a call to unix
315e0 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e  DlSym() or.** un
315f0 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73  ixDlOpen() fails
31600 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c   (returns a null
31610 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20   pointer). If a 
31620 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72  more detailed er
31630 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69  ror.** message i
31640 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20  s available, it 
31650 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42  is written to zB
31660 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72  ufOut. If no err
31670 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73  or message.** is
31680 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66   available, zBuf
31690 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  Out is left unmo
316a0 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74  dified and SQLit
316b0 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74  e uses a default
316c0 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
316d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
316e0 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71  d unixDlError(sq
316f0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
31700 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
31710 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20  ar *zBufOut){.  
31720 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
31730 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
31740 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
31750 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
31760 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72  );.  zErr = dler
31770 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72  ror();.  if( zEr
31780 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
31790 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
317a0 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a  zBufOut, "%s", z
317b0 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  Err);.  }.  unix
317c0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
317d0 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e  static void (*un
317e0 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  ixDlSym(sqlite3_
317f0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f  vfs *NotUsed, vo
31800 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  id *p, const cha
31810 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a  r*zSym))(void){.
31820 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77    /* .  ** GCC w
31830 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
31840 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43  rors says that C
31850 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  90 does not allo
31860 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a  w a void* to be.
31870 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61    ** cast into a
31880 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
31890 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74  nction.  And yet
318a0 20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73   the library dls
318b0 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a  ym() routine.  *
318c0 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64  * returns a void
318d0 2a 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c  * which is reall
318e0 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  y a pointer to a
318f0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68   function.  So h
31900 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73  ow do we.  ** us
31910 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d  e dlsym() with -
31920 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f  pedantic-errors?
31930 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61  .  **.  ** Varia
31940 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64  ble x below is d
31950 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  efined to be a p
31960 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
31970 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a  tion taking.  **
31980 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64   parameters void
31990 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72  * and const char
319a0 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  * and returning 
319b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
319c0 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65  unction..  ** We
319d0 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79   initialize x by
319e0 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20   assigning it a 
319f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64  pointer to the d
31a00 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e  lsym() function.
31a10 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69  .  ** (That assi
31a20 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20  gnment requires 
31a30 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77  a cast.)  Then w
31a40 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74  e call the funct
31a50 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20  ion that.  ** x 
31a60 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a  points to.  .  *
31a70 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b  *.  ** This work
31a80 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b  -around is unlik
31a90 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72  ely to work corr
31aa0 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73  ectly on any sys
31ab0 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79  tem where.  ** y
31ac0 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74  ou really cannot
31ad0 20 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e   cast a function
31ae0 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f   pointer into vo
31af0 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20  id*.  But then, 
31b00 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65  on the.  ** othe
31b10 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20  r hand, dlsym() 
31b20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  will not work on
31b30 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65   such a system e
31b40 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76  ither, so we hav
31b50 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c  e.  ** not reall
31b60 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e  y lost anything.
31b70 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28  .  */.  void (*(
31b80 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  *x)(void*,const 
31b90 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20  char*))(void);. 
31ba0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
31bb0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20  R(NotUsed);.  x 
31bc0 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69  = (void(*(*)(voi
31bd0 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
31be0 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20  (void))dlsym;.  
31bf0 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a  return (*x)(p, z
31c00 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Sym);.}.static v
31c10 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28  oid unixDlClose(
31c20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
31c30 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e  Used, void *pHan
31c40 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  dle){.  UNUSED_P
31c50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
31c60 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61  );.  dlclose(pHa
31c70 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  ndle);.}.#else /
31c80 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
31c90 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
31ca0 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
31cb0 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f   #define unixDlO
31cc0 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
31cd0 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20   unixDlError 0. 
31ce0 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53   #define unixDlS
31cf0 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65  ym   0.  #define
31d00 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23   unixDlClose 0.#
31d10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
31d20 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  te nBuf bytes of
31d30 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20   random data to 
31d40 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66  the supplied buf
31d50 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  fer zBuf..*/.sta
31d60 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64  tic int unixRand
31d70 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
31d80 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
31d90 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
31da0 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  f){.  UNUSED_PAR
31db0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
31dc0 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f  .  assert((size_
31dd0 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28  t)nBuf>=(sizeof(
31de0 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69  time_t)+sizeof(i
31df0 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  nt)));..  /* We 
31e00 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  have to initiali
31e10 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65  ze zBuf to preve
31e20 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  nt valgrind from
31e30 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20   reporting.  ** 
31e40 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70  errors.  The rep
31e50 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76  orts issued by v
31e60 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f  algrind are inco
31e70 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64  rrect - we would
31e80 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61  .  ** prefer tha
31e90 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  t the randomness
31ea0 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79   be increased by
31eb0 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74   making use of t
31ec0 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61  he.  ** uninitia
31ed0 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a  lized space in z
31ee0 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69  Buf - but valgri
31ef0 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74  nd errors tend t
31f00 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d  o worry.  ** som
31f10 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72  e users.  Rather
31f20 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20   than argue, it 
31f30 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73  seems easier jus
31f40 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a  t to initialize.
31f50 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61    ** the whole a
31f60 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65  rray and silence
31f70 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20   valgrind, even 
31f80 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65  if that means le
31f90 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20  ss randomness.  
31fa0 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d  ** in the random
31fb0 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   seed..  **.  **
31fc0 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69   When testing, i
31fd0 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66  nitializing zBuf
31fe0 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c  [] to zero is al
31ff0 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d  l we do.  That m
32000 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77  eans.  ** that w
32010 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
32020 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d   same random num
32030 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54  ber sequence.  T
32040 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20  his makes the.  
32050 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61  ** tests repeata
32060 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  ble..  */.  mems
32070 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
32080 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
32090 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b  SQLITE_TEST).  {
320a0 0a 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64  .    int pid, fd
320b0 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
320c0 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61  t_open("/dev/ura
320d0 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c  ndom", O_RDONLY,
320e0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c   0);.    if( fd<
320f0 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f  0 ){.      time_
32100 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28  t t;.      time(
32110 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  &t);.      memcp
32120 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65  y(zBuf, &t, size
32130 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69  of(t));.      pi
32140 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20  d = getpid();.  
32150 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
32160 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69  [sizeof(t)], &pi
32170 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b  d, sizeof(pid));
32180 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
32190 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28  izeof(t)+sizeof(
321a0 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42  pid)<=(size_t)nB
321b0 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66  uf );.      nBuf
321c0 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73   = sizeof(t) + s
321d0 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20  izeof(pid);.    
321e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b  }else{.      do{
321f0 20 6e 42 75 66 20 3d 20 6f 73 52 65 61 64 28 66   nBuf = osRead(f
32200 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20  d, zBuf, nBuf); 
32210 7d 77 68 69 6c 65 28 20 6e 42 75 66 3c 30 20 26  }while( nBuf<0 &
32220 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
32230 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  ;.      robust_c
32240 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49  lose(0, fd, __LI
32250 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NE__);.    }.  }
32260 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
32270 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   nBuf;.}.../*.**
32280 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
32290 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
322a0 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
322b0 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20   time slept..** 
322c0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
322d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
322e0 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61  croseconds we wa
322f0 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20  nt to sleep..** 
32300 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
32310 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
32320 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f  f microseconds o
32330 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79  f sleep actually
32340 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72  .** requested fr
32350 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  om the underlyin
32360 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
32370 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69  em, a number whi
32380 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67  ch.** might be g
32390 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
323a0 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75  qual to the argu
323b0 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65  ment, but not le
323c0 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61  ss.** than the a
323d0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
323e0 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70  ic int unixSleep
323f0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
32400 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f  tUsed, int micro
32410 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53  seconds){.#if OS
32420 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
32430 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a  t timespec sp;..
32440 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69    sp.tv_sec = mi
32450 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30  croseconds / 100
32460 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73  0000;.  sp.tv_ns
32470 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e  ec = (microsecon
32480 64 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20  ds % 1000000) * 
32490 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65  1000;.  nanoslee
324a0 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20  p(&sp, NULL);.  
324b0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
324c0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
324d0 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  urn microseconds
324e0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
324f0 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20  HAVE_USLEEP) && 
32500 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73  HAVE_USLEEP.  us
32510 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64  leep(microsecond
32520 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
32530 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
32540 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73  .  return micros
32550 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20  econds;.#else.  
32560 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d  int seconds = (m
32570 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39  icroseconds+9999
32580 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73  99)/1000000;.  s
32590 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20  leep(seconds);. 
325a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
325b0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
325c0 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30  turn seconds*100
325d0 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  0000;.#endif.}..
325e0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
325f0 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66  ing variable, if
32600 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65   set to a non-ze
32610 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74  ro value, is int
32620 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74  erpreted as.** t
32630 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  he number of sec
32640 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20  onds since 1970 
32650 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73  and is used to s
32660 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
32670 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72  .** sqlite3OsCur
32680 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e  rentTime() durin
32690 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  g testing..*/.#i
326a0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
326b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
326c0 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20  rent_time = 0;  
326d0 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74  /* Fake system t
326e0 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73  ime in seconds s
326f0 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65  ince 1970. */.#e
32700 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ndif../*.** Find
32710 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
32720 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
32730 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
32740 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
32750 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72  piNow.** the cur
32760 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
32770 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
32780 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20  ay number times 
32790 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a  86_400_000.  In.
327a0 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  ** other words, 
327b0 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  write into *piNo
327c0 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  w the number of 
327d0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e  milliseconds sin
327e0 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a  ce the Julian.**
327f0 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69   epoch of noon i
32800 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e  n Greenwich on N
32810 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34  ovember 24, 4714
32820 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74   B.C according t
32830 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74  o the.** prolept
32840 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c  ic Gregorian cal
32850 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  endar..**.** On 
32860 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
32870 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
32880 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
32890 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
328a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
328b0 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
328c0 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66  Int64(sqlite3_vf
328d0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69  s *NotUsed, sqli
328e0 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77  te3_int64 *piNow
328f0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
32900 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
32910 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30  unixEpoch = 2440
32920 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  5875*(sqlite3_in
32930 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66  t64)8640000;.#if
32940 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54   defined(NO_GETT
32950 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a  OD).  time_t t;.
32960 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70    time(&t);.  *p
32970 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33  iNow = ((sqlite3
32980 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b  _int64)t)*1000 +
32990 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69   unixEpoch;.#eli
329a0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
329b0 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
329c0 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74  Now;.  clock_get
329d0 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54  time(CLOCK_REALT
329e0 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a  IME, &sNow);.  *
329f0 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63  piNow = unixEpoc
32a00 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65  h + 1000*(sqlite
32a10 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f  3_int64)sNow.tv_
32a20 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73  sec + sNow.tv_ns
32a30 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73  ec/1000000;.#els
32a40 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  e.  struct timev
32a50 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69  al sNow;.  getti
32a60 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
32a70 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e  );.  *piNow = un
32a80 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28  ixEpoch + 1000*(
32a90 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e  sqlite3_int64)sN
32aa0 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77  ow.tv_sec + sNow
32ab0 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23  .tv_usec/1000;.#
32ac0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
32ad0 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
32ae0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
32af0 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e  time ){.    *piN
32b00 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74  ow = 1000*(sqlit
32b10 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33  e3_int64)sqlite3
32b20 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20  _current_time + 
32b30 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23  unixEpoch;.  }.#
32b40 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
32b50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
32b60 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
32b70 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
32b80 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
32b90 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
32ba0 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
32bb0 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
32bc0 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
32bd0 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
32be0 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
32bf0 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
32c00 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
32c10 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
32c20 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
32c30 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
32c40 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74   int unixCurrent
32c50 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
32c60 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c   *NotUsed, doubl
32c70 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c  e *prNow){.  sql
32c80 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20  ite3_int64 i;.  
32c90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
32ca0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69  (NotUsed);.  uni
32cb0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
32cc0 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e  4(0, &i);.  *prN
32cd0 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e  ow = i/86400000.
32ce0 30 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  0;.  return 0;.}
32cf0 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64  ../*.** We added
32d00 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72   the xGetLastErr
32d10 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68  or() method with
32d20 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f   the intention o
32d30 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62  f providing.** b
32d40 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20  etter low-level 
32d50 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77  error messages w
32d60 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79  hen operating-sy
32d70 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f  stem problems co
32d80 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20  me up.** during 
32d90 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e  SQLite operation
32da0 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e  .  But so far, n
32db0 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20  one of that has 
32dc0 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  been implemented
32dd0 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  .** in the core.
32de0 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e    So this routin
32df0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
32e00 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20  d.  For now, it 
32e10 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70  is merely.** a p
32e20 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a  lace-holder..*/.
32e30 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
32e40 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
32e50 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
32e60 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20  , int NotUsed2, 
32e70 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b  char *NotUsed3){
32e80 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
32e90 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
32ea0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
32eb0 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e  (NotUsed2);.  UN
32ec0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
32ed0 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75  otUsed3);.  retu
32ee0 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a  rn 0;.}.../*.***
32ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32f00 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c  ***** End of sql
32f10 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
32f20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
32f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
32f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
32f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
32fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32ff0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50  ******** Begin P
33000 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  roxy Locking ***
33010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
33030 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
33040 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63  g is a "uber-loc
33050 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20  king-method" in 
33060 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20  this sense:  It 
33070 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65  uses the.** othe
33080 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  r locking method
33090 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c  s on secondary l
330a0 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78  ock files.  Prox
330b0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a  y locking is a.*
330c0 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65  * meta-layer ove
330d0 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69  r top of the pri
330e0 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69  mitive locking i
330f0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65  mplemented above
33100 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72  .  For.** this r
33110 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
33120 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
33130 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  nts of proxy loc
33140 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64  king is deferred
33150 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69  .** until late i
33160 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65  n the file (here
33170 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74  ) after all of t
33180 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74  he other I/O met
33190 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65  hods have.** bee
331a0 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74  n defined - so t
331b0 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76  hat the primitiv
331c0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
331d0 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a  s are available.
331e0 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74  ** as services t
331f0 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20  o help with the 
33200 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
33210 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e  f proxy locking.
33220 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  .**.****.**.** T
33230 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
33240 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51  ng schemes in SQ
33250 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61  Lite use byte-ra
33260 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  nge locks on the
33270 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
33280 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  e to coordinate 
33290 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  safe, concurrent
332a0 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
332b0 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61  ple readers.** a
332c0 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70  nd writers [http
332d0 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f  ://sqlite.org/lo
332e0 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20  ckingv3.html].  
332f0 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f  The five file lo
33300 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20  cking.** states 
33310 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49  (UNLOCKED, PENDI
33320 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  NG, SHARED, RESE
33330 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29  RVED, EXCLUSIVE)
33340 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
33350 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61  .** as POSIX rea
33360 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  d & write locks 
33370 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f  over fixed set o
33380 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61  f locations (via
33390 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41   fsctl),.** on A
333a0 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20  FP and SMB only 
333b0 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72  exclusive byte-r
333c0 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61  ange locks are a
333d0 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63  vailable via fsc
333e0 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52  tl.** with _IOWR
333f0 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
33400 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
33410 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20  2) to track the 
33420 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a  same 5 states..*
33430 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20  * To simulate a 
33440 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73  F_RDLCK on the s
33450 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20  hared range, on 
33460 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73  AFP a randomly s
33470 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65  elected.** addre
33480 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64  ss in the shared
33490 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
334a0 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63  for a SHARED loc
334b0 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a  k, the entire.**
334c0 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73   shared range is
334d0 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58   taken for an EX
334e0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a  CLUSIVE lock):.*
334f0 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e  *.**      PENDIN
33500 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78  G_BYTE        0x
33510 34 30 30 30 30 30 30 30 09 09 20 20 20 09 0a 2a  40000000..   ..*
33520 2a 20 20 20 20 20 20 52 45 53 45 52 56 45 44 5f  *      RESERVED_
33530 42 59 54 45 20 20 20 20 20 20 20 30 78 34 30 30  BYTE       0x400
33540 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48  00001.**      SH
33550 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20  ARED_RANGE      
33560 20 20 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20    0x40000002 -> 
33570 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a  0x40000200.**.**
33580 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c   This works well
33590 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69   on the local fi
335a0 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73  le system, but s
335b0 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30  hows a nearly 10
335c0 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69  0x.** slowdown i
335d0 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e  n read performan
335e0 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73  ce on AFP becaus
335f0 65 20 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74  e the AFP client
33600 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65   disables.** the
33610 20 72 65 61 64 20 63 61 63 68 65 20 77 68 65 6e   read cache when
33620 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
33630 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20  s are present.  
33640 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61  Enabling the rea
33650 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73  d.** cache expos
33660 65 73 20 61 20 63 61 63 68 65 20 63 6f 68 65 72  es a cache coher
33670 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61  ency problem tha
33680 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20  t is present on 
33690 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70  all OS X.** supp
336a0 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69  orted network fi
336b0 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53  le systems.  NFS
336c0 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62   and AFP both ob
336d0 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f  serve the.** clo
336e0 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e  se-to-open seman
336f0 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e  tics for ensurin
33700 67 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  g cache coherenc
33710 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73  y.** [http://nfs
33720 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74  .sourceforge.net
33730 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68  /#faq_a8], which
33740 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74   does not effect
33750 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73  ively.** address
33760 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
33770 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74  s for concurrent
33780 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
33790 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20   by multiple.** 
337a0 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
337b0 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77  ers.** [http://w
337c0 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51  ww.nabble.com/SQ
337d0 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68  Lite-on-NFS-cach
337e0 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35  e-coherency-td15
337f0 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a  655701.html]..**
33800 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74  .** To address t
33810 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61  he performance a
33820 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e  nd cache coheren
33830 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79  cy issues, proxy
33840 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
33850 20 63 68 61 6e 67 65 73 20 74 68 65 20 77 61 79   changes the way
33860 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
33870 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62   is controlled b
33880 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73  y limiting acces
33890 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  s to a.** single
338a0 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20   host at a time 
338b0 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20  and moving file 
338c0 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65  locks off of the
338d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
338e0 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f  * and onto a pro
338f0 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c  xy file on the l
33900 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
33910 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69  .  .**.**.** Usi
33920 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a  ng proxy locks.*
33930 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
33940 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73  ---.**.** C APIs
33950 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f  .**.**  sqlite3_
33960 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
33970 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f   dbname, SQLITE_
33980 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
33990 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  E,.**           
339a0 20 20 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f              <pro
339b0 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74  xy_path> | ":aut
339c0 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65  o:");.**  sqlite
339d0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
339e0 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
339f0 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
33a00 49 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74  ILE, &<proxy_pat
33a10 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51  h>);.**.**.** SQ
33a20 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20  L pragmas.**.** 
33a30 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
33a40 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
33a50 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20  le=<proxy_path> 
33a60 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41  | :auto:.**  PRA
33a70 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
33a80 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a  ock_proxy_file.*
33a90 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20  *.** Specifying 
33aa0 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74  ":auto:" means t
33ab0 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20  hat if there is 
33ac0 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74  a conch file wit
33ad0 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20  h a matching.** 
33ae0 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74  host ID in it, t
33af0 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e  he proxy path in
33b00 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
33b10 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74  will be used, ot
33b20 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f  herwise.** a pro
33b30 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e  xy path based on
33b40 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70   the user's temp
33b50 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e   dir.** (via con
33b60 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
33b70 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e  USER_TEMP_DIR,..
33b80 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64  .)) will be used
33b90 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75   and the.** actu
33ba0 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61  al proxy file na
33bb0 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  me is generated 
33bc0 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e  from the name an
33bd0 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a  d path of the.**
33be0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
33bf0 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
33c00 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61  .**       For da
33c10 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73  tabase path "/Us
33c20 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a  ers/me/foo.db" .
33c30 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63  **       The loc
33c40 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22  k path will be "
33c50 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70  <tmpdir>/sqlitep
33c60 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f  locks/_Users_me_
33c70 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a  foo.db:auto:").*
33c80 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b  *.** Once a lock
33c90 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67   proxy is config
33ca0 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62  ured for a datab
33cb0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20  ase connection, 
33cc0 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65  it can not.** be
33cd0 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65   removed, howeve
33ce0 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74  r it may be swit
33cf0 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  ched to a differ
33d00 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76  ent proxy path v
33d10 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20  ia.** the above 
33d20 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74  APIs (assuming t
33d30 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
33d40 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20   not being held 
33d50 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f  by another.** co
33d60 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63  nnection or proc
33d70 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ess). .**.**.** 
33d80 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  How proxy lockin
33d90 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  g works.** -----
33da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33db0 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66  --.**.** Proxy f
33dc0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69  ile locking reli
33dd0 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20  es primarily on 
33de0 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69  two new supporti
33df0 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a  ng files: .**.**
33e00 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65     *  conch file
33e10 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73   to limit access
33e20 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
33e30 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c   file to a singl
33e40 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61  e host.**      a
33e50 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20  t a time.**.**  
33e60 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74   *  proxy file t
33e70 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79  o act as a proxy
33e80 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72   for the advisor
33e90 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79  y locks normally
33ea0 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f  .**      taken o
33eb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
33ec0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66  *.** The conch f
33ed0 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70  ile - to use a p
33ee0 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74  roxy file, sqlit
33ef0 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f  e must first "ho
33f00 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a  ld the conch".**
33f10 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71   by taking an sq
33f20 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65  lite-style share
33f30 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
33f40 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e  nch file, readin
33f50 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
33f60 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20  s and comparing 
33f70 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75  the host's uniqu
33f80 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62  e host ID (see b
33f90 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a  elow) and lock.*
33fa0 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61  * proxy path aga
33fb0 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20  inst the values 
33fc0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f  stored in the co
33fd0 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20  nch.  The conch 
33fe0 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65  file is.** store
33ff0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  d in the same di
34000 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64  rectory as the d
34010 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
34020 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a   the file name.*
34030 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61  * is patterned a
34040 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73  fter the databas
34050 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22  e file name as "
34060 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d  .<databasename>-
34070 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68  conch"..** If th
34080 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65  e conch file doe
34090 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20  s not exist, or 
340a0 69 74 27 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f  it's contents do
340b0 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a   not match the.*
340c0 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72  * host ID and/or
340d0 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65   proxy path, the
340e0 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73  n the lock is es
340f0 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78  calated to an ex
34100 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20  clusive.** lock 
34110 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69  and the conch fi
34120 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75  le contents is u
34130 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
34140 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78  host ID and prox
34150 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68  y.** path and th
34160 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72  e lock is downgr
34170 61 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64  aded to a shared
34180 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66   lock again.  If
34190 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73   the conch.** is
341a0 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
341b0 20 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61   process (with a
341c0 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74   shared lock), t
341d0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
341e0 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61  k.** will fail a
341f0 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  nd SQLITE_BUSY i
34200 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
34210 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
34220 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65   - a single-byte
34230 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61   file used for a
34240 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65  ll advisory file
34250 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c   locks.** normal
34260 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20  ly taken on the 
34270 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
34280 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72   This allows for
34290 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a   safe sharing.**
342a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
342b0 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70   file for multip
342c0 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  le readers and w
342d0 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61  riters on the sa
342e0 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20  me.** host (the 
342f0 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68  conch ensures th
34300 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20  at they all use 
34310 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c  the same local l
34320 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a  ock file)..**.**
34330 20 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20   Requesting the 
34340 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20  lock proxy does 
34350 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  not immediately 
34360 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20  take the conch, 
34370 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61  it is.** only ta
34380 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72  ken when the fir
34390 73 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f  st request to lo
343a0 63 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ck database file
343b0 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54   is made.  .** T
343c0 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
343d0 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65  semantics of the
343e0 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63   traditional loc
343f0 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77  king behavior, w
34400 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  here.** opening 
34410 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
34420 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
34430 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20  does not take a 
34440 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54  lock on it..** T
34450 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61  he shared lock a
34460 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  nd an open file 
34470 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d  descriptor are m
34480 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20  aintained until 
34490 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  .** the connecti
344a0 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  on to the databa
344b0 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a  se is closed. .*
344c0 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66  *.** The proxy f
344d0 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ile and the lock
344e0 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20   file are never 
344f0 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20  deleted so they 
34500 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  only need.** to 
34510 62 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66  be created the f
34520 69 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61  irst time they a
34530 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  re used..**.** C
34540 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
34550 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ions.** --------
34560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
34570 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46  .**  SQLITE_PREF
34580 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
34590 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74  .**.**       Dat
345a0 61 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65  abase files acce
345b0 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61  ssed on non-loca
345c0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61  l file systems a
345d0 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f  re.**       auto
345e0 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67  matically config
345f0 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c  ured for proxy l
34600 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c  ocking, lock fil
34610 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  es are.**       
34620 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
34630 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61  lly using the sa
34640 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20  me logic as.**  
34650 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b       PRAGMA lock
34660 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75  _proxy_file=":au
34670 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  to:".**    .**  
34680 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42  SQLITE_PROXY_DEB
34690 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45  UG.**.**       E
346a0 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69  nables the loggi
346b0 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73  ng of error mess
346c0 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74  ages during host
346d0 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20   id file.**     
346e0 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20    retrieval and 
346f0 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  creation.**.**  
34700 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a  LOCKPROXYDIR.**.
34710 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64  **       Overrid
34720 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64  es the default d
34730 69 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f  irectory used fo
34740 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c  r lock proxy fil
34750 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
34760 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d   are named autom
34770 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65  atically via the
34780 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e   ":auto:" settin
34790 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  g.**.**  SQLITE_
347a0 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
347b0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a  _PERMISSIONS.**.
347c0 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73  **       Permiss
347d0 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e  ions to use when
347e0 20 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65   creating a dire
347f0 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e  ctory for storin
34800 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c  g the.**       l
34810 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c  ock proxy files,
34820 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
34830 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20  LOCKPROXYDIR is 
34840 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a  not set..**    .
34850 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e  **    .** As men
34860 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68  tioned above, wh
34870 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  en compiled with
34880 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
34890 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a  ROXY_LOCKING,.**
348a0 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76   setting the env
348b0 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
348c0 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  e SQLITE_FORCE_P
348d0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20  ROXY_LOCKING to 
348e0 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20  1 will.** force 
348f0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
34900 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65   be used for eve
34910 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
34920 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a   opened, and 0.*
34930 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74  * will force aut
34940 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63  omatic proxy loc
34950 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62  king to be disab
34960 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  led for all data
34970 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65  base.** files (e
34980 78 70 6c 69 63 69 74 79 20 63 61 6c 6c 69 6e 67  xplicity calling
34990 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 54 5f   the SQLITE_SET_
349a0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72  LOCKPROXYFILE pr
349b0 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74  agma or.** sqlit
349c0 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41  e_file_control A
349d0 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74  PI is not affect
349e0 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52  ed by SQLITE_FOR
349f0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
34a00 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  )..*/../*.** Pro
34a10 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  xy locking is on
34a20 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
34a30 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64  MacOSX .*/.#if d
34a40 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
34a50 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
34a60 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
34a70 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ../*.** The prox
34a80 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
34a90 68 61 73 20 74 68 65 20 70 61 74 68 20 61 6e 64  has the path and
34aa0 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 73   file structures
34ab0 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20   for the remote 
34ac0 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72  .** and local pr
34ad0 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a  oxy files in it.
34ae0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
34af0 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
34b00 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69  ntext proxyLocki
34b10 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
34b20 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
34b30 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69  ntext {.  unixFi
34b40 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20  le *conchFile;  
34b50 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63         /* Open c
34b60 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63  onch file */.  c
34b70 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61  har *conchFilePa
34b80 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
34b90 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ame of the conch
34ba0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
34bb0 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20  ile *lockProxy; 
34bc0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
34bd0 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
34be0 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50  */.  char *lockP
34bf0 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20 20 20  roxyPath;       
34c00 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
34c10 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
34c20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61   */.  char *dbPa
34c30 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
34c40 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
34c50 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20  e open file */. 
34c60 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20   int conchHeld; 
34c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34c80 20 31 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20   1 if the conch 
34c90 69 73 20 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c  is held, -1 if l
34ca0 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 69 6e 74  ockless */.  int
34cb0 20 6e 46 61 69 6c 73 3b 20 20 20 20 20 20 20 20   nFails;        
34cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
34cd0 62 65 72 20 6f 66 20 63 6f 6e 63 68 20 74 61 6b  ber of conch tak
34ce0 69 6e 67 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  ing failures */.
34cf0 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69    void *oldLocki
34d00 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f  ngContext;     /
34d10 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  * Original locki
34d20 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73  ngcontext to res
34d30 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  tore on close */
34d40 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
34d50 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c  thods const *pOl
34d60 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20  dMethod;     /* 
34d70 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74  Original I/O met
34d80 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a  hods for close *
34d90 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  /.};../* .** The
34da0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
34db0 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61   path for the da
34dc0 74 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68  tabase at dbPath
34dd0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
34de0 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63   lPath, .** whic
34df0 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  h must point to 
34e00 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20  valid, writable 
34e10 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f  memory large eno
34e20 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e  ugh for a maxLen
34e30 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20   length.** file 
34e40 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  path. .*/.static
34e50 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63   int proxyGetLoc
34e60 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
34e70 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a   *dbPath, char *
34e80 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61  lPath, size_t ma
34e90 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  xLen){.  int len
34ea0 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20  ;.  int dbLen;. 
34eb0 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20   int i;..#ifdef 
34ec0 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c  LOCKPROXYDIR.  l
34ed0 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61  en = strlcpy(lPa
34ee0 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  th, LOCKPROXYDIR
34ef0 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65  , maxLen);.#else
34f00 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52  .# ifdef _CS_DAR
34f10 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
34f20 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63  R.  {.    if( !c
34f30 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
34f40 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
34f50 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20   lPath, maxLen) 
34f60 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
34f70 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  (("GETLOCKPATH  
34f80 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d  failed %s errno=
34f90 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20  %d pid=%d\n",.  
34fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61               lPa
34fb0 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69  th, errno, getpi
34fc0 64 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  d()));.      ret
34fd0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
34fe0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  _LOCK;.    }.   
34ff0 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
35000 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f  Path, "sqliteplo
35010 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20  cks", maxLen);  
35020 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20    .  }.# else.  
35030 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
35040 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61  ath, "/tmp/", ma
35050 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23  xLen);.# endif.#
35060 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61  endif..  if( lPa
35070 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29  th[len-1]!='/' )
35080 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  {.    len = strl
35090 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20  cat(lPath, "/", 
350a0 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a  maxLen);.  }.  .
350b0 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74    /* transform t
350c0 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20  he db path to a 
350d0 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d  unique cache nam
350e0 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28  e */.  dbLen = (
350f0 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
35100 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20  h);.  for( i=0; 
35110 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65  i<dbLen && (i+le
35120 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e  n+7)<(int)maxLen
35130 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
35140 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a   c = dbPath[i];.
35150 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d      lPath[i+len]
35160 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a   = (c=='/')?'_':
35170 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69  c;.  }.  lPath[i
35180 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74  +len]='\0';.  st
35190 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61  rlcat(lPath, ":a
351a0 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  uto:", maxLen);.
351b0 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c    OSTRACE(("GETL
351c0 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
351d0 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
351e0 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65  %d\n", lPath, ge
351f0 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75  tpid()));.  retu
35200 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
35210 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73  ./* . ** Creates
35220 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
35230 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64  nd any missing d
35240 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f  irectories in lo
35250 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69  ckPath. */.stati
35260 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
35270 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20  eLockPath(const 
35280 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b  char *lockPath){
35290 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20  .  int i, len;. 
352a0 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54   char buf[MAXPAT
352b0 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61  HLEN];.  int sta
352c0 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73  rt = 0;.  .  ass
352d0 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55  ert(lockPath!=NU
352e0 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f  LL);.  /* try to
352f0 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20   create all the 
35300 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72  intermediate dir
35310 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65  ectories */.  le
35320 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
35330 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66  lockPath);.  buf
35340 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30  [0] = lockPath[0
35350 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69  ];.  for( i=1; i
35360 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  <len; i++ ){.   
35370 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d   if( lockPath[i]
35380 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20   == '/' && (i - 
35390 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20  start > 0) ){.  
353a0 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69      /* only mkdi
353b0 72 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d  r if leaf dir !=
353c0 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22   "." or "/" or "
353d0 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  .." */.      if(
353e0 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69   i-start>2 || (i
353f0 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66  -start==1 && buf
35400 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26  [start] != '.' &
35410 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
35420 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c  '/') .         |
35430 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26  | (i-start==2 &&
35440 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
35450 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b  .' && buf[start+
35460 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20  1] != '.') ){.  
35470 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30        buf[i]='\0
35480 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  ';.        if( m
35490 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45  kdir(buf, SQLITE
354a0 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
354b0 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29  R_PERMISSIONS) )
354c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
354d0 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20  err=errno;.     
354e0 20 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45       if( err!=EE
354f0 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20  XIST ) {.       
35500 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43       OSTRACE(("C
35510 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46  REATELOCKPATH  F
35520 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25  AILED creating %
35530 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  s, ".           
35540 20 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20            "'%s' 
35550 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
35560 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20  %s pid=%d\n",.  
35570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35580 20 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72     buf, strerror
35590 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c  (err), lockPath,
355a0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20   getpid()));.   
355b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
355c0 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  err;.          }
355d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
355e0 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69   }.      start=i
355f0 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75  +1;.    }.    bu
35600 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b  f[i] = lockPath[
35610 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  i];.  }.  OSTRAC
35620 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E(("CREATELOCKPA
35630 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  TH  proxy lock p
35640 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
35650 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70  , lockPath, getp
35660 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  id()));.  return
35670 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e   0;.}..static in
35680 74 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67  t isProxyLocking
35690 4d 6f 64 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  Mode(unixFile *p
356a0 46 69 6c 65 29 20 7b 0a 20 20 72 65 74 75 72 6e  File) {.  return
356b0 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64   (pFile->pMethod
356c0 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68   == &proxyIoMeth
356d0 6f 64 73 29 20 3f 20 31 20 3a 20 30 3b 0a 7d 0a  ods) ? 1 : 0;.}.
356e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
356f0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
35700 62 61 73 65 20 70 61 74 68 20 62 61 73 65 64 20  base path based 
35710 6f 6e 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78  on the lock prox
35720 79 20 66 69 6c 65 20 69 66 20 74 68 65 20 0a 2a  y file if the .*
35730 2a 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c  * lock proxy fil
35740 65 20 69 73 20 68 6f 73 74 65 64 20 6f 6e 20 61  e is hosted on a
35750 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63   shared memory c
35760 6f 6d 70 61 74 69 62 6c 65 20 46 53 0a 2a 2f 0a  ompatible FS.*/.
35770 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
35780 72 20 2a 70 72 6f 78 79 53 68 61 72 65 64 4d 65  r *proxySharedMe
35790 6d 6f 72 79 42 61 73 65 50 61 74 68 28 75 6e 69  moryBasePath(uni
357a0 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 20 7b 0a  xFile *pFile) {.
357b0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
357c0 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 75  ntext *pCtx;.  u
357d0 6e 69 78 46 69 6c 65 20 2a 70 4c 6f 63 6b 46 69  nixFile *pLockFi
357e0 6c 65 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  le;.  .  assert(
357f0 70 46 69 6c 65 21 3d 4e 55 4c 4c 20 26 26 20 70  pFile!=NULL && p
35800 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
35810 74 65 78 74 21 3d 4e 55 4c 4c 29 3b 0a 20 20 61  text!=NULL);.  a
35820 73 73 65 72 74 28 70 46 69 6c 65 2d 3e 70 4d 65  ssert(pFile->pMe
35830 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f  thod == &proxyIo
35840 4d 65 74 68 6f 64 73 29 3b 0a 20 20 70 43 74 78  Methods);.  pCtx
35850 20 3d 20 28 28 70 72 6f 78 79 4c 6f 63 6b 69 6e   = ((proxyLockin
35860 67 43 6f 6e 74 65 78 74 20 2a 29 28 70 46 69 6c  gContext *)(pFil
35870 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
35880 74 29 29 3b 0a 20 20 70 4c 6f 63 6b 46 69 6c 65  t));.  pLockFile
35890 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
358a0 78 79 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 46  xy;.  if( pLockF
358b0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 69 56  ile->pMethod->iV
358c0 65 72 73 69 6f 6e 3e 3d 32 20 26 26 20 70 4c 6f  ersion>=2 && pLo
358d0 63 6b 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  ckFile->pMethod-
358e0 3e 78 53 68 6d 4d 61 70 21 3d 30 20 29 7b 0a 20  >xShmMap!=0 ){. 
358f0 20 20 20 72 65 74 75 72 6e 20 70 43 74 78 2d 3e     return pCtx->
35900 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
35910 20 7d 0a 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c   }.  return NULL
35920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
35930 65 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65  e a new VFS file
35940 20 64 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f   descriptor (sto
35950 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  red in memory ob
35960 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
35970 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61  qlite3_malloc) a
35980 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  nd open the file
35990 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e   named "path" in
359a0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
359b0 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ptor..**.** The 
359c0 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
359d0 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66  sible not only f
359e0 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 66  or closing the f
359f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
35a00 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20 66  * but also for f
35a10 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72  reeing the memor
35a20 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
35a30 68 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  h the file descr
35a40 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  iptor..*/.static
35a50 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
35a60 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63 6f  UnixFile(.    co
35a70 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20  nst char *path, 
35a80 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20 66         /* path f
35a90 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46  or the new unixF
35aa0 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46  ile */.    unixF
35ab0 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20  ile **ppFile,   
35ac0 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20      /* unixFile 
35ad0 63 72 65 61 74 65 64 20 61 6e 64 20 72 65 74 75  created and retu
35ae0 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a 20  rned by ref */. 
35af0 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c     int islockfil
35b00 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  e           /* i
35b10 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69  f non zero missi
35b20 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65 20  ng dirs will be 
35b30 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20  created */.) {. 
35b40 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20   int fd = -1;.  
35b50 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a  unixFile *pNew;.
35b60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35b70 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65 6e  E_OK;.  int open
35b80 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c  Flags = O_RDWR |
35b90 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c 69   O_CREAT;.  sqli
35ba0 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73  te3_vfs dummyVfs
35bb0 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d  ;.  int terrno =
35bc0 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   0;.  UnixUnused
35bd0 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55  Fd *pUnused = NU
35be0 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69 72  LL;..  /* 1. fir
35bf0 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f 63  st try to open/c
35c00 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20  reate the file. 
35c10 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20 66   ** 2. if that f
35c20 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20 69  ails, and this i
35c30 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28 6e  s a lock file (n
35c40 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20 63  ot-conch), try c
35c50 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
35c60 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72   parent director
35c70 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72 79  ies and then try
35c80 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20   again..  ** 3. 
35c90 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 74  if that fails, t
35ca0 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66  ry to open the f
35cb0 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20 20  ile read-only.  
35cc0 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65 74  ** otherwise ret
35cd0 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f 63  urn BUSY (if loc
35ce0 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54 4f  k file) or CANTO
35cf0 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  PEN for the conc
35d00 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70 55  h file.  */.  pU
35d10 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73  nused = findReus
35d20 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70 65  ableFd(path, ope
35d30 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70  nFlags);.  if( p
35d40 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66 64  Unused ){.    fd
35d50 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a   = pUnused->fd;.
35d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 6e    }else{.    pUn
35d70 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  used = sqlite3_m
35d80 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55  alloc(sizeof(*pU
35d90 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28  nused));.    if(
35da0 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20   !pUnused ){.   
35db0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35dc0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
35dd0 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
35de0 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
35df0 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46  open(path, openF
35e00 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46  lags, SQLITE_DEF
35e10 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
35e20 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72  SIONS);.    terr
35e30 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
35e40 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
35e50 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c  o==ENOENT && isl
35e60 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
35e70 20 69 66 28 20 70 72 6f 78 79 43 72 65 61 74 65   if( proxyCreate
35e80 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29 20 3d  LockPath(path) =
35e90 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  = SQLITE_OK ){. 
35ea0 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75         fd = robu
35eb0 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
35ec0 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f  enFlags, SQLITE_
35ed0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
35ee0 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20  MISSIONS);.     
35ef0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
35f00 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f  f( fd<0 ){.    o
35f10 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f  penFlags = O_RDO
35f20 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f  NLY;.    fd = ro
35f30 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
35f40 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54  openFlags, SQLIT
35f50 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
35f60 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
35f70 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
35f80 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
35f90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
35fa0 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  ree(pUnused);.  
35fb0 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65    if( islockfile
35fc0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
35fd0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
35fe0 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28    }.    switch (
35ff0 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20  terrno) {.      
36000 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20  case EACCES:.   
36010 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
36020 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63  TE_PERM;.      c
36030 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20  ase EIO: .      
36040 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36050 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65  IOERR_LOCK; /* e
36060 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
36070 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20   the conch */.  
36080 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
36090 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
360a0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
360b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
360c0 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c   pNew = (unixFil
360d0 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e *)sqlite3_mall
360e0 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  oc(sizeof(*pNew)
360f0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e  );.  if( pNew==N
36100 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
36110 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
36120 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74    goto end_creat
36130 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d  e_proxy;.  }.  m
36140 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
36150 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
36160 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c  ;.  pNew->openFl
36170 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
36180 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79  .  memset(&dummy
36190 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  Vfs, 0, sizeof(d
361a0 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d  ummyVfs));.  dum
361b0 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d  myVfs.pAppData =
361c0 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63   (void*)&autoloc
361d0 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d  kIoFinder;.  dum
361e0 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64  myVfs.zName = "d
361f0 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64  ummy";.  pUnused
36200 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e  ->fd = fd;.  pUn
36210 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70  used->flags = op
36220 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  enFlags;.  pNew-
36230 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73  >pUnused = pUnus
36240 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69  ed;.  .  rc = fi
36250 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75  llInUnixFile(&du
36260 6d 6d 79 56 66 73 2c 20 66 64 2c 20 30 2c 20 28  mmyVfs, fd, 0, (
36270 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e  sqlite3_file*)pN
36280 65 77 2c 20 70 61 74 68 2c 20 30 2c 20 30 2c 20  ew, path, 0, 0, 
36290 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
362a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
362b0 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20  ppFile = pNew;. 
362c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
362d0 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65  _OK;.  }.end_cre
362e0 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20  ate_proxy:    . 
362f0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
36300 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  ew, fd, __LINE__
36310 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
36320 65 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74  e(pNew);.  sqlit
36330 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65 64 29  e3_free(pUnused)
36340 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
36350 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
36360 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65  TEST./* simulate
36370 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
36380 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
36390 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
363a0 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  aths */.int sqli
363b0 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d  te3_hostid_num =
363c0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   0;.#endif..#def
363d0 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54 49 44  ine PROXY_HOSTID
363e0 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a 20 63 6f  LEN    16  /* co
363f0 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 20 69 64  nch file host id
36400 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e   length */../* N
36410 6f 74 20 61 6c 77 61 79 73 20 64 65 66 69 6e 65  ot always define
36420 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 73  d in the headers
36430 20 61 73 20 69 74 20 6f 75 67 68 74 20 74 6f 20   as it ought to 
36440 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74  be */.extern int
36450 20 67 65 74 68 6f 73 74 75 75 69 64 28 75 75 69   gethostuuid(uui
36460 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74 20 73 74  d_t id, const st
36470 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 2a 77  ruct timespec *w
36480 61 69 74 29 3b 0a 0a 2f 2a 20 67 65 74 20 74 68  ait);../* get th
36490 65 20 68 6f 73 74 20 49 44 20 76 69 61 20 67 65  e host ID via ge
364a0 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70 48 6f  thostuuid(), pHo
364b0 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e 74 20  stID must point 
364c0 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  to PROXY_HOSTIDL
364d0 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20  EN .** bytes of 
364e0 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e  writable memory.
364f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
36500 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 75 6e  roxyGetHostID(un
36510 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 48 6f  signed char *pHo
36520 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f  stID, int *pErro
36530 72 29 7b 0a 20 20 61 73 73 65 72 74 28 50 52 4f  r){.  assert(PRO
36540 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20  XY_HOSTIDLEN == 
36550 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29 29 3b  sizeof(uuid_t));
36560 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73 74 49  .  memset(pHostI
36570 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54  D, 0, PROXY_HOST
36580 49 44 4c 45 4e 29 3b 0a 23 69 66 20 48 41 56 45  IDLEN);.#if HAVE
36590 5f 47 45 54 48 4f 53 54 55 55 49 44 0a 20 20 7b  _GETHOSTUUID.  {
365a0 0a 20 20 20 20 73 74 72 75 63 74 20 74 69 6d 65  .    struct time
365b0 73 70 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b  spec timeout = {
365c0 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20  1, 0}; /* 1 sec 
365d0 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 0a  timeout */.    .
365e0 20 20 20 20 69 66 28 20 67 65 74 68 6f 73 74 75      if( gethostu
365f0 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69  uid(pHostID, &ti
36600 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20  meout) ){.      
36610 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b  int err = errno;
36620 0a 20 20 20 20 20 20 69 66 28 20 70 45 72 72 6f  .      if( pErro
36630 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45  r ){.        *pE
36640 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20  rror = err;.    
36650 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
36660 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
36670 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
36680 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
36690 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65  ST.  /* simulate
366a0 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
366b0 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
366c0 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
366d0 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71  aths */.  if( sq
366e0 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
366f0 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73   != 0){.    pHos
36700 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28  tID[0] = (char)(
36710 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68  pHostID[0] + (ch
36720 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74  ar)(sqlite3_host
36730 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b  id_num & 0xFF));
36740 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
36750 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36760 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e  K;.}../* The con
36770 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  ch file contains
36780 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73   the header, hos
36790 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69  t id and lock fi
367a0 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66  le path. */.#def
367b0 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56  ine PROXY_CONCHV
367c0 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d  ERSION 2   /* 1-
367d0 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d  byte header, 16-
367e0 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61  byte host id, pa
367f0 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
36800 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20  OXY_HEADERLEN   
36810 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   1   /* conch fi
36820 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68  le header length
36830 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
36840 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20 28  Y_PATHINDEX    (
36850 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
36860 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
36870 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d  .#define PROXY_M
36880 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f  AXCONCHLEN  (PRO
36890 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
368a0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58  XY_HOSTIDLEN+MAX
368b0 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a  PATHLEN)../* .**
368c0 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63   Takes an open c
368d0 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65  onch file, copie
368e0 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74  s the contents t
368f0 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64  o a new path and
36900 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20   then moves .** 
36910 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65  it back.  The ne
36920 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c 65  wly created file
36930 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  's file descript
36940 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20 74  or is assigned t
36950 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66  o the.** conch f
36960 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ile structure an
36970 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72  d finally the or
36980 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c  iginal conch fil
36990 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
369a0 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74  .** closed.  Ret
369b0 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63  urns zero if suc
369c0 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74  cessful..*/.stat
369d0 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61  ic int proxyBrea
369e0 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46  kConchLock(unixF
369f0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64  ile *pFile, uuid
36a00 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20  _t myHostID){.  
36a10 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
36a20 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
36a30 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
36a40 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
36a50 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69  gContext; .  uni
36a60 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
36a70 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
36a80 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68  le;.  char tPath
36a90 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
36aa0 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d  char buf[PROXY_M
36ab0 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63  AXCONCHLEN];.  c
36ac0 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74  har *cPath = pCt
36ad0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
36ae0 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c  ;.  size_t readL
36af0 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74  en = 0;.  size_t
36b00 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20   pathLen = 0;.  
36b10 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20  char errmsg[64] 
36b20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d  = "";.  int fd =
36b30 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   -1;.  int rc = 
36b40 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  -1;.  UNUSED_PAR
36b50 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49 44 29  AMETER(myHostID)
36b60 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20 61  ;..  /* create a
36b70 20 6e 65 77 20 70 61 74 68 20 62 79 20 72 65 70   new path by rep
36b80 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e  lace the trailin
36b90 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68 20  g '-conch' with 
36ba0 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61  '-break' */.  pa
36bb0 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28  thLen = strlcpy(
36bc0 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d 41  tPath, cPath, MA
36bd0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28  XPATHLEN);.  if(
36be0 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48   pathLen>MAXPATH
36bf0 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36  LEN || pathLen<6
36c00 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c 63   || .     (strlc
36c10 70 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65  py(&tPath[pathLe
36c20 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36  n-5], "break", 6
36c30 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20 73  ) != 5) ){.    s
36c40 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
36c50 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65  sizeof(errmsg),e
36c60 72 72 6d 73 67 2c 22 70 61 74 68 20 65 72 72 6f  rrmsg,"path erro
36c70 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74  r (len %d)",(int
36c80 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67  )pathLen);.    g
36c90 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
36ca0 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64  k;.  }.  /* read
36cb0 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65   the conch conte
36cc0 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20  nt */.  readLen 
36cd0 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46  = osPread(conchF
36ce0 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f  ile->h, buf, PRO
36cf0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20  XY_MAXCONCHLEN, 
36d00 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c 65  0);.  if( readLe
36d10 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n<PROXY_PATHINDE
36d20 58 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  X ){.    sqlite3
36d30 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
36d40 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c  (errmsg),errmsg,
36d50 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e  "read error (len
36d60 20 25 64 29 22 2c 28 69 6e 74 29 72 65 61 64 4c   %d)",(int)readL
36d70 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
36d80 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
36d90 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f  .  /* write it o
36da0 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72  ut to the tempor
36db0 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a  ary break file *
36dc0 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f  /.  fd = robust_
36dd0 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52  open(tPath, (O_R
36de0 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58  DWR|O_CREAT|O_EX
36df0 43 4c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  CL),.           
36e00 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
36e10 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
36e20 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20  ISSIONS);.  if( 
36e30 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  fd<0 ){.    sqli
36e40 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
36e50 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72  eof(errmsg), err
36e60 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69  msg, "create fai
36e70 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
36e80 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
36e90 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
36ea0 20 69 66 28 20 6f 73 50 77 72 69 74 65 28 66 64   if( osPwrite(fd
36eb0 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20  , buf, readLen, 
36ec0 30 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72  0) != (ssize_t)r
36ed0 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71  eadLen ){.    sq
36ee0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
36ef0 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65  izeof(errmsg), e
36f00 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61  rrmsg, "write fa
36f10 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
36f20 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
36f30 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
36f40 20 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61    if( rename(tPa
36f50 74 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20  th, cPath) ){.  
36f60 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
36f70 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
36f80 29 2c 20 65 72 72 6d 73 67 2c 20 22 72 65 6e 61  ), errmsg, "rena
36f90 6d 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  me failed (%d)",
36fa0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
36fb0 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
36fc0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20  .  }.  rc = 0;. 
36fd0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
36fe0 20 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f   "broke stale lo
36ff0 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61  ck on %s\n", cPa
37000 74 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f 63 6c  th);.  robust_cl
37010 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68  ose(pFile, conch
37020 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
37030 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d  _);.  conchFile-
37040 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68  >h = fd;.  conch
37050 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  File->openFlags 
37060 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  = O_RDWR | O_CRE
37070 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f  AT;..end_breaklo
37080 63 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  ck:.  if( rc ){.
37090 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
370a0 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  .      osUnlink(
370b0 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72 6f  tPath);.      ro
370c0 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
370d0 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
370e0 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
370f0 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c  tf(stderr, "fail
37100 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c  ed to break stal
37110 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73  e lock on %s, %s
37120 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d  \n", cPath, errm
37130 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sg);.  }.  retur
37140 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
37150 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
37160 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
37170 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20   file and break 
37180 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20  a stale lock if 
37190 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20  the .** host id 
371a0 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74  matches..*/.stat
371b0 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63  ic int proxyConc
371c0 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
371d0 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
371e0 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b  HostID, int lock
371f0 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  Type){.  proxyLo
37200 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
37210 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
37220 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
37230 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
37240 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t; .  unixFile *
37250 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
37260 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69  ->conchFile;.  i
37270 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37280 4b 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  K;.  struct time
37290 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d  spec conchModTim
372a0 65 3b 0a 20 20 0a 20 20 64 6f 20 7b 0a 20 20 20  e;.  .  do {.   
372b0 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
372c0 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
372d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
372e0 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79  onchFile, lockTy
372f0 70 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  pe);.    if( rc=
37300 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
37310 20 20 20 20 20 20 70 43 74 78 2d 3e 6e 46 61 69        pCtx->nFai
37320 6c 73 20 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a 20  ls ++;.      /* 
37330 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  If the lock fail
37340 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20  ed (busy):.     
37350 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74    * 1st try: get
37360 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66   the mod time of
37370 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74   the conch, wait
37380 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67   0.5s and try ag
37390 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32  ain. .       * 2
373a0 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20  nd try: fail if 
373b0 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61  the mod time cha
373c0 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20  nged or host id 
373d0 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61  is different, wa
373e0 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20  it .       *    
373f0 20 20 20 20 20 20 20 31 30 20 73 65 63 20 61 6e         10 sec an
37400 64 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20  d try again.    
37410 20 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72     * 3rd try: br
37420 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c  eak the lock unl
37430 65 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65  ess the mod time
37440 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20   has changed..  
37450 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
37460 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
37470 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
37480 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26  (conchFile->h, &
37490 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  buf) ){.        
374a0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
374b0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
374c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
374d0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
374e0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
374f0 20 69 66 28 20 70 43 74 78 2d 3e 6e 46 61 69 6c   if( pCtx->nFail
37500 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  s==1 ){.        
37510 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62  conchModTime = b
37520 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b  uf.st_mtimespec;
37530 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28  .        usleep(
37540 35 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74  500000); /* wait
37550 20 30 2e 35 20 73 65 63 20 61 6e 64 20 74 72 79   0.5 sec and try
37560 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a   the lock again*
37570 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  /.        contin
37580 75 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20  ue;  .      }.. 
37590 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 74       assert( pCt
375a0 78 2d 3e 6e 46 61 69 6c 73 3e 31 20 29 3b 0a 20  x->nFails>1 );. 
375b0 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f       if( conchMo
375c0 64 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20  dTime.tv_sec != 
375d0 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
375e0 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20  .tv_sec || .    
375f0 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d       conchModTim
37600 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66  e.tv_nsec != buf
37610 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76  .st_mtimespec.tv
37620 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20  _nsec ){.       
37630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
37640 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  USY;.      }.   
37650 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 70 43     .      if( pC
37660 74 78 2d 3e 6e 46 61 69 6c 73 3d 3d 32 20 29 7b  tx->nFails==2 ){
37670 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20    .        char 
37680 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  tBuf[PROXY_MAXCO
37690 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20  NCHLEN];.       
376a0 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65   int len = osPre
376b0 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ad(conchFile->h,
376c0 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58   tBuf, PROXY_MAX
376d0 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
376e0 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20        if( len<0 
376f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
37700 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
37710 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
37720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
37730 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
37740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
37750 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49   len>PROXY_PATHI
37760 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d  NDEX && tBuf[0]=
37770 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e  =(char)PROXY_CON
37780 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20  CHVERSION){.    
37790 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62        /* don't b
377a0 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66  reak the lock if
377b0 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65   the host id doe
377c0 73 6e 27 74 20 6d 61 74 63 68 2c 20 62 75 74 20  sn't match, but 
377d0 64 6f 20 6c 6f 67 0a 20 20 20 20 20 20 20 20 20  do log.         
377e0 20 20 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20    * an error to 
377f0 63 6f 6e 73 6f 6c 65 20 73 6f 20 75 73 65 72 73  console so users
37800 20 63 61 6e 20 64 69 61 67 6e 6f 73 65 20 73 74   can diagnose st
37810 61 6c 65 20 4e 46 53 20 6c 6f 63 6b 73 20 6d 6f  ale NFS locks mo
37820 72 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 2a  re .           *
37830 20 65 61 73 69 6c 79 20 0a 20 20 20 20 20 20 20   easily .       
37840 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
37850 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26   if( 0!=memcmp(&
37860 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45  tBuf[PROXY_HEADE
37870 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c  RLEN], myHostID,
37880 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
37890 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
378a0 20 75 75 69 64 5f 74 20 63 6f 6e 63 68 55 55 49   uuid_t conchUUI
378b0 44 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  D;.            u
378c0 75 69 64 5f 73 74 72 69 6e 67 5f 74 20 63 6f 6e  uid_string_t con
378d0 63 68 55 55 49 44 53 74 72 69 6e 67 3b 0a 20 20  chUUIDString;.  
378e0 20 20 20 20 20 20 20 20 20 20 75 75 69 64 5f 73            uuid_s
378f0 74 72 69 6e 67 5f 74 20 6d 79 55 55 49 44 53 74  tring_t myUUIDSt
37900 72 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20  ring;.          
37910 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48    assert(PROXY_H
37920 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65  OSTIDLEN == size
37930 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 20  of(uuid_t));.   
37940 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
37950 63 6f 6e 63 68 55 55 49 44 2c 20 26 74 42 75 66  conchUUID, &tBuf
37960 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
37970 5d 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  ], PROXY_HOSTIDL
37980 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  EN);.           
37990 20 75 75 69 64 5f 75 6e 70 61 72 73 65 28 63 6f   uuid_unparse(co
379a0 6e 63 68 55 55 49 44 2c 20 63 6f 6e 63 68 55 55  nchUUID, conchUU
379b0 49 44 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20  IDString);.     
379c0 20 20 20 20 20 20 20 75 75 69 64 5f 75 6e 70 61         uuid_unpa
379d0 72 73 65 28 6d 79 48 6f 73 74 49 44 2c 20 6d 79  rse(myHostID, my
379e0 55 55 49 44 53 74 72 69 6e 67 29 3b 0a 20 20 20  UUIDString);.   
379f0 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
37a00 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
37a10 20 73 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   sqlite database
37a20 20 69 73 20 6c 6f 63 6b 65 64 20 62 65 63 61 75   is locked becau
37a30 73 65 20 69 74 20 69 73 20 69 6e 20 75 73 65 20  se it is in use 
37a40 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
37a50 20 20 20 20 20 20 22 62 79 20 61 6e 6f 74 68 65        "by anothe
37a60 72 20 68 6f 73 74 20 74 68 61 74 20 68 6f 6c 64  r host that hold
37a70 73 20 61 20 68 6f 73 74 2d 65 78 63 6c 75 73 69  s a host-exclusi
37a80 76 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 3b 20 22  ve lock on %s; "
37a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37aa0 20 20 20 20 20 22 74 68 69 73 20 68 6f 73 74 20       "this host 
37ab0 28 55 55 49 44 20 25 73 29 20 63 61 6e 6e 6f 74  (UUID %s) cannot
37ac0 20 6f 76 65 72 72 69 64 65 20 74 68 65 20 68 6f   override the ho
37ad0 73 74 2d 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  st-exclusive loc
37ae0 6b 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  k ".            
37af0 20 20 20 20 20 20 20 20 22 75 6e 74 69 6c 20 74          "until t
37b00 68 65 20 6f 74 68 65 72 20 68 6f 73 74 20 28 55  he other host (U
37b10 55 49 44 20 25 73 29 20 72 65 6c 65 61 73 65 73  UID %s) releases
37b20 20 69 74 73 20 6c 6f 63 6b 73 20 6f 6e 20 25 73   its locks on %s
37b30 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
37b40 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
37b50 3e 7a 50 61 74 68 2c 20 6d 79 55 55 49 44 53 74  >zPath, myUUIDSt
37b60 72 69 6e 67 2c 20 63 6f 6e 63 68 55 55 49 44 53  ring, conchUUIDS
37b70 74 72 69 6e 67 2c 20 63 6f 6e 63 68 46 69 6c 65  tring, conchFile
37b80 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
37b90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
37ba0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
37bb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
37bc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
37bd0 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68  * don't break th
37be0 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20  e lock on short 
37bf0 72 65 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f  read or a versio
37c00 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20  n mismatch */.  
37c10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
37c20 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
37c30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73      }.        us
37c40 6c 65 65 70 28 31 30 30 30 30 30 30 30 29 3b 20  leep(10000000); 
37c50 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63 20 61  /* wait 10 sec a
37c60 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20  nd try the lock 
37c70 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20  again */.       
37c80 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20   continue; .    
37c90 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
37ca0 20 61 73 73 65 72 74 28 20 70 43 74 78 2d 3e 6e   assert( pCtx->n
37cb0 46 61 69 6c 73 3e 3d 33 20 29 3b 0a 20 20 20 20  Fails>=3 );.    
37cc0 20 20 69 66 28 20 28 70 43 74 78 2d 3e 6e 46 61    if( (pCtx->nFa
37cd0 69 6c 73 3d 3d 33 29 26 26 28 30 3d 3d 70 72 6f  ils==3)&&(0==pro
37ce0 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b  xyBreakConchLock
37cf0 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44  (pFile, myHostID
37d00 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  )) ){.        rc
37d10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
37d20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79        if( lockTy
37d30 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
37d40 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
37d50 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
37d60 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
37d70 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
37d80 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
37d90 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20 20  LOCK);          
37da0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37db0 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
37dc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
37dd0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
37de0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
37df0 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
37e00 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
37e10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
37e20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72    }.  } while( r
37e30 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
37e40 26 20 70 43 74 78 2d 3e 6e 46 61 69 6c 73 3c 33  & pCtx->nFails<3
37e50 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20   );.  .  return 
37e60 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20  rc;.}../* Takes 
37e70 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b  the conch by tak
37e80 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
37e90 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20 63  k and read the c
37ea0 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69  ontents conch, i
37eb0 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69  f .** lockPath i
37ec0 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20  s non-NULL, the 
37ed0 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b  host ID and lock
37ee0 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20   file path must 
37ef0 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a  match.  A NULL .
37f00 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e  ** lockPath mean
37f10 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50  s that the lockP
37f20 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  ath in the conch
37f30 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73   file will be us
37f40 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f  ed if the .** ho
37f50 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72  st IDs match, or
37f60 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68   a new lock path
37f70 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
37f80 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
37f90 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e   .** and written
37fa0 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69   to the conch fi
37fb0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
37fc0 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  t proxyTakeConch
37fd0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
37fe0 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
37ff0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
38000 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
38010 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
38020 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
38030 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63    .  if( pCtx->c
38040 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20  onchHeld!=0 ){. 
38050 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
38060 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
38070 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
38080 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
38090 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69  nchFile;.    uui
380a0 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20  d_t myHostID;.  
380b0 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30    int pError = 0
380c0 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61 64 42  ;.    char readB
380d0 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
380e0 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
380f0 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48  lockPath[MAXPATH
38100 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a  LEN];.    char *
38110 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e  tempLockPath = N
38120 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  ULL;.    int rc 
38130 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
38140 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68   int createConch
38150 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f   = 0;.    int ho
38160 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20  stIdMatch = 0;. 
38170 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d     int readLen =
38180 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f   0;.    int tryO
38190 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ldLockPath = 0;.
381a0 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77      int forceNew
381b0 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20  LockPath = 0;.  
381c0 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28    .    OSTRACE((
381d0 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66  "TAKECONCH  %d f
381e0 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
381f0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
38200 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74              (pCt
38210 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
38220 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   ? pCtx->lockPro
38230 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a  xyPath : ":auto:
38240 22 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  "), getpid()));.
38250 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47  .    rc = proxyG
38260 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49  etHostID(myHostI
38270 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20  D, &pError);.   
38280 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d   if( (rc&0xff)==
38290 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
382a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
382b0 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b  tErrno = pError;
382c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
382d0 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
382e0 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43  .    rc = proxyC
382f0 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  onchLock(pFile, 
38300 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44  myHostID, SHARED
38310 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
38320 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
38330 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
38340 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
38350 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65  .    /* read the
38360 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20   existing conch 
38370 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64  file */.    read
38380 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61  Len = seekAndRea
38390 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e  d((unixFile*)con
383a0 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42  chFile, 0, readB
383b0 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
383c0 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20  CHLEN);.    if( 
383d0 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20  readLen<0 ){.   
383e0 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a     /* I/O error:
383f0 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62   lastErrno set b
38400 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f  y seekAndRead */
38410 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
38420 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46  stErrno = conchF
38430 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
38440 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
38450 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
38460 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
38470 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73  econch;.    }els
38480 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28  e if( readLen<=(
38490 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
384a0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
384b0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
384c0 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63    readBuf[0]!=(c
384d0 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
384e0 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  ERSION ){.      
384f0 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20  /* a short read 
38500 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61  or version forma
38510 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73  t mismatch means
38520 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
38530 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20  te a new .      
38540 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a  ** conch file. .
38550 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
38560 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a  reateConch = 1;.
38570 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20      }.    /* if 
38580 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63  the host id matc
38590 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  hes and the lock
385a0 20 70 61 74 68 20 61 6c 72 65 61 64 79 20 65 78   path already ex
385b0 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63  ists in the conc
385c0 68 0a 20 20 20 20 2a