/ Hex Artifact Content
Login

Artifact 8f60f53930d4c9e781c46d803b3534d004282442:


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 69 6e 74 20 64 69 72 66 64 3b 20 20  /.  int dirfd;  
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1be0: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
1bf0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a  he directory */.
1c00: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1c10: 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20  eFileLock;      
1c20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 79 70        /* The typ
1c30: 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  e of lock held o
1c40: 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 75  n this fd */.  u
1c50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 74 72  nsigned char ctr
1c60: 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  lFlags;         
1c70: 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72 61 6c     /* Behavioral
1c80: 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49 4c 45   bits.  UNIXFILE
1c90: 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  _* flags */.  in
1ca0: 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  t lastErrno;    
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72    /* The unix er
1cd0: 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20 49 2f  rno from last I/
1ce0: 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69  O error */.  voi
1cf0: 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  d *lockingContex
1d00: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1d10: 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c   /* Locking styl
1d20: 65 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  e specific state
1d30: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
1d40: 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20  Fd *pUnused;    
1d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1d60: 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69 78 55  -allocated UnixU
1d70: 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63 6f 6e  nusedFd */.  con
1d80: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20  st char *zPath; 
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1db0: 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  file */.  unixSh
1dc0: 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20  m *pShm;        
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de0: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73   Shared memory s
1df0: 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61 74 69  egment informati
1e00: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68  on */.  int szCh
1e10: 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  unk;            
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1e30: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43 4e  onfigured by FCN
1e40: 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f  TL_CHUNK_SIZE */
1e50: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1e60: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1e70: 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
1e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6c         /* The fl
1ea0: 61 67 73 20 73 70 65 63 69 66 69 65 64 20 61 74  ags specified at
1eb0: 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e 64 69   open() */.#endi
1ec0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
1ed0: 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
1ee0: 49 4f 4e 0a 20 20 69 6e 74 20 70 72 6f 74 46 6c  ION.  int protFl
1ef0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1f10: 61 20 70 72 6f 74 65 63 74 69 6f 6e 20 66 6c 61  a protection fla
1f20: 67 73 20 66 72 6f 6d 20 75 6e 69 78 4f 70 65 6e  gs from unixOpen
1f30: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1f40: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1f50: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1f60: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1f70: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1f80: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1f90: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1fa0: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1fb0: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1fc0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1fd0: 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 3b 20    int isDelete; 
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
2000: 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65  on close if true
2010: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77   */.  struct vxw
2020: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b  orksFileId *pId;
2030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69            /* Uni
2040: 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a 23  que file ID */.#
2050: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e 44  endif.#ifndef ND
2060: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65  EBUG.  /* The ne
2070: 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72 69  xt group of vari
2080: 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 74  ables are used t
2090: 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72 20  o track whether 
20a0: 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20  or not the.  ** 
20b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
20c0: 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34 2d  ter in bytes 24-
20d0: 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  27 of database f
20e0: 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65 64  iles are updated
20f0: 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20 61  .  ** whenever a
2100: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
2110: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
2120: 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66    An assertion f
2130: 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f  ault will.  ** o
2140: 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20 69  ccur if a file i
2150: 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f 75  s updated withou
2160: 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67 20  t also updating 
2170: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
2180: 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54    ** counter.  T
2190: 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64 65  his test is made
21a0: 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70 72   to avoid new pr
21b0: 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20 74  oblems similar t
21c0: 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64  o the.  ** one d
21d0: 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63 6b  escribed by tick
21e0: 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a  et #3584. .  */.
21f0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2200: 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20  transCntrChng;  
2210: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2220: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
2230: 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ter changed */. 
2240: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64   unsigned char d
2250: 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20 20  bUpdate;        
2260: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70  /* True if any p
2270: 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65 20  art of database 
2280: 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  file changed */.
2290: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
22a0: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20  inNormalWrite;  
22b0: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20 61   /* True if in a
22c0: 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f 70   normal write op
22d0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69  eration */.#endi
22e0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
22f0: 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73  TEST.  /* In tes
2300: 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65  t mode, increase
2310: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69   the size of thi
2320: 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62 69  s structure a bi
2330: 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20  t so that .  ** 
2340: 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  it is larger tha
2350: 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72 61  n the struct Cra
2360: 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69  shFile defined i
2370: 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a  n test6.c..  */.
2380: 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b    char aPadding[
2390: 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  32];.#endif.};..
23a0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61  /*.** Allowed va
23b0: 6c 75 65 73 20 66 6f 72 20 74 68 65 20 75 6e 69  lues for the uni
23c0: 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 20  xFile.ctrlFlags 
23d0: 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66  bitmask:.*/.#def
23e0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45 58 43  ine UNIXFILE_EXC
23f0: 4c 20 20 20 20 20 20 20 20 30 78 30 31 20 20 20  L        0x01   
2400: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 73    /* Connections
2410: 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65 73   from one proces
2420: 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e  s only */.#defin
2430: 65 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  e UNIXFILE_RDONL
2440: 59 20 20 20 20 20 20 30 78 30 32 20 20 20 20 20  Y      0x02     
2450: 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  /* Connection is
2460: 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64   read only */.#d
2470: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50  efine UNIXFILE_P
2480: 45 52 53 49 53 54 5f 57 41 4c 20 30 78 30 34 20  ERSIST_WAL 0x04 
2490: 20 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e      /* Persisten
24a0: 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 0a 2f  t WAL mode */../
24b0: 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64  *.** Include cod
24c0: 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e  e that is common
24d0: 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66   to all os_*.c f
24e0: 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  iles.*/.#include
24f0: 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a   "os_common.h"..
2500: 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72  /*.** Define var
2510: 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74  ious macros that
2520: 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f   are missing fro
2530: 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a  m some systems..
2540: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52  */.#ifndef O_LAR
2550: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
2560: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2570: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
2580: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23  TE_DISABLE_LFS.#
2590: 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49   undef O_LARGEFI
25a0: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
25b0: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
25c0: 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c  .#ifndef O_NOFOL
25d0: 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e  LOW.# define O_N
25e0: 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66  OFOLLOW 0.#endif
25f0: 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52  .#ifndef O_BINAR
2600: 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e  Y.# define O_BIN
2610: 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ARY 0.#endif../*
2620: 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64  .** The threadid
2630: 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20   macro resolves 
2640: 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64  to the thread-id
2650: 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20   or to 0.  Used 
2660: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
2670: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
2680: 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  y..*/.#if SQLITE
2690: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66  _THREADSAFE.#def
26a0: 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68  ine threadid pth
26b0: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73  read_self().#els
26c0: 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  e.#define thread
26d0: 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66  id 0.#endif..#if
26e0: 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 23 64  def __APPLE__.#d
26f0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41  efine SQLITE_ENA
2700: 42 4c 45 5f 53 55 50 45 52 4c 4f 43 4b 20 31 0a  BLE_SUPERLOCK 1.
2710: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
2720: 54 45 5f 45 4e 41 42 4c 45 5f 53 55 50 45 52 4c  TE_ENABLE_SUPERL
2730: 4f 43 4b 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  OCK.#include "sq
2740: 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75 64  lite3.h".#includ
2750: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 20 20 20 20  e <string.h>    
2760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 65             /* me
2770: 6d 73 65 74 28 29 2c 20 73 74 72 6c 65 6e 28 29  mset(), strlen()
2780: 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73   */.#include <as
2790: 73 65 72 74 2e 68 3e 20 20 20 20 20 20 20 20 20  sert.h>         
27a0: 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
27b0: 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  ) */../*.** A st
27c0: 72 75 63 74 75 72 65 20 74 6f 20 63 6f 6c 6c 65  ructure to colle
27d0: 63 74 20 61 20 62 75 73 79 2d 68 61 6e 64 6c 65  ct a busy-handle
27e0: 72 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 61  r callback and a
27f0: 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 20 63 6f  rgument and a co
2800: 75 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 75  unt.** of the nu
2810: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 69 74  mber of times it
2820: 20 68 61 73 20 62 65 65 6e 20 69 6e 76 6f 6b 65   has been invoke
2830: 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 70  d..*/.struct Sup
2840: 65 72 6c 6f 63 6b 42 75 73 79 20 7b 0a 20 20 69  erlockBusy {.  i
2850: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
2860: 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20 20 2f  *,int);        /
2870: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73  * Pointer to bus
2880: 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
2890: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
28a0: 75 73 79 41 72 67 3b 20 20 20 20 20 20 20 20 20  usyArg;         
28b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
28c0: 20 61 72 67 20 74 6f 20 70 61 73 73 20 74 6f 20   arg to pass to 
28d0: 78 42 75 73 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  xBusy */.  int n
28e0: 42 75 73 79 3b 20 20 20 20 20 20 20 20 20 20 20  Busy;           
28f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2900: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 78 42  mber of times xB
2910: 75 73 79 20 68 61 73 20 62 65 65 6e 20 69 6e 76  usy has been inv
2920: 6f 6b 65 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64  oked */.};.typed
2930: 65 66 20 73 74 72 75 63 74 20 53 75 70 65 72 6c  ef struct Superl
2940: 6f 63 6b 42 75 73 79 20 53 75 70 65 72 6c 6f 63  ockBusy Superloc
2950: 6b 42 75 73 79 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  kBusy;../*.** An
2960: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2970: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2980: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
2990: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
29a0: 65 0a 2a 2a 20 73 75 70 65 72 6c 6f 63 6b 2e 20  e.** superlock. 
29b0: 54 68 65 20 6f 70 61 71 75 65 20 68 61 6e 64 6c  The opaque handl
29c0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
29d0: 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c  lite3demo_superl
29e0: 6f 63 6b 28 29 20 69 73 0a 2a 2a 20 61 63 74 75  ock() is.** actu
29f0: 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
2a00: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
2a10: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e   this structure.
2a20: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 70 65 72  .*/.struct Super
2a30: 6c 6f 63 6b 20 7b 0a 20 20 73 71 6c 69 74 65 33  lock {.  sqlite3
2a40: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2a60: 62 61 73 65 20 68 61 6e 64 6c 65 20 75 73 65 64  base handle used
2a70: 20 74 6f 20 6c 6f 63 6b 20 64 62 20 2a 2f 0a 20   to lock db */. 
2a80: 20 69 6e 74 20 62 57 61 6c 3b 20 20 20 20 20 20   int bWal;      
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 2f 2a 20 54 72 75 65 20 69 66 20 64 62 20 69   /* True if db i
2ab0: 73 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  s a WAL database
2ac0: 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73   */.};.typedef s
2ad0: 74 72 75 63 74 20 53 75 70 65 72 6c 6f 63 6b 20  truct Superlock 
2ae0: 53 75 70 65 72 6c 6f 63 6b 3b 0a 0a 2f 2a 0a 2a  Superlock;../*.*
2af0: 2a 20 54 68 65 20 70 43 74 78 20 70 6f 69 6e 74  * The pCtx point
2b00: 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  er passed to thi
2b10: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 63  s function is ac
2b20: 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  tually a pointer
2b30: 20 74 6f 20 61 0a 2a 2a 20 53 75 70 65 72 6c 6f   to a.** Superlo
2b40: 63 6b 42 75 73 79 20 73 74 72 75 63 74 75 72 65  ckBusy structure
2b50: 2e 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  . Invoke the bus
2b60: 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
2b70: 6f 6e 20 65 6e 63 61 70 73 75 6c 61 74 65 64 0a  on encapsulated.
2b80: 2a 2a 20 62 79 20 74 68 65 20 73 74 72 75 63 74  ** by the struct
2b90: 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ure and return t
2ba0: 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  he result..*/.st
2bb0: 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f  atic int superlo
2bc0: 63 6b 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  ckBusyHandler(vo
2bd0: 69 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 55 4e  id *pCtx, int UN
2be0: 55 53 45 44 29 7b 0a 20 20 53 75 70 65 72 6c 6f  USED){.  Superlo
2bf0: 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 3d 20  ckBusy *pBusy = 
2c00: 28 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a  (SuperlockBusy *
2c10: 29 70 43 74 78 3b 0a 20 20 69 66 28 20 70 42 75  )pCtx;.  if( pBu
2c20: 73 79 2d 3e 78 42 75 73 79 3d 3d 30 20 29 20 72  sy->xBusy==0 ) r
2c30: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
2c40: 6e 20 70 42 75 73 79 2d 3e 78 42 75 73 79 28 70  n pBusy->xBusy(p
2c50: 42 75 73 79 2d 3e 70 42 75 73 79 41 72 67 2c 20  Busy->pBusyArg, 
2c60: 70 42 75 73 79 2d 3e 6e 42 75 73 79 2b 2b 29 3b  pBusy->nBusy++);
2c70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2c80: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2c90: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
2ca0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
2cb0: 65 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 63  e file for .** c
2cc0: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20  onnection db is 
2cd0: 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65  open in WAL mode
2ce0: 20 6f 72 20 6e 6f 74 2e 20 49 66 20 6e 6f 20 65   or not. If no e
2cf0: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20  rror occurs and 
2d00: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2d10: 66 69 6c 65 20 69 73 20 69 6e 20 57 41 4c 20 6d  file is in WAL m
2d20: 6f 64 65 2c 20 73 65 74 20 2a 70 62 57 61 6c 20  ode, set *pbWal 
2d30: 74 6f 20 74 72 75 65 20 61 6e 64 20 72 65 74 75  to true and retu
2d40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
2d50: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 69 6e   If it is not in
2d60: 20 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20 2a   WAL mode, set *
2d70: 70 62 57 61 6c 20 74 6f 20 66 61 6c 73 65 2e 0a  pbWal to false..
2d80: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2d90: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
2da0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
2db0: 20 63 6f 64 65 2e 20 54 68 65 20 76 61 6c 75 65   code. The value
2dc0: 20 6f 66 20 2a 70 62 57 61 6c 0a 2a 2a 20 69 73   of *pbWal.** is
2dd0: 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
2de0: 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
2df0: 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63 6b  ic int superlock
2e00: 49 73 57 61 6c 28 53 75 70 65 72 6c 6f 63 6b 20  IsWal(Superlock 
2e10: 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  *pLock){.  int r
2e20: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2e40: 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 73  turn Code */.  s
2e50: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
2e60: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  mt;            /
2e70: 2a 20 43 6f 6d 70 69 6c 65 64 20 50 52 41 47 4d  * Compiled PRAGM
2e80: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73  A journal_mode s
2e90: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 72  tatement */..  r
2ea0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
2eb0: 61 72 65 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22  are(pLock->db, "
2ec0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72  PRAGMA main.jour
2ed0: 6e 61 6c 5f 6d 6f 64 65 22 2c 20 2d 31 2c 20 26  nal_mode", -1, &
2ee0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
2ef0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
2f10: 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 30 3b 0a  Lock->bWal = 0;.
2f20: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
2f30: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
2f40: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 63 6f 6e  Stmt) ){.    con
2f50: 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d  st char *zMode =
2f60: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
2f70: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2f80: 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  xt(pStmt, 0);.  
2f90: 20 20 69 66 28 20 7a 4d 6f 64 65 20 26 26 20 73    if( zMode && s
2fa0: 74 72 6c 65 6e 28 7a 4d 6f 64 65 29 3d 3d 33 20  trlen(zMode)==3 
2fb0: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
2fc0: 63 6d 70 28 22 77 61 6c 22 2c 20 7a 4d 6f 64 65  cmp("wal", zMode
2fd0: 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 3)==0 ){.     
2fe0: 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 31   pLock->bWal = 1
2ff0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
3000: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69  eturn sqlite3_fi
3010: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d  nalize(pStmt);.}
3020: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  ../*.** Obtain a
3030: 6e 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d 2d  n exclusive shm-
3040: 6c 6f 63 6b 20 6f 6e 20 6e 42 79 74 65 20 62 79  lock on nByte by
3050: 74 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  tes starting at 
3060: 6f 66 66 73 65 74 20 69 64 78 0a 2a 2a 20 6f 66  offset idx.** of
3070: 20 74 68 65 20 66 69 6c 65 20 66 64 2e 20 49 66   the file fd. If
3080: 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
3090: 20 62 65 20 6f 62 74 61 69 6e 65 64 20 69 6d 6d   be obtained imm
30a0: 65 64 69 61 74 65 6c 79 2c 20 69 6e 76 6f 6b 65  ediately, invoke
30b0: 0a 2a 2a 20 74 68 65 20 62 75 73 79 2d 68 61 6e  .** the busy-han
30c0: 64 6c 65 72 20 75 6e 74 69 6c 20 65 69 74 68 65  dler until eithe
30d0: 72 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64  r it is obtained
30e0: 20 6f 72 20 74 68 65 20 62 75 73 79 2d 68 61 6e   or the busy-han
30f0: 64 6c 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b  dler.** callback
3100: 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2f 0a 73   returns 0..*/.s
3110: 74 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c  tatic int superl
3120: 6f 63 6b 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  ockShmLock(.  sq
3130: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3150: 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
3160: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
3170: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
3180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
3190: 66 73 65 74 20 6f 66 20 73 68 6d 2d 6c 6f 63 6b  fset of shm-lock
31a0: 20 74 6f 20 6f 62 74 61 69 6e 20 2a 2f 0a 20 20   to obtain */.  
31b0: 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  /* Number of con
31e0: 73 65 63 74 69 76 65 20 62 79 74 65 73 20 74 6f  sective bytes to
31f0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 53 75 70 65 72   lock */.  Super
3200: 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20  lockBusy *pBusy 
3210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
3220: 73 79 2d 68 61 6e 64 6c 65 72 20 77 72 61 70 70  sy-handler wrapp
3230: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  er object */.){.
3240: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
3250: 28 2a 78 53 68 6d 4c 6f 63 6b 29 28 73 71 6c 69  (*xShmLock)(sqli
3260: 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2c 20  te3_file*, int, 
3270: 69 6e 74 2c 20 69 6e 74 29 20 3d 20 66 64 2d 3e  int, int) = fd->
3280: 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f  pMethods->xShmLo
3290: 63 6b 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  ck;.  do {.    r
32a0: 63 20 3d 20 78 53 68 6d 4c 6f 63 6b 28 66 64 2c  c = xShmLock(fd,
32b0: 20 69 64 78 2c 20 6e 42 79 74 65 2c 20 53 51 4c   idx, nByte, SQL
32c0: 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 7c 53 51 4c  ITE_SHM_LOCK|SQL
32d0: 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
32e0: 45 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  E);.  }while( rc
32f0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
3300: 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79 48 61   superlockBusyHa
3310: 6e 64 6c 65 72 28 28 76 6f 69 64 20 2a 29 70 42  ndler((void *)pB
3320: 75 73 79 2c 20 30 29 20 29 3b 0a 20 20 72 65 74  usy, 0) );.  ret
3330: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3340: 20 4f 62 74 61 69 6e 20 74 68 65 20 65 78 74 72   Obtain the extr
3350: 61 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 64  a locks on the d
3360: 61 74 61 62 61 73 65 20 66 69 6c 65 20 72 65 71  atabase file req
3370: 75 69 72 65 64 20 66 6f 72 20 57 41 4c 20 64 61  uired for WAL da
3380: 74 61 62 61 73 65 73 2e 0a 2a 2a 20 49 6e 76 6f  tabases..** Invo
3390: 6b 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  ke the supplied 
33a0: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 61 73 20  busy-handler as 
33b0: 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
33c0: 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63  tic int superloc
33d0: 6b 57 61 6c 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  kWalLock(.  sqli
33e0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3400: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f  atabase handle o
3410: 70 65 6e 20 6f 6e 20 57 41 4c 20 64 61 74 61 62  pen on WAL datab
3420: 61 73 65 20 2a 2f 0a 20 20 53 75 70 65 72 6c 6f  ase */.  Superlo
3430: 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 20 20  ckBusy *pBusy   
3440: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73 79           /* Busy
3450: 20 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65 72   handler wrapper
3460: 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
3470: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3490: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
34a0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
34b0: 20 2a 66 64 20 3d 20 30 3b 20 20 20 20 20 20 20   *fd = 0;       
34c0: 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74 61      /* Main data
34d0: 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
34e0: 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74   */.  void volat
34f0: 69 6c 65 20 2a 70 20 3d 20 30 3b 20 20 20 20 20  ile *p = 0;     
3500: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
3510: 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 6f   to first page o
3520: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
3530: 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
3540: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
3550: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62   sqlite3_file ob
3560: 6a 65 63 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ject open on the
3570: 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 20 2a   main db file. *
3580: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
3590: 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
35a0: 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45  , "main", SQLITE
35b0: 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e  _FCNTL_FILE_POIN
35c0: 54 45 52 2c 20 28 76 6f 69 64 20 2a 29 26 66 64  TER, (void *)&fd
35d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
35e0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
35f0: 72 63 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e  rc;..  /* Obtain
3600: 20 74 68 65 20 22 72 65 63 6f 76 65 72 79 22 20   the "recovery" 
3610: 6c 6f 63 6b 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  lock. Normally, 
3620: 74 68 69 73 20 6c 6f 63 6b 20 69 73 20 6f 6e 6c  this lock is onl
3630: 79 20 6f 62 74 61 69 6e 65 64 20 62 79 0a 20 20  y obtained by.  
3640: 2a 2a 20 63 6c 69 65 6e 74 73 20 72 75 6e 6e 69  ** clients runni
3650: 6e 67 20 64 61 74 61 62 61 73 65 20 72 65 63 6f  ng database reco
3660: 76 65 72 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 72  very.  .  */.  r
3670: 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d  c = superlockShm
3680: 4c 6f 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20 70  Lock(fd, 2, 1, p
3690: 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 21  Busy);.  if( rc!
36a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
36b0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 5a 65  urn rc;..  /* Ze
36c0: 72 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  ro the start of 
36d0: 74 68 65 20 66 69 72 73 74 20 73 68 61 72 65 64  the first shared
36e0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2e 20 54 68  -memory page. Th
36f0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  is means that an
3700: 79 0a 20 20 2a 2a 20 63 6c 69 65 6e 74 73 20 74  y.  ** clients t
3710: 68 61 74 20 6f 70 65 6e 20 72 65 61 64 20 6f 72  hat open read or
3720: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3730: 6f 6e 73 20 66 72 6f 6d 20 74 68 69 73 20 70 6f  ons from this po
3740: 69 6e 74 20 6f 6e 20 77 69 6c 6c 0a 20 20 2a 2a  int on will.  **
3750: 20 68 61 76 65 20 74 6f 20 72 75 6e 20 72 65 63   have to run rec
3760: 6f 76 65 72 79 20 62 65 66 6f 72 65 20 70 72 6f  overy before pro
3770: 63 65 65 64 69 6e 67 2e 20 53 69 6e 63 65 20 74  ceeding. Since t
3780: 68 65 79 20 6e 65 65 64 20 74 68 65 20 22 72 65  hey need the "re
3790: 63 6f 76 65 72 79 22 0a 20 20 2a 2a 20 6c 6f 63  covery".  ** loc
37a0: 6b 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63  k that this proc
37b0: 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
37c0: 6f 20 64 6f 20 74 68 61 74 2c 20 6e 6f 20 6e 65  o do that, no ne
37d0: 77 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a  w read or write.
37e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
37f0: 73 20 6d 61 79 20 6e 6f 77 20 62 65 20 6f 70 65  s may now be ope
3800: 6e 65 64 2e 20 4e 6f 72 20 63 61 6e 20 61 20 63  ned. Nor can a c
3810: 68 65 63 6b 70 6f 69 6e 74 20 62 65 20 72 75 6e  heckpoint be run
3820: 2c 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73  , for the.  ** s
3830: 61 6d 65 20 72 65 61 73 6f 6e 2e 0a 20 20 2a 2f  ame reason..  */
3840: 0a 20 20 72 63 20 3d 20 66 64 2d 3e 70 4d 65 74  .  rc = fd->pMet
3850: 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 66 64  hods->xShmMap(fd
3860: 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c 20 31 2c  , 0, 32*1024, 1,
3870: 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d   &p);.  if( rc!=
3880: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
3890: 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28  rn rc;.  memset(
38a0: 28 76 6f 69 64 20 2a 29 70 2c 20 30 2c 20 33 32  (void *)p, 0, 32
38b0: 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  );..  /* Obtain 
38c0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
38d0: 6f 6e 20 61 6c 6c 20 74 68 65 20 22 72 65 61 64  on all the "read
38e0: 2d 6c 6f 63 6b 22 20 73 6c 6f 74 73 2e 20 4f 6e  -lock" slots. On
38f0: 63 65 20 74 68 65 73 65 20 6c 6f 63 6b 73 0a 20  ce these locks. 
3900: 20 2a 2a 20 61 72 65 20 68 65 6c 64 2c 20 69 74   ** are held, it
3910: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
3920: 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hat there are no
3930: 20 61 63 74 69 76 65 20 72 65 61 64 65 72 2c 20   active reader, 
3940: 77 72 69 74 65 72 20 6f 72 20 0a 20 20 2a 2a 20  writer or .  ** 
3950: 63 68 65 63 6b 70 6f 69 6e 74 65 72 20 63 6c 69  checkpointer cli
3960: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ents..  */.  rc 
3970: 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f  = superlockShmLo
3980: 63 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49 54 45  ck(fd, 3, SQLITE
3990: 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 70 42  _SHM_NLOCK-3, pB
39a0: 75 73 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  usy);.  return r
39b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  c;.}../*.** Rele
39c0: 61 73 65 20 61 20 73 75 70 65 72 6c 6f 63 6b 20  ase a superlock 
39d0: 68 65 6c 64 20 6f 6e 20 61 20 64 61 74 61 62 61  held on a databa
39e0: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67  se file. The arg
39f0: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
3a00: 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
3a10: 6e 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  n must have been
3a20: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
3a30: 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c   successful call
3a40: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 64 65   to.** sqlite3de
3a50: 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 29 2e 0a  mo_superlock()..
3a60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
3a70: 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
3a80: 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 70 4c 6f  unlock(void *pLo
3a90: 63 6b 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b  ck){.  Superlock
3aa0: 20 2a 70 20 3d 20 28 53 75 70 65 72 6c 6f 63 6b   *p = (Superlock
3ab0: 20 2a 29 70 4c 6f 63 6b 3b 0a 20 20 69 66 28 20   *)pLock;.  if( 
3ac0: 70 2d 3e 62 57 61 6c 20 29 7b 0a 20 20 20 20 69  p->bWal ){.    i
3ad0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3af0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
3b00: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
3b10: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
3b20: 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
3b30: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 73  EXCLUSIVE;.    s
3b40: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
3b50: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
3b60: 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
3b70: 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22  ol(p->db, "main"
3b80: 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46  , SQLITE_FCNTL_F
3b90: 49 4c 45 5f 50 4f 49 4e 54 45 52 2c 20 28 76 6f  ILE_POINTER, (vo
3ba0: 69 64 20 2a 29 26 66 64 29 3b 0a 20 20 20 20 69  id *)&fd);.    i
3bb0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3bc0: 20 29 7b 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d   ){.      fd->pM
3bd0: 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b  ethods->xShmLock
3be0: 28 66 64 2c 20 32 2c 20 31 2c 20 66 6c 61 67 73  (fd, 2, 1, flags
3bf0: 29 3b 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65  );.      fd->pMe
3c00: 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28  thods->xShmLock(
3c10: 66 64 2c 20 33 2c 20 53 51 4c 49 54 45 5f 53 48  fd, 3, SQLITE_SH
3c20: 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 66 6c 61 67 73  M_NLOCK-3, flags
3c30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
3c40: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
3c50: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  db);.  sqlite3_f
3c60: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
3c70: 20 4f 62 74 61 69 6e 20 61 20 73 75 70 65 72 6c   Obtain a superl
3c80: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
3c90: 61 73 65 20 66 69 6c 65 20 69 64 65 6e 74 69 66  ase file identif
3ca0: 69 65 64 20 62 79 20 7a 50 61 74 68 2c 20 75 73  ied by zPath, us
3cb0: 69 6e 67 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69  ing the.** locki
3cc0: 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 70 72  ng primitives pr
3cd0: 6f 76 69 64 65 64 20 62 79 20 56 46 53 20 7a 56  ovided by VFS zV
3ce0: 66 73 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  fs. If successfu
3cf0: 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a  l, SQLITE_OK is.
3d00: 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
3d10: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
3d20: 2a 70 70 4c 6f 63 6b 20 69 73 20 70 6f 70 75 6c  *ppLock is popul
3d30: 61 74 65 64 20 77 69 74 68 20 61 6e 20 6f 70 61  ated with an opa
3d40: 71 75 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 74 68  que handle.** th
3d50: 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 20 77  at may be used w
3d60: 69 74 68 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  ith sqlite3demo_
3d70: 73 75 70 65 72 75 6e 6c 6f 63 6b 28 29 20 74 6f  superunlock() to
3d80: 20 72 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   release the loc
3d90: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  k..**.** If an e
3da0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
3db0: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 30  Lock is set to 0
3dc0: 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65   and an SQLite e
3dd0: 72 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 28 65  rror code .** (e
3de0: 2e 67 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 29  .g. SQLITE_BUSY)
3df0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
3e00: 0a 2a 2a 20 49 66 20 61 20 72 65 71 75 69 72 65  .** If a require
3e10: 64 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  d lock cannot be
3e20: 20 6f 62 74 61 69 6e 65 64 20 69 6d 6d 65 64 69   obtained immedi
3e30: 61 74 65 6c 79 20 61 6e 64 20 74 68 65 20 78 42  ately and the xB
3e40: 75 73 79 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  usy parameter.**
3e50: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
3e60: 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  n is not NULL, t
3e70: 68 65 6e 20 78 42 75 73 79 20 69 73 20 69 6e 76  hen xBusy is inv
3e80: 6f 6b 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  oked in the same
3e90: 20 77 61 79 0a 2a 2a 20 61 73 20 61 20 62 75 73   way.** as a bus
3ea0: 79 2d 68 61 6e 64 6c 65 72 20 72 65 67 69 73 74  y-handler regist
3eb0: 65 72 65 64 20 77 69 74 68 20 53 51 4c 69 74 65  ered with SQLite
3ec0: 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f   (using sqlite3_
3ed0: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 29 29 0a  busy_handler()).
3ee0: 2a 2a 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  ** until either 
3ef0: 74 68 65 20 6c 6f 63 6b 20 63 61 6e 20 62 65 20  the lock can be 
3f00: 6f 62 74 61 69 6e 65 64 20 6f 72 20 74 68 65 20  obtained or the 
3f10: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e  busy-handler fun
3f20: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a  ction returns.**
3f30: 20 30 20 28 69 6e 64 69 63 61 74 69 6e 67 20 22   0 (indicating "
3f40: 67 69 76 65 20 75 70 22 29 2e 0a 2a 2f 0a 73 74  give up")..*/.st
3f50: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
3f60: 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 0a  demo_superlock(.
3f70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
3f80: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
3f90: 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 64 61 74    /* Path to dat
3fa0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 6f  abase file to lo
3fb0: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
3fc0: 61 72 20 2a 7a 56 66 73 2c 20 20 20 20 20 20 20  ar *zVfs,       
3fd0: 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74          /* VFS t
3fe0: 6f 20 75 73 65 20 74 6f 20 61 63 63 65 73 73 20  o use to access 
3ff0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
4000: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c     /* Additional
4030: 20 66 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   flags to pass t
4040: 6f 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  o sqlite3_open_v
4050: 32 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  2 */.  int (*xBu
4060: 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 20  sy)(void*,int), 
4070: 20 20 20 20 20 20 20 2f 2a 20 42 75 73 79 20 68         /* Busy h
4080: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
4090: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
40a0: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
40b0: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
40c0: 61 72 67 20 66 6f 72 20 62 75 73 79 20 68 61 6e  arg for busy han
40d0: 64 6c 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  dler */.  void *
40e0: 2a 70 70 4c 6f 63 6b 20 20 20 20 20 20 20 20 20  *ppLock         
40f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
4100: 3a 20 43 6f 6e 74 65 78 74 20 74 6f 20 70 61 73  : Context to pas
4110: 73 20 74 6f 20 73 75 70 65 72 75 6e 6c 6f 63 6b  s to superunlock
4120: 28 29 20 2a 2f 0a 29 7b 0a 20 20 53 75 70 65 72  () */.){.  Super
4130: 6c 6f 63 6b 42 75 73 79 20 62 75 73 79 20 3d 20  lockBusy busy = 
4140: 7b 30 2c 20 30 2c 20 30 7d 3b 20 2f 2a 20 42 75  {0, 0, 0}; /* Bu
4150: 73 79 20 68 61 6e 64 6c 65 72 20 77 72 61 70 70  sy handler wrapp
4160: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
4170: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4190: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
41a0: 0a 20 20 53 75 70 65 72 6c 6f 63 6b 20 2a 70 4c  .  Superlock *pL
41b0: 6f 63 6b 3b 0a 0a 20 20 70 4c 6f 63 6b 20 3d 20  ock;..  pLock = 
41c0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
41d0: 69 7a 65 6f 66 28 53 75 70 65 72 6c 6f 63 6b 29  izeof(Superlock)
41e0: 29 3b 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  );.  if( !pLock 
41f0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
4200: 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28  NOMEM;.  memset(
4210: 70 4c 6f 63 6b 2c 20 30 2c 20 73 69 7a 65 6f 66  pLock, 0, sizeof
4220: 28 53 75 70 65 72 6c 6f 63 6b 29 29 3b 0a 0a 20  (Superlock));.. 
4230: 20 2f 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62   /* Open a datab
4240: 61 73 65 20 68 61 6e 64 6c 65 20 6f 6e 20 74 68  ase handle on th
4250: 65 20 66 69 6c 65 20 74 6f 20 73 75 70 65 72 6c  e file to superl
4260: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ock. */.  rc = s
4270: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a  qlite3_open_v2(.
4280: 20 20 20 20 20 20 7a 50 61 74 68 2c 20 26 70 4c        zPath, &pL
4290: 6f 63 6b 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  ock->db, SQLITE_
42a0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
42b0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
42c0: 45 7c 66 6c 61 67 73 2c 20 7a 56 66 73 0a 20 20  E|flags, zVfs.  
42d0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 74 61 6c 6c  );..  /* Install
42e0: 20 61 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20   a busy-handler 
42f0: 61 6e 64 20 65 78 65 63 75 74 65 20 61 20 42 45  and execute a BE
4300: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 2e 20 49  GIN EXCLUSIVE. I
4310: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 0a 20 20  f this is not.  
4320: 2a 2a 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  ** a WAL databas
4330: 65 2c 20 74 68 69 73 20 69 73 20 61 6c 6c 20 77  e, this is all w
4340: 65 20 6e 65 65 64 20 74 6f 20 64 6f 2e 20 20 0a  e need to do.  .
4350: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 77 72 61 70    **.  ** A wrap
4360: 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  per function is 
4370: 75 73 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74  used to invoke t
4380: 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
4390: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20  instead of.  ** 
43a0: 72 65 67 69 73 74 65 72 69 6e 67 20 74 68 65 20  registering the 
43b0: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e  busy-handler fun
43c0: 63 74 69 6f 6e 20 73 75 70 70 6c 69 65 64 20 62  ction supplied b
43d0: 79 20 74 68 65 20 75 73 65 72 20 64 69 72 65 63  y the user direc
43e0: 74 6c 79 0a 20 20 2a 2a 20 77 69 74 68 20 53 51  tly.  ** with SQ
43f0: 4c 69 74 65 2e 20 54 68 69 73 20 69 73 20 62 65  Lite. This is be
4400: 63 61 75 73 65 20 74 68 65 20 73 61 6d 65 20 62  cause the same b
4410: 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
4420: 74 69 6f 6e 20 6d 61 79 20 62 65 0a 20 20 2a 2a  tion may be.  **
4430: 20 69 6e 76 6f 6b 65 64 20 64 69 72 65 63 74 6c   invoked directl
4440: 79 20 6c 61 74 65 72 20 6f 6e 20 77 68 65 6e 20  y later on when 
4450: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 62  attempting to ob
4460: 74 61 69 6e 20 74 68 65 20 65 78 74 72 61 20 6c  tain the extra l
4470: 6f 63 6b 73 0a 20 20 2a 2a 20 72 65 71 75 69 72  ocks.  ** requir
4480: 65 64 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ed in WAL mode. 
4490: 42 79 20 75 73 69 6e 67 20 74 68 65 20 77 72 61  By using the wra
44a0: 70 70 65 72 2c 20 77 65 20 61 72 65 20 61 62 6c  pper, we are abl
44b0: 65 20 74 6f 20 67 75 61 72 61 6e 74 65 65 0a 20  e to guarantee. 
44c0: 20 2a 2a 20 74 68 61 74 20 74 68 65 20 22 6e 42   ** that the "nB
44d0: 75 73 79 22 20 69 6e 74 65 67 65 72 20 70 61 72  usy" integer par
44e0: 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f  ameter passed to
44f0: 20 74 68 65 20 75 73 65 72 73 20 62 75 73 79 2d   the users busy-
4500: 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 72 65 70  handler.  ** rep
4510: 72 65 73 65 6e 74 73 20 74 68 65 20 74 6f 74 61  resents the tota
4520: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 75 73 79  l number of busy
4530: 2d 68 61 6e 64 6c 65 72 20 69 6e 76 6f 63 61 74  -handler invocat
4540: 69 6f 6e 73 20 6d 61 64 65 20 77 69 74 68 69 6e  ions made within
4550: 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  .  ** this call 
4560: 74 6f 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73  to sqlite3demo_s
4570: 75 70 65 72 6c 6f 63 6b 28 29 2c 20 69 6e 63 6c  uperlock(), incl
4580: 75 64 69 6e 67 20 61 6e 79 20 6d 61 64 65 20 64  uding any made d
4590: 75 72 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 22  uring the.  ** "
45a0: 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22  BEGIN EXCLUSIVE"
45b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
45c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
45d0: 20 20 62 75 73 79 2e 78 42 75 73 79 20 3d 20 78    busy.xBusy = x
45e0: 42 75 73 79 3b 0a 20 20 20 20 62 75 73 79 2e 70  Busy;.    busy.p
45f0: 42 75 73 79 41 72 67 20 3d 20 70 42 75 73 79 41  BusyArg = pBusyA
4600: 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  rg;.    sqlite3_
4610: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 4c 6f  busy_handler(pLo
4620: 63 6b 2d 3e 64 62 2c 20 73 75 70 65 72 6c 6f 63  ck->db, superloc
4630: 6b 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 28 76  kBusyHandler, (v
4640: 6f 69 64 20 2a 29 26 62 75 73 79 29 3b 0a 20 20  oid *)&busy);.  
4650: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
4660: 78 65 63 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22  xec(pLock->db, "
4670: 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22  BEGIN EXCLUSIVE"
4680: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 0, 0);.  }.
4690: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 42 45 47  .  /* If the BEG
46a0: 49 4e 20 45 58 43 4c 55 53 49 56 45 20 77 61 73  IN EXCLUSIVE was
46b0: 20 65 78 65 63 75 74 65 64 20 73 75 63 63 65 73   executed succes
46c0: 73 66 75 6c 6c 79 20 61 6e 64 20 74 68 69 73 20  sfully and this 
46d0: 69 73 20 61 20 57 41 4c 0a 20 20 2a 2a 20 64 61  is a WAL.  ** da
46e0: 74 61 62 61 73 65 2c 20 63 61 6c 6c 20 73 75 70  tabase, call sup
46f0: 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28 29 20  erlockWalLock() 
4700: 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 65 78  to obtain the ex
4710: 74 72 61 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  tra locks requir
4720: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65  ed.  ** to preve
4730: 6e 74 20 72 65 61 64 65 72 73 2c 20 77 72 69 74  nt readers, writ
4740: 65 72 73 20 61 6e 64 2f 6f 72 20 63 68 65 63 6b  ers and/or check
4750: 70 6f 69 6e 74 65 72 73 20 66 72 6f 6d 20 61 63  pointers from ac
4760: 63 65 73 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  cessing the.  **
4770: 20 64 62 20 77 68 69 6c 65 20 74 68 69 73 20 70   db while this p
4780: 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
4790: 67 20 74 68 65 20 73 75 70 65 72 6c 6f 63 6b 2e  g the superlock.
47a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 66 6f 72  .  **.  ** Befor
47b0: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79  e attempting any
47c0: 20 57 41 4c 20 6c 6f 63 6b 73 2c 20 63 6f 6d 6d   WAL locks, comm
47d0: 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
47e0: 6f 6e 20 73 74 61 72 74 65 64 20 61 62 6f 76 65  on started above
47f0: 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20 74 68  .  ** to drop th
4800: 65 20 57 41 4c 20 72 65 61 64 20 61 6e 64 20 77  e WAL read and w
4810: 72 69 74 65 20 6c 6f 63 6b 73 20 63 75 72 72 65  rite locks curre
4820: 6e 74 6c 79 20 68 65 6c 64 2e 20 4f 74 68 65 72  ntly held. Other
4830: 77 69 73 65 2c 20 74 68 65 0a 20 20 2a 2a 20 6e  wise, the.  ** n
4840: 65 77 20 57 41 4c 20 6c 6f 63 6b 73 20 6d 61 79  ew WAL locks may
4850: 20 63 6f 6e 66 6c 69 63 74 20 77 69 74 68 20 74   conflict with t
4860: 68 65 20 6f 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69  he old..  */.  i
4870: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4880: 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   ){.    if( SQLI
4890: 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 75 70  TE_OK==(rc = sup
48a0: 65 72 6c 6f 63 6b 49 73 57 61 6c 28 70 4c 6f 63  erlockIsWal(pLoc
48b0: 6b 29 29 20 26 26 20 70 4c 6f 63 6b 2d 3e 62 57  k)) && pLock->bW
48c0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
48d0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 4c   sqlite3_exec(pL
48e0: 6f 63 6b 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49 54  ock->db, "COMMIT
48f0: 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
4900: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
4910: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
4920: 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 57 61  rc = superlockWa
4930: 6c 4c 6f 63 6b 28 70 4c 6f 63 6b 2d 3e 64 62 2c  lLock(pLock->db,
4940: 20 26 62 75 73 79 29 3b 0a 20 20 20 20 20 20 7d   &busy);.      }
4950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
4960: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4970: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65  ){.    sqlite3de
4980: 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70  mo_superunlock(p
4990: 4c 6f 63 6b 29 3b 0a 20 20 20 20 2a 70 70 4c 6f  Lock);.    *ppLo
49a0: 63 6b 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ck = 0;.  }else{
49b0: 0a 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70  .    *ppLock = p
49c0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
49d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 41 20  urn rc;.}../* A 
49e0: 63 6f 72 72 75 70 74 20 44 42 20 77 6f 6e 27 74  corrupt DB won't
49f0: 20 77 6f 72 6b 20 77 69 74 68 20 74 68 65 20 73   work with the s
4a00: 71 6c 2d 62 61 73 65 64 20 6c 6f 63 6b 69 6e 67  ql-based locking
4a10: 20 61 74 74 65 6d 70 74 2c 20 67 72 61 62 20 61   attempt, grab a
4a20: 6e 20 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20  n .** exclusive 
4a30: 6c 6f 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20  lock and return 
4a40: 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
4a50: 49 54 45 5f 42 55 53 59 20 69 66 20 74 68 65 20  ITE_BUSY if the 
4a60: 6c 6f 63 6b 20 66 61 69 6c 73 20 0a 2a 2a 20 72  lock fails .** r
4a70: 65 74 75 72 6e 73 20 74 68 65 20 63 75 72 72 65  eturns the curre
4a80: 6e 74 20 6c 6f 63 6b 20 6c 65 76 65 6c 20 68 65  nt lock level he
4a90: 6c 64 20 6f 6e 20 73 71 6c 69 74 65 33 5f 66 69  ld on sqlite3_fi
4aa0: 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le.*/.static int
4ab0: 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
4ac0: 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73  erlock_corrupt(s
4ad0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
4ae0: 20 69 6e 74 20 65 54 61 72 67 65 74 46 69 6c 65   int eTargetFile
4af0: 4c 6f 63 6b 2c 20 69 6e 74 20 2a 70 46 69 6c 65  Lock, int *pFile
4b00: 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
4b10: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
4b20: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
4b30: 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 46 69   eFileLock = pFi
4b40: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  le->eFileLock;. 
4b50: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4b60: 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 65 46  _OK;.  .  if( eF
4b70: 69 6c 65 4c 6f 63 6b 3c 65 54 61 72 67 65 74 46  ileLock<eTargetF
4b80: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
4b90: 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  c = pFile->pMeth
4ba0: 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53 51  od->xLock(id, SQ
4bb0: 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44  LITE_LOCK_SHARED
4bc0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63  );.  }.  if( !rc
4bd0: 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3c 65 54   && eFileLock<eT
4be0: 61 72 67 65 74 46 69 6c 65 4c 6f 63 6b 20 29 7b  argetFileLock ){
4bf0: 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d  .    rc = pFile-
4c00: 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
4c10: 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  id, SQLITE_LOCK_
4c20: 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d 0a  EXCLUSIVE);.  }.
4c30: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
4c40: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
4c50: 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b  Lock > eFileLock
4c60: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
4c70: 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
4c80: 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 29  k(id, eFileLock)
4c90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
4ca0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 20  rn rc;.  }.  if 
4cb0: 28 70 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20  (pFileLock) {.  
4cc0: 20 20 2a 70 46 69 6c 65 4c 6f 63 6b 20 3d 20 65    *pFileLock = e
4cd0: 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  FileLock;.  }.  
4ce0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4cf0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
4d00: 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
4d10: 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28  runlock_corrupt(
4d20: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
4d30: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
4d40: 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
4d50: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
4d60: 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
4d70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20   SQLITE_OK;.  . 
4d80: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
4d90: 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63  eLock > eFileLoc
4da0: 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 46  k ){.    rc = pF
4db0: 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
4dc0: 6e 6c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45  nlock(id, SQLITE
4dd0: 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20  _LOCK_SHARED);. 
4de0: 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
4df0: 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69 6c  eFileLock > eFil
4e00: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74  eLock ){.    int
4e10: 20 75 6e 6c 6f 63 6b 52 43 20 3d 20 70 46 69 6c   unlockRC = pFil
4e20: 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
4e30: 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c  ock(id, SQLITE_L
4e40: 4f 43 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69  OCK_NONE);.    i
4e50: 66 20 28 21 72 63 29 20 72 63 20 3d 20 75 6e 6c  f (!rc) rc = unl
4e60: 6f 63 6b 52 43 3b 0a 20 20 7d 0a 20 20 72 65 74  ockRC;.  }.  ret
4e70: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
4e80: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
4e90: 4c 45 5f 53 55 50 45 52 4c 4f 43 4b 20 2a 2f 0a  LE_SUPERLOCK */.
4ea0: 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e  ../*.** Differen
4eb0: 74 20 55 6e 69 78 20 73 79 73 74 65 6d 73 20 64  t Unix systems d
4ec0: 65 63 6c 61 72 65 20 6f 70 65 6e 28 29 20 69 6e  eclare open() in
4ed0: 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 2e   different ways.
4ee0: 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70    Same use.** op
4ef0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  en(const char*,i
4f00: 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68  nt,mode_t).  Oth
4f10: 65 72 73 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e  ers use open(con
4f20: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e  st char*,int,...
4f30: 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  )..** The differ
4f40: 65 6e 63 65 20 69 73 20 69 6d 70 6f 72 74 61 6e  ence is importan
4f50: 74 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 70  t when using a p
4f60: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75  ointer to the fu
4f70: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
4f80: 65 20 73 61 66 65 73 74 20 77 61 79 20 74 6f 20  e safest way to 
4f90: 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 70 72  deal with the pr
4fa0: 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77 61  oblem is to alwa
4fb0: 79 73 20 75 73 65 20 74 68 69 73 20 77 72 61 70  ys use this wrap
4fc0: 70 65 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77  per.** which alw
4fd0: 61 79 73 20 68 61 73 20 74 68 65 20 73 61 6d 65  ays has the same
4fe0: 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e   well-defined in
4ff0: 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  terface..*/.stat
5000: 69 63 20 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e  ic int posixOpen
5010: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
5020: 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69  le, int flags, i
5030: 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75  nt mode){.  retu
5040: 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66  rn open(zFile, f
5050: 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a  lags, mode);.}..
5060: 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65  /*.** Many syste
5070: 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65  m calls are acce
5080: 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69  ssed through poi
5090: 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e  nter-to-function
50a0: 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65  s so that.** the
50b0: 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  y may be overrid
50c0: 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74  den at runtime t
50d0: 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75  o facilitate fau
50e0: 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72  lt injection dur
50f0: 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  ing.** testing a
5100: 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20  nd sandboxing.  
5110: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  The following ar
5120: 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  ray holds the na
5130: 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73  mes and pointers
5140: 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72  .** to all overr
5150: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
5160: 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alls..*/.static 
5170: 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63  struct unix_sysc
5180: 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  all {.  const ch
5190: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
51a0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
51b0: 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c 6c 20   the sytem call 
51c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
51d0: 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e  call_ptr pCurren
51e0: 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61  t; /* Current va
51f0: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  lue of the syste
5200: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
5210: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
5220: 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66  pDefault; /* Def
5230: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20  ault value */.} 
5240: 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20  aSyscall[] = {. 
5250: 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20   { "open",      
5260: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5270: 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70 65  all_ptr)posixOpe
5280: 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e  n,  0  },.#defin
5290: 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28  e osOpen      ((
52a0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
52b0: 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73  r*,int,int))aSys
52c0: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
52d0: 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20  )..  { "close", 
52e0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
52f0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73  syscall_ptr)clos
5300: 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  e,      0  },.#d
5310: 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20  efine osClose   
5320: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29    ((int(*)(int))
5330: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
5340: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65  rent)..  { "acce
5350: 73 73 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ss",       (sqli
5360: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5370: 61 63 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d  access,     0  }
5380: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65  ,.#define osAcce
5390: 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  ss    ((int(*)(c
53a0: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29  onst char*,int))
53b0: 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72  aSyscall[2].pCur
53c0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63  rent)..  { "getc
53d0: 77 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  wd",       (sqli
53e0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
53f0: 67 65 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d  getcwd,     0  }
5400: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63  ,.#define osGetc
5410: 77 64 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29  wd    ((char*(*)
5420: 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61  (char*,size_t))a
5430: 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72  Syscall[3].pCurr
5440: 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22  ent)..  { "stat"
5450: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
5460: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73  e3_syscall_ptr)s
5470: 74 61 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c  tat,       0  },
5480: 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20  .#define osStat 
5490: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
54a0: 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74  nst char*,struct
54b0: 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c   stat*))aSyscall
54c0: 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f  [4].pCurrent)../
54d0: 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63  *.** The DJGPP c
54e0: 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d  ompiler environm
54f0: 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79  ent looks mostly
5500: 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20   like Unix, but 
5510: 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20  it.** lacks the 
5520: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
5530: 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e  all.  So redefin
5540: 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20  e fcntl() to be 
5550: 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61  something.** tha
5560: 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  t always succeed
5570: 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  s.  This means t
5580: 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73  hat locking does
5590: 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72   not occur under
55a0: 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20  .** DJGPP.  But 
55b0: 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74  it is DOS - what
55c0: 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f   did you expect?
55d0: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47  .*/.#ifdef __DJG
55e0: 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22  PP__.  { "fstat"
55f0: 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20  ,        0,     
5600: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 7d              0  }
5610: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61  ,.#define osFsta
5620: 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65  t(a,b,c)    0.#e
5630: 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73  lse     .  { "fs
5640: 74 61 74 22 2c 20 20 20 20 20 20 20 20 28 73 71  tat",        (sq
5650: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5660: 72 29 66 73 74 61 74 2c 20 20 20 20 20 20 30 20  r)fstat,      0 
5670: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73   },.#define osFs
5680: 74 61 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29  tat     ((int(*)
5690: 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74  (int,struct stat
56a0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70  *))aSyscall[5].p
56b0: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
56c0: 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22  .  { "ftruncate"
56d0: 2c 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 74 72 75 6e 63  scall_ptr)ftrunc
56f0: 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66  ate,  0  },.#def
5700: 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20  ine osFtruncate 
5710: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66  ((int(*)(int,off
5720: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e  _t))aSyscall[6].
5730: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5740: 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28  fcntl",        (
5750: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5760: 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20  ptr)fcntl,      
5770: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5780: 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28  Fcntl     ((int(
5790: 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29  *)(int,int,...))
57a0: 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72  aSyscall[7].pCur
57b0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64  rent)..  { "read
57c0: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
57d0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
57e0: 72 65 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d  read,       0  }
57f0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64  ,.#define osRead
5800: 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28        ((ssize_t(
5810: 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a  *)(int,void*,siz
5820: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d  e_t))aSyscall[8]
5830: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5840: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
5850: 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  D) || SQLITE_ENA
5860: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
5870: 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20  E.  { "pread",  
5880: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
5890: 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64  yscall_ptr)pread
58a0: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  ,      0  },.#el
58b0: 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20  se.  { "pread", 
58c0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
58d0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
58e0: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
58f0: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
5900: 72 65 61 64 20 20 20 20 20 28 28 73 73 69 7a 65  read     ((ssize
5910: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
5920: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53  size_t,off_t))aS
5930: 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65  yscall[9].pCurre
5940: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
5950: 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
5960: 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20  { "pread64",    
5970: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5980: 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34 2c 20  ll_ptr)pread64, 
5990: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
59a0: 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20   { "pread64",   
59b0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
59c0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
59d0: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
59e0: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
59f0: 36 34 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a  64   ((ssize_t(*
5a00: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
5a10: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
5a20: 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[10].pCurrent)
5a30: 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20  ..  { "write",  
5a40: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
5a50: 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69 74 65  yscall_ptr)write
5a60: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
5a70: 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20 20 20  fine osWrite    
5a80: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
5a90: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69  t,const void*,si
5aa0: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ze_t))aSyscall[1
5ab0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
5ac0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
5ad0: 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  EAD) || SQLITE_E
5ae0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
5af0: 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74 65 22  YLE.  { "pwrite"
5b00: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
5b10: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
5b20: 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  ite,     0  },.#
5b30: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
5b40: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
5b50: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
5b60: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
5b70: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
5b80: 73 50 77 72 69 74 65 20 20 20 20 28 28 73 73 69  sPwrite    ((ssi
5b90: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
5ba0: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
5bb0: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
5bc0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
5bd0: 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e  call[12].pCurren
5be0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
5bf0: 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b  USE_PREAD64).  {
5c00: 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20   "pwrite64",    
5c10: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5c20: 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34 2c 20  l_ptr)pwrite64, 
5c30: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
5c40: 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20  { "pwrite64",   
5c50: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5c60: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
5c70: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
5c80: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
5c90: 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29  64  ((ssize_t(*)
5ca0: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
5cb0: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c  ,size_t,off_t))\
5cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5cd0: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 33       aSyscall[13
5ce0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5cf0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
5d00: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b  OCKING_STYLE.  {
5d10: 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20   "fchmod",      
5d20: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5d30: 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20 20 20  l_ptr)fchmod,   
5d40: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
5d50: 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20 20  { "fchmod",     
5d60: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5d70: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
5d80: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
5d90: 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64  #define osFchmod
5da0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
5db0: 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c  ,mode_t))aSyscal
5dc0: 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[14].pCurrent).
5dd0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
5de0: 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
5df0: 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58  E) && HAVE_POSIX
5e00: 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22  _FALLOCATE.  { "
5e10: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
5e20: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5e30: 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ptr)posix_falloc
5e40: 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ate,  0 },.#else
5e50: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
5e60: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
5e70: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5e90: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
5ea0: 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e  osFallocate ((in
5eb0: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f  t(*)(int,off_t,o
5ec0: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
5ed0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b  5].pCurrent)..};
5ee0: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f   /* End of the o
5ef0: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
5f00: 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a  em calls */../*.
5f10: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
5f20: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20  SetSystemCall() 
5f30: 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65  method of sqlite
5f40: 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66  3_vfs for all of
5f50: 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56   the.** "unix" V
5f60: 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  FSes.  Return SQ
5f70: 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63  LITE_OK opon suc
5f80: 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69  cessfully updati
5f90: 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d  ng the.** system
5fa0: 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f   call pointer, o
5fb0: 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  r SQLITE_NOTFOUN
5fc0: 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  D if there is no
5fd0: 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a   configurable.**
5fe0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
5ff0: 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ed zName..*/.sta
6000: 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53  tic int unixSetS
6010: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
6020: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
6030: 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed,        /* Th
6040: 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20  e VFS pointer.  
6050: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
6060: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
6070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6080: 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61  ame of system ca
6090: 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a  ll to override *
60a0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
60b0: 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63  all_ptr pNewFunc
60c0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
60d0: 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  new system call 
60e0: 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e  value */.){.  un
60f0: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
6100: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6110: 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55  NOTFOUND;..  UNU
6120: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
6130: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a  otUsed);.  if( z
6140: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
6150: 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73  * If no zName is
6160: 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20   given, restore 
6170: 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  all system calls
6180: 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c   to their defaul
6190: 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  t.    ** setting
61a0: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
61b0: 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  L.    */.    rc 
61c0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
61d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
61e0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
61f0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
6200: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
6210: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
6220: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
6230: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
6240: 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c  urrent = aSyscal
6250: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
6260: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6270: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
6280: 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  zName is specifi
6290: 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f  ed, operate on o
62a0: 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74  nly the one syst
62b0: 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  em call.    ** s
62c0: 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
62d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
62e0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
62f0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
6300: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
6310: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
6320: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
6330: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
6340: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
6350: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30  l[i].pDefault==0
6360: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53   ){.          aS
6370: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
6380: 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  lt = aSyscall[i]
6390: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20  .pCurrent;.     
63a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
63b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
63c0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e       if( pNewFun
63d0: 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20  c==0 ) pNewFunc 
63e0: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
63f0: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20  efault;.        
6400: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
6410: 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b  rent = pNewFunc;
6420: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6430: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6440: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6450: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
6460: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79  he value of a sy
6470: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
6480: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
6490: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63   is not a.** rec
64a0: 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63  ognized system c
64b0: 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20  all name.  NULL 
64c0: 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
64d0: 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   if the system c
64e0: 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  all.** is curren
64f0: 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  tly undefined..*
6500: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
6510: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69  _syscall_ptr uni
6520: 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  xGetSystemCall(.
6530: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
6540: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
6550: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
6560: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
6570: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
6580: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
6590: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
65a0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
65b0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
65c0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
65d0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
65e0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
65f0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
6600: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
6610: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
6620: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
6630: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
6640: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
6650: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
6660: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
6670: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
6680: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
6690: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
66a0: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
66b0: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
66c0: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
66d0: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
66e0: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
66f0: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
6700: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
6710: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
6720: 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74  ar *unixNextSyst
6730: 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76  emCall(sqlite3_v
6740: 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  fs *p, const cha
6750: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
6760: 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53   i = -1;..  UNUS
6770: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
6780: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
6790: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
67a0: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
67b0: 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l)-1; i++){.    
67c0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
67d0: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
67e0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
67f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
6800: 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53  or(i++; i<ArrayS
6810: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69  ize(aSyscall); i
6820: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79  ++){.    if( aSy
6830: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
6840: 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  t!=0 ) return aS
6850: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b  yscall[i].zName;
6860: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
6870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  .}../*.** Retry 
6880: 6f 70 65 6e 28 29 20 63 61 6c 6c 73 20 74 68 61  open() calls tha
6890: 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49  t fail due to EI
68a0: 4e 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NTR.*/.static in
68b0: 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f  t robust_open(co
68c0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
68d0: 20 66 2c 20 69 6e 74 20 6d 29 7b 0a 20 20 69 6e   f, int m){.  in
68e0: 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d  t rc;.  do{ rc =
68f0: 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d 29 3b 20   osOpen(z,f,m); 
6900: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
6910: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
6920: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6930: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
6940: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
6950: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
6960: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
6970: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
6980: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
6990: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
69a0: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
69b0: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
69c0: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
69d0: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
69e0: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
69f0: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
6a00: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
6a10: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
6a20: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
6a30: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
6a40: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
6a50: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
6a60: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
6a70: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
6a80: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
6a90: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
6aa0: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
6ab0: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
6ac0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
6ad0: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
6ae0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
6af0: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
6b00: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
6b10: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
6b20: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
6b30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
6b40: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
6b50: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6b60: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
6b70: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
6b80: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
6b90: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
6ba0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
6bb0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
6bc0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
6bd0: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
6be0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
6bf0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
6c00: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
6c10: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
6c20: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
6c30: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
6c40: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6c50: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
6c60: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65  }.#endif...#ifde
6c70: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
6c80: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
6c90: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
6ca0: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
6cb0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
6cc0: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
6cd0: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
6ce0: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
6cf0: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
6d00: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
6d10: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
6d20: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
6d30: 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b  char *azFileLock
6d40: 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b  (int eFileLock){
6d50: 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65  .  switch( eFile
6d60: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65  Lock ){.    case
6d70: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
6d80: 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73   "NONE";.    cas
6d90: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
6da0: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
6db0: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
6dc0: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
6dd0: 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63  RESERVED";.    c
6de0: 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ase PENDING_LOCK
6df0: 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e  : return "PENDIN
6e00: 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43  G";.    case EXC
6e10: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
6e20: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
6e30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
6e40: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
6e50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c  .#ifdef SQLITE_L
6e60: 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  OCK_TRACE./*.** 
6e70: 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d  Print out inform
6e80: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
6e90: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
6ea0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
6eb0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
6ec0: 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69  or troubleshooti
6ed0: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74  ng locks on mult
6ee0: 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61  ithreaded.** pla
6ef0: 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20  tforms.  Enable 
6f00: 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  by compiling wit
6f10: 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c  h the -DSQLITE_L
6f20: 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d  OCK_TRACE.** com
6f30: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
6f40: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
6f50: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  .  This code is 
6f60: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e  normally.** turn
6f70: 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  ed off..*/.stati
6f80: 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28  c int lockTrace(
6f90: 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20  int fd, int op, 
6fa0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29  struct flock *p)
6fb0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  {.  char *zOpNam
6fc0: 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74  e, *zType;.  int
6fd0: 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45   s;.  int savedE
6fe0: 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  rrno;.  if( op==
6ff0: 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_GETLK ){.    z
7000: 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22  OpName = "GETLK"
7010: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
7020: 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_SETLK ){.   
7030: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c   zOpName = "SETL
7040: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
7050: 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c   s = osFcntl(fd,
7060: 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c   op, p);.    sql
7070: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
7080: 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25  "fcntl unknown %
7090: 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20  d %d %d\n", fd, 
70a0: 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75  op, s);.    retu
70b0: 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn s;.  }.  if( 
70c0: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  p->l_type==F_RDL
70d0: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
70e0: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "RDLCK";.  }el
70f0: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
7100: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
7110: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
7120: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
7130: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  >l_type==F_UNLCK
7140: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
7150: 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "UNLCK";.  }else
7160: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20  {.    assert( 0 
7170: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
7180: 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45   p->l_whence==SE
7190: 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20  EK_SET );.  s = 
71a0: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  osFcntl(fd, op, 
71b0: 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f  p);.  savedErrno
71c0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69   = errno;.  sqli
71d0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
71e0: 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25  fcntl %d %d %s %
71f0: 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22  s %d %d %d %d\n"
7200: 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c  ,.     threadid,
7210: 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54   fd, zOpName, zT
7220: 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73  ype, (int)p->l_s
7230: 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  tart, (int)p->l_
7240: 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70  len,.     (int)p
7250: 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69  ->l_pid, s);.  i
7260: 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70  f( s==(-1) && op
7270: 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d  ==F_SETLK && (p-
7280: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
7290: 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46   || p->l_type==F
72a0: 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73  _WRLCK) ){.    s
72b0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a  truct flock l2;.
72c0: 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20      l2 = *p;.   
72d0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
72e0: 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20  ETLK, &l2);.    
72f0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
7300: 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
7310: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
7320: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
7330: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  2.l_type==F_WRLC
7340: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
7350: 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20   = "WRLCK";.    
7360: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
7370: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
7380: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55        zType = "U
7390: 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  NLCK";.    }else
73a0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
73b0: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
73c0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
73d0: 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65  f("fcntl-failure
73e0: 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25  -reason: %s %d %
73f0: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %d\n",.       
7400: 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c  zType, (int)l2.l
7410: 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e  _start, (int)l2.
7420: 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c  l_len, (int)l2.l
7430: 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72  _pid);.  }.  err
7440: 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b  no = savedErrno;
7450: 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23  .  return s;.}.#
7460: 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64  undef osFcntl.#d
7470: 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f  efine osFcntl lo
7480: 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f  ckTrace.#endif /
7490: 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  * SQLITE_LOCK_TR
74a0: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ACE */../*.** Re
74b0: 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29 20  try ftruncate() 
74c0: 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20  calls that fail 
74d0: 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a  due to EINTR.*/.
74e0: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
74f0: 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20  t_ftruncate(int 
7500: 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  h, sqlite3_int64
7510: 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   sz){.  int rc;.
7520: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72    do{ rc = osFtr
7530: 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77  uncate(h,sz); }w
7540: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
7550: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
7560: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7570: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7580: 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74   translates a st
7590: 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72  andard POSIX err
75a0: 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d  no code into som
75b0: 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c  ething.** useful
75c0: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20   to the clients 
75d0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66  of the sqlite3 f
75e0: 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69  unctions.  Speci
75f0: 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a  fically, it is.*
7600: 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72  * intended to tr
7610: 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74  anslate a variet
7620: 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22  y of "try again"
7630: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c   errors into SQL
7640: 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20  ITE_BUSY.** and 
7650: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c  a variety of "pl
7660: 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66  ease close the f
7670: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e  ile descriptor N
7680: 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  OW" errors into 
7690: 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
76a0: 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64  .** .** Errors d
76b0: 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  uring initializa
76c0: 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f  tion of locks, o
76d0: 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  r file system su
76e0: 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c  pport for locks,
76f0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c  .** should handl
7700: 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55  e ENOLCK, ENOTSU
7710: 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65  P, EOPNOTSUPP se
7720: 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  parately..*/.sta
7730: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72  tic int sqliteEr
7740: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
7750: 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72  r(int posixError
7760: 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72  , int sqliteIOEr
7770: 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70  r) {.  switch (p
7780: 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69 66  osixError) {.#if
7790: 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70   0.  /* At one p
77a0: 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20 77  oint this code w
77b0: 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64  as not commented
77c0: 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c   out. In theory,
77d0: 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
77e0: 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  * should never b
77f0: 65 20 68 69 74 2c 20 61 73 20 74 68 69 73 20 66  e hit, as this f
7800: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
7810: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
7820: 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69  ter.  ** a locki
7830: 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ng-related funct
7840: 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28  ion (i.e. fcntl(
7850: 29 29 20 68 61 73 20 72 65 74 75 72 6e 65 64 20  )) has returned 
7860: 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20  non-zero with.  
7870: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
7880: 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69 72  errno as the fir
7890: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e  st argument. Sin
78a0: 63 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  ce a system call
78b0: 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a   has failed,.  *
78c0: 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62  * errno should b
78d0: 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a  e non-zero..  **
78e0: 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74 68  .  ** Despite th
78f0: 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65 61  is, if errno rea
7900: 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65 20  lly is zero, we 
7910: 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74  still don't want
7920: 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20   to return.  ** 
7930: 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73  SQLITE_OK. The s
7940: 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65  ystem call faile
7950: 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51  d, and *some* SQ
7960: 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75 6c  Lite error shoul
7970: 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67  d be.  ** propag
7980: 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  ated back to the
7990: 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74   caller. Comment
79a0: 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68 20  ing this branch 
79b0: 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d  out means errno=
79c0: 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  =0.  ** will be 
79d0: 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 22  handled by the "
79e0: 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20 62  default:" case b
79f0: 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  elow..  */.  cas
7a00: 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  e 0: .    return
7a10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
7a20: 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41 49  if..  case EAGAI
7a30: 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44  N:.  case ETIMED
7a40: 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53  OUT:.  case EBUS
7a50: 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a  Y:.  case EINTR:
7a60: 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20  .  case ENOLCK: 
7a70: 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20   .    /* random 
7a80: 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c  NFS retry error,
7a90: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
7aa0: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
7ab0: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
7ac0: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
7ad0: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
7ae0: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
7af0: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
7b00: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
7b10: 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a   .  case EACCES:
7b20: 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20   .    /* EACCES 
7b30: 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64  is like EAGAIN d
7b40: 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70  uring locking op
7b50: 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f  erations, but no
7b60: 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65  t any other time
7b70: 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69  */.    if( (sqli
7b80: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
7b90: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c  E_IOERR_LOCK) ||
7ba0: 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20   ..(sqliteIOErr 
7bb0: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
7bc0: 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71  UNLOCK) || ..(sq
7bd0: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
7be0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
7bf0: 29 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45  ) ||..(sqliteIOE
7c00: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
7c10: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
7c20: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  LOCK) ){.      r
7c30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
7c40: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  Y;.    }.    /* 
7c50: 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  else fall throug
7c60: 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52  h */.  case EPER
7c70: 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53  M: .    return S
7c80: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
7c90: 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69 73  .  /* EDEADLK is
7ca0: 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
7cb0: 66 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e 74  f a call to fcnt
7cc0: 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20 6d  l(F_SETLKW) is m
7cd0: 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74 68  ade. And.  ** th
7ce0: 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20  is module never 
7cf0: 6d 61 6b 65 73 20 73 75 63 68 20 61 20 63 61 6c  makes such a cal
7d00: 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65 20  l. And the code 
7d10: 69 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c 66  in SQLite itself
7d20: 20 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20 74   .  ** asserts t
7d30: 68 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  hat SQLITE_IOERR
7d40: 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76 65  _BLOCKED is neve
7d50: 72 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72 20  r returned. For 
7d60: 74 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20 20  these reasons.  
7d70: 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69 73 20  ** this case is 
7d80: 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f  also commented o
7d90: 75 74 2e 20 49 66 20 74 68 65 20 73 79 73 74 65  ut. If the syste
7da0: 6d 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e 6f  m does set errno
7db0: 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20 2a   to EDEADLK,.  *
7dc0: 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 53 51  * the default SQ
7dd0: 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 63  LITE_IOERR_XXX c
7de0: 6f 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ode will be retu
7df0: 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  rned. */.#if 0. 
7e00: 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20   case EDEADLK:. 
7e10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7e20: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a  _IOERR_BLOCKED;.
7e30: 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66 20  #endif.    .#if 
7e40: 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54  EOPNOTSUPP!=ENOT
7e50: 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f  SUP.  case EOPNO
7e60: 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73  TSUPP: .    /* s
7e70: 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65  omething went te
7e80: 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c  rribly awry, unl
7e90: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
7ea0: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
7eb0: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
7ec0: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
7ed0: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
7ee0: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
7ef0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45  .#endif.#ifdef E
7f00: 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e  NOTSUP.  case EN
7f10: 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69  OTSUP: .    /* i
7f20: 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73  nvalid fd, unles
7f30: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
7f40: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74  stem support int
7f50: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
7f60: 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20  hich .     * it 
7f70: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
7f80: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23  hat it says */.#
7f90: 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f  endif.  case EIO
7fa0: 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a  :.  case EBADF:.
7fb0: 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20    case EINVAL:. 
7fc0: 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a   case ENOTCONN:.
7fd0: 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20    case ENODEV:. 
7fe0: 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63   case ENXIO:.  c
7ff0: 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20 63 61  ase ENOENT:.  ca
8000: 73 65 20 45 53 54 41 4c 45 3a 0a 20 20 63 61 73  se ESTALE:.  cas
8010: 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a  e ENOSYS:.    /*
8020: 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f   these should fo
8030: 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74  rce the client t
8040: 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  o close the file
8050: 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a   and reconnect *
8060: 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74  /.    .  default
8070: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  : .    return sq
8080: 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d  liteIOErr;.  }.}
8090: 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..../***********
80a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80e0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
80f0: 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69  ****** Begin Uni
8100: 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c  que File ID Util
8110: 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f  ity Used By VxWo
8120: 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rks ************
8130: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73  ***.**.** On mos
8140: 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e  t versions of un
8150: 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61  ix, we can get a
8160: 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61   unique ID for a
8170: 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65   file by concate
8180: 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65  nating.** the de
8190: 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  vice number and 
81a0: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
81b0: 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73  .  But this does
81c0: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57   not work on VxW
81d0: 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f  orks..** On VxWo
81e0: 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69  rks, a unique fi
81f0: 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61  le id must be ba
8200: 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e  sed on the canon
8210: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a  ical filename..*
8220: 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  *.** A pointer t
8230: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
8240: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
8250: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
8260: 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69  used as a.** uni
8270: 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56  que file ID in V
8280: 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e  xWorks.  Each in
8290: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
82a0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
82b0: 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74  s.** a copy of t
82c0: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  he canonical fil
82d0: 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73  ename.  There is
82e0: 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63   also a referenc
82f0: 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68  e count.  .** Th
8300: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72  e structure is r
8310: 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68  eclaimed when th
8320: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  e number of poin
8330: 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73  ters to it drops
8340: 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a   to.** zero..**.
8350: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76  ** There are nev
8360: 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c  er very many fil
8370: 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74  es open at one t
8380: 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20  ime and lookups 
8390: 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72  are not.** a per
83a0: 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61  formance-critica
83b0: 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73  l path, so it is
83c0: 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70   sufficient to p
83d0: 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75  ut these.** stru
83e0: 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b  ctures on a link
83f0: 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75  ed list..*/.stru
8400: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
8410: 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f   {.  struct vxwo
8420: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74  rksFileId *pNext
8430: 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20  ;  /* Next in a 
8440: 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c  list of them all
8450: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8480: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
8490: 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74  his one */.  int
84a0: 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
84b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
84c0: 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e  ngth of the zCan
84d0: 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72  onicalName[] str
84e0: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ing */.  char *z
84f0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20  CanonicalName;  
8500: 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69         /* Canoni
8510: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  cal filename */.
8520: 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  };..#if OS_VXWOR
8530: 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e  KS./* .** All un
8540: 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  ique filenames a
8550: 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e  re held on a lin
8560: 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20  ked list headed 
8570: 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  by this.** varia
8580: 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ble:.*/.static s
8590: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
85a0: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65  eId *vxworksFile
85b0: 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
85c0: 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65   Simplify a file
85d0: 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61  name into its ca
85e0: 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20  nonical form.** 
85f0: 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f  by making the fo
8600: 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a  llowing changes:
8610: 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69  .**.**  * removi
8620: 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20  ng any trailing 
8630: 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a  and duplicate /.
8640: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e  **  * convert /.
8650: 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a  / into just /.**
8660: 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e    * convert /A/.
8670: 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e  ./ where A is an
8680: 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e  y simple name in
8690: 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20  to just /.**.** 
86a0: 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  Changes are made
86b0: 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75   in-place.  Retu
86c0: 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20  rn the new name 
86d0: 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  length..**.** Th
86e0: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e  e original filen
86f0: 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e  ame is in z[0..n
8700: 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  -1].  Return the
8710: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68   number of.** ch
8720: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
8730: 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e  simplified name.
8740: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
8750: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
8760: 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  me(char *z, int 
8770: 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  n){.  int i, j;.
8780: 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
8790: 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e  z[n-1]=='/' ){ n
87a0: 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d  --; }.  for(i=j=
87b0: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
87c0: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20    if( z[i]=='/' 
87d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  ){.      if( z[i
87e0: 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69  +1]=='/' ) conti
87f0: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  nue;.      if( z
8800: 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b  [i+1]=='.' && i+
8810: 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27  2<n && z[i+2]=='
8820: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20  /' ){.        i 
8830: 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f  += 1;.        co
8840: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
8850: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
8860: 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26  =='.' && i+3<n &
8870: 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26  & z[i+2]=='.' &&
8880: 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a   z[i+3]=='/' ){.
8890: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
88a0: 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f  >0 && z[j-1]!='/
88b0: 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ j--; }.    
88c0: 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a      if( j>0 ){ j
88d0: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20  --; }.        i 
88e0: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f  += 2;.        co
88f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
8900: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d      }.    z[j++]
8910: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a   = z[i];.  }.  z
8920: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [j] = 0;.  retur
8930: 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  n j;.}../*.** Fi
8940: 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65  nd a unique file
8950: 20 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65   ID for the give
8960: 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e  n absolute pathn
8970: 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ame.  Return.** 
8980: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8990: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
89a0: 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69  bject.  This poi
89b0: 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71  nter is the uniq
89c0: 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a  ue.** file ID..*
89d0: 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69  *.** The nRef fi
89e0: 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72  eld of the vxwor
89f0: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20  ksFileId object 
8a00: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  is incremented b
8a10: 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a  efore.** the obj
8a20: 65 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ect is returned.
8a30: 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46    A new vxworksF
8a40: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
8a50: 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61  created.** and a
8a60: 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62  dded to the glob
8a70: 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73  al list if neces
8a80: 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sary..**.** If a
8a90: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
8aa0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
8ab0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
8ac0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
8ad0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
8ae0: 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
8af0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73  const char *zAbs
8b00: 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74  oluteName){.  st
8b10: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
8b20: 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  Id *pNew;       
8b30: 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20    /* search key 
8b40: 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20  and new file ID 
8b50: 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  */.  struct vxwo
8b60: 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64  rksFileId *pCand
8b70: 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20  idate;   /* For 
8b80: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69  looping over exi
8b90: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a  sting file IDs *
8ba0: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
8bd0: 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61  h of zAbsoluteNa
8be0: 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20  me string */..  
8bf0: 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74  assert( zAbsolut
8c00: 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b  eName[0]=='/' );
8c10: 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  .  n = (int)strl
8c20: 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  en(zAbsoluteName
8c30: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
8c40: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
8c50: 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31  of(*pNew) + (n+1
8c60: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
8c70: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8c80: 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61   pNew->zCanonica
8c90: 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  lName = (char*)&
8ca0: 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70  pNew[1];.  memcp
8cb0: 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  y(pNew->zCanonic
8cc0: 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74  alName, zAbsolut
8cd0: 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e  eName, n+1);.  n
8ce0: 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69   = vxworksSimpli
8cf0: 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61  fyName(pNew->zCa
8d00: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b  nonicalName, n);
8d10: 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  ..  /* Search fo
8d20: 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  r an existing en
8d30: 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e  try that matchin
8d40: 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  g the canonical 
8d50: 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f  name..  ** If fo
8d60: 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74  und, increment t
8d70: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
8d80: 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  nt and return a 
8d90: 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20  pointer to.  ** 
8da0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c  the existing fil
8db0: 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69  e ID..  */.  uni
8dc0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
8dd0: 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d   for(pCandidate=
8de0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
8df0: 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61   pCandidate; pCa
8e00: 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61  ndidate=pCandida
8e10: 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  te->pNext){.    
8e20: 69 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e  if( pCandidate->
8e30: 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26  nName==n .     &
8e40: 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64  & memcmp(pCandid
8e50: 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  ate->zCanonicalN
8e60: 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  ame, pNew->zCano
8e70: 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30  nicalName, n)==0
8e80: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73  .    ){.       s
8e90: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
8ea0: 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69  );.       pCandi
8eb0: 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  date->nRef++;.  
8ec0: 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
8ed0: 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65  tex();.       re
8ee0: 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b  turn pCandidate;
8ef0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
8f00: 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f   No match was fo
8f10: 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61  und.  We will ma
8f20: 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44  ke a new file ID
8f30: 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66   */.  pNew->nRef
8f40: 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e   = 1;.  pNew->nN
8f50: 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d  ame = n;.  pNew-
8f60: 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73  >pNext = vxworks
8f70: 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f  FileList;.  vxwo
8f80: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e  rksFileList = pN
8f90: 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ew;.  unixLeaveM
8fa0: 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
8fb0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
8fc0: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
8fd0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
8fe0: 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64   a vxworksFileId
8ff0: 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a   object.  Free.*
9000: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65  * the object whe
9010: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
9020: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
9030: 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ro..*/.static vo
9040: 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  id vxworksReleas
9050: 65 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76  eFileId(struct v
9060: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
9070: 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d){.  unixEnterM
9080: 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
9090: 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pId->nRef>0 );
90a0: 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pId->nRef--;.
90b0: 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d    if( pId->nRef=
90c0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
90d0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
90e0: 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d  *pp;.    for(pp=
90f0: 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  &vxworksFileList
9100: 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49  ; *pp && *pp!=pI
9110: 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d  d; pp = &((*pp)-
9120: 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61  >pNext)){}.    a
9130: 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20  ssert( *pp==pId 
9140: 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64  );.    *pp = pId
9150: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
9160: 69 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a  ite3_free(pId);.
9170: 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
9180: 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66  utex();.}.#endif
9190: 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
91a0: 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
91b0: 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65  ** End of Unique
91c0: 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79   File ID Utility
91d0: 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73   Used By VxWorks
91e0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
91f0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
9200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9240: 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.../***********
9250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9290: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
92a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
92b0: 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c  Posix Advisory L
92c0: 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
92d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
92e0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20  ***.**.** POSIX 
92f0: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61  advisory locks a
9300: 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73  re broken by des
9310: 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31  ign.  ANSI STD 1
9320: 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20  003.1 (1996).** 
9330: 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20  section 6.5.2.2 
9340: 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67  lines 483 throug
9350: 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68  h 490 specify th
9360: 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73  at when a proces
9370: 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65  s.** sets or cle
9380: 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74  ars a lock, that
9390: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72   operation overr
93a0: 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c  ides any prior l
93b0: 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74  ocks set.** by t
93c0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
93d0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78    It does not ex
93e0: 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c  plicitly say so,
93f0: 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65   but this implie
9400: 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65  s.** that it ove
9410: 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74  rrides locks set
9420: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
9430: 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66  cess using a dif
9440: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
9450: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73  escriptor.  Cons
9460: 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63  ider this test c
9470: 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ase:.**.**      
9480: 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28   int fd1 = open(
9490: 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57  "./file1", O_RDW
94a0: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
94b0: 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66  ;.**       int f
94c0: 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c  d2 = open("./fil
94d0: 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  e2", O_RDWR|O_CR
94e0: 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a  EAT, 0644);.**.*
94f0: 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65  * Suppose ./file
9500: 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72  1 and ./file2 ar
9510: 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d  e really the sam
9520: 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a  e file (because.
9530: 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64  ** one is a hard
9540: 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e   or symbolic lin
9550: 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20  k to the other) 
9560: 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a  then if you set.
9570: 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ** an exclusive 
9580: 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65  lock on fd1, the
9590: 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20  n try to get an 
95a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
95b0: 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72  * on fd2, it wor
95c0: 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76  ks.  I would hav
95d0: 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73  e expected the s
95e0: 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a  econd lock to.**
95f0: 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72   fail since ther
9600: 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20  e was already a 
9610: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
9620: 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20   due to fd1..** 
9630: 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e  But not so.  Sin
9640: 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61  ce both locks ca
9650: 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  me from the same
9660: 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a   process, the.**
9670: 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65   second override
9680: 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65  s the first, eve
9690: 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65  n though they we
96a0: 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a  re on different.
96b0: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
96c0: 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69  ors opened on di
96d0: 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d  fferent file nam
96e0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  es..**.** This m
96f0: 65 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e  eans that we can
9700: 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f  not use POSIX lo
9710: 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69  cks to synchroni
9720: 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a  ze file access.*
9730: 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e  * among competin
9740: 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65  g threads of the
9750: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20   same process.  
9760: 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c  POSIX locks will
9770: 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f   work fine.** to
9780: 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63   synchronize acc
9790: 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20  ess for threads 
97a0: 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  in separate proc
97b0: 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a  esses, but not.*
97c0: 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e  * threads within
97d0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
97e0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  s..**.** To work
97f0: 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62   around the prob
9800: 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20  lem, SQLite has 
9810: 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c  to manage file l
9820: 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  ocks internally.
9830: 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20  ** on its own.  
9840: 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64  Whenever a new d
9850: 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
9860: 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69  d, we have to fi
9870: 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66  nd the.** specif
9880: 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20  ic inode of the 
9890: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74  database file (t
98a0: 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65  he inode is dete
98b0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  rmined by the.**
98c0: 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69   st_dev and st_i
98d0: 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  no fields of the
98e0: 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20   stat structure 
98f0: 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c  that fstat() fil
9900: 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68  ls in).** and ch
9910: 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c  eck for locks al
9920: 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f  ready existing o
9930: 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57  n that inode.  W
9940: 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a  hen locks are.**
9950: 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f   created or remo
9960: 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ved, we have to 
9970: 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20  look at our own 
9980: 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20  internal record 
9990: 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20  of the.** locks 
99a0: 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
99b0: 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65  r thread has pre
99c0: 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f  viously set a lo
99d0: 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a  ck on that same.
99e0: 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ** inode..**.** 
99f0: 28 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20  (Aside: The use 
9a00: 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73  of inode numbers
9a10: 20 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64   as unique IDs d
9a20: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
9a30: 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20  VxWorks..** For 
9a40: 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65  VxWorks, we have
9a50: 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65   to use the alte
9a60: 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49  rnative unique I
9a70: 44 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f  D system based o
9a80: 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66  n.** canonical f
9a90: 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c  ilename and impl
9aa0: 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70  emented in the p
9ab0: 72 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e  revious division
9ac0: 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  .).**.** The sql
9ad0: 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
9ae0: 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73  ure for POSIX is
9af0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20   no longer just 
9b00: 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a  an integer file.
9b10: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  ** descriptor.  
9b20: 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75  It is now a stru
9b30: 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73  cture that holds
9b40: 20 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c   the integer fil
9b50: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20  e.** descriptor 
9b60: 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
9b70: 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61   a structure tha
9b80: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
9b90: 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b  internal.** lock
9ba0: 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70  s on the corresp
9bb0: 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54  onding inode.  T
9bc0: 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b  here is one lock
9bd0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  ing structure.**
9be0: 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69   per inode, so i
9bf0: 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65  f the same inode
9c00: 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65   is opened twice
9c10: 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20  , both unixFile 
9c20: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f  structures.** po
9c30: 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20  int to the same 
9c40: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
9c50: 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  e.  The locking 
9c60: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a  structure keeps.
9c70: 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  ** a reference c
9c80: 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c  ount (so we will
9c90: 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65   know when to de
9ca0: 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22  lete it) and a "
9cb0: 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68  cnt".** field th
9cc0: 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20  at tells us its 
9cd0: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
9ce0: 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65  atus.  cnt==0 me
9cf0: 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ans the.** file 
9d00: 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e  is unlocked.  cn
9d10: 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20  t==-1 means the 
9d20: 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c  file has an excl
9d30: 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63  usive lock..** c
9d40: 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65  nt>0 means there
9d50: 20 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20   are cnt shared 
9d60: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c  locks on the fil
9d70: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74  e..**.** Any att
9d80: 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20  empt to lock or 
9d90: 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69  unlock a file fi
9da0: 72 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c  rst checks the l
9db0: 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  ocking.** struct
9dc0: 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28  ure.  The fcntl(
9dd0: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73  ) system call is
9de0: 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f   only invoked to
9df0: 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58   set a .** POSIX
9e00: 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74   lock if the int
9e10: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63  ernal lock struc
9e20: 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  ture transitions
9e30: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f   between.** a lo
9e40: 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f  cked and an unlo
9e50: 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  cked state..**.*
9e60: 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65  * But wait:  the
9e70: 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20  re are yet more 
9e80: 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f  problems with PO
9e90: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
9ea0: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75  ks..**.** If you
9eb0: 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65   close a file de
9ec0: 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f  scriptor that po
9ed0: 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74  ints to a file t
9ee0: 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a  hat has locks,.*
9ef0: 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74  * all locks on t
9f00: 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72  hat file that ar
9f10: 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63  e owned by the c
9f20: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61  urrent process a
9f30: 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20  re.** released. 
9f40: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
9f50: 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61  this problem, ea
9f60: 63 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ch unixInodeInfo
9f70: 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74   object.** maint
9f80: 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  ains a count of 
9f90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65  the number of pe
9fa0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74  nding locks on t
9fb0: 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65  ha inode..** Whe
9fc0: 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
9fd0: 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e  made to close an
9fe0: 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68   unixFile, if th
9ff0: 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72  ere are.** other
a000: 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f   unixFile open o
a010: 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65  n the same inode
a020: 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e   that are holdin
a030: 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c  g locks, the cal
a040: 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20  l.** to close() 
a050: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
a060: 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20  tor is deferred 
a070: 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65  until all of the
a080: 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a   locks clear..**
a090: 20 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   The unixInodeIn
a0a0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  fo structure kee
a0b0: 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c  ps a list of fil
a0c0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68  e descriptors th
a0d0: 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65  at need to.** be
a0e0: 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74   closed and that
a0f0: 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20   list is walked 
a100: 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68  (and cleared) wh
a110: 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
a120: 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a  .** clears..**.*
a130: 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72  * Yet another pr
a140: 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72  oblem:  LinuxThr
a150: 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79  eads do not play
a160: 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78   well with posix
a170: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61   locks..**.** Ma
a180: 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  ny older version
a190: 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74  s of linux use t
a1a0: 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  he LinuxThreads 
a1b0: 6c 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73  library which is
a1c0: 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f  .** not posix co
a1d0: 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20  mpliant.  Under 
a1e0: 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20  LinuxThreads, a 
a1f0: 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20  lock created by 
a200: 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e  thread.** A cann
a210: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f  ot be modified o
a220: 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  r overridden by 
a230: 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65  a different thre
a240: 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68  ad B..** Only th
a250: 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66  read A can modif
a260: 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63  y the lock.  Loc
a270: 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73  king behavior is
a280: 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74   correct.** if t
a290: 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73  he appliation us
a2a0: 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74  es the newer Nat
a2b0: 69 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64  ive Posix Thread
a2c0: 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a   Library (NPTL).
a2d0: 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69  ** on linux - wi
a2e0: 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63  th NPTL a lock c
a2f0: 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64  reated by thread
a300: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
a310: 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65  locks.** in thre
a320: 61 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65  ad B.  But there
a330: 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e   is no way to kn
a340: 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ow at compile-ti
a350: 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65  me which.** thre
a360: 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73  ading library is
a370: 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f   being used.  So
a380: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
a390: 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63   to know at.** c
a3a0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74  ompile-time whet
a3b0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
a3c0: 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65  d A can override
a3d0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64   locks on thread
a3e0: 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74   B..** One has t
a3f0: 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20  o do a run-time 
a400: 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65  check to discove
a410: 72 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  r the behavior o
a420: 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  f the.** current
a430: 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
a440: 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73  SQLite used to s
a450: 75 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65  upport LinuxThre
a460: 61 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72  ads.  But suppor
a470: 74 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61  t for LinuxThrea
a480: 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65  ds.** was droppe
a490: 64 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  d beginning with
a4a0: 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20   version 3.7.0. 
a4b0: 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69   SQLite will sti
a4c0: 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20  ll work with.** 
a4d0: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f  LinuxThreads pro
a4e0: 76 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74  vided that (1) t
a4f0: 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20  here is no more 
a500: 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74  than one connect
a510: 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61  ion .** per data
a520: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
a530: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e   same process an
a540: 64 20 28 32 29 20 64 61 74 61 62 61 73 65 20 63  d (2) database c
a550: 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f  onnections.** do
a560: 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73   not move across
a570: 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a   threads..*/../*
a580: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
a590: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
a5a0: 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65   structure serve
a5b0: 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65  s as the key use
a5c0: 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61  d.** to locate a
a5d0: 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78   particular unix
a5e0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
a5f0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
a600: 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74  FileId {.  dev_t
a610: 20 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   dev;           
a620: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
a630: 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f   number */.#if O
a640: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
a650: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
a660: 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75   *pId;  /* Uniqu
a670: 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78  e file ID for vx
a680: 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a  works. */.#else.
a690: 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20    ino_t ino;    
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a6b0: 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f   Inode number */
a6c0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
a6d0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
a6e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
a6f0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
a700: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f  cated for each o
a710: 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f  pen.** inode.  O
a720: 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61  r, on LinuxThrea
a730: 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65  ds, there is one
a740: 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74   of these struct
a750: 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68  ures for.** each
a760: 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79   inode opened by
a770: 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a   each thread..**
a780: 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f  .** A single ino
a790: 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  de can have mult
a7a0: 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  iple file descri
a7b0: 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75  ptors, so each u
a7c0: 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
a7d0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ture contains a 
a7e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
a7f0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
a800: 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a  bject and this.*
a810: 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61  * object keeps a
a820: 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   count of the nu
a830: 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65  mber of unixFile
a840: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e   pointing to it.
a850: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49  .*/.struct unixI
a860: 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72  nodeInfo {.  str
a870: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
a880: 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20  ileId;       /* 
a890: 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a  The lookup key *
a8a0: 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b  /.  int nShared;
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a8d0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65   SHARED locks he
a8e0: 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ld */.  unsigned
a8f0: 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b   char eFileLock;
a900: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
a910: 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  f SHARED_LOCK, R
a920: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63  ESERVED_LOCK etc
a930: 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  . */.  unsigned 
a940: 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63  char bProcessLoc
a950: 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63  k;     /* An exc
a960: 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c  lusive process l
a970: 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20  ock is held */. 
a980: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f   /* Number of po
a9b0: 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73  inters to this s
a9c0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e  tructure */.  un
a9d0: 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
a9e0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
a9f0: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   Shared memory a
aa00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
aa10: 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69  his inode */.  i
aa20: 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20  nt nLock;       
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  * Number of outs
aa50: 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63  tanding file loc
aa60: 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  ks */.  UnixUnus
aa70: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
aa80: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
aa90: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
aaa0: 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  rs to close */. 
aab0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
aac0: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
aad0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
aae0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
aaf0: 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49  jects */.  unixI
ab00: 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b  nodeInfo *pPrev;
ab10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
ab20: 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e   .... doubly lin
ab30: 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ked */.#if SQLIT
ab40: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
ab50: 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65  _STYLE.  unsigne
ab60: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
ab70: 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20  edByte;  /* for 
ab80: 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68  AFP simulated sh
ab90: 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e  ared lock */.#en
aba0: 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  dif.#if OS_VXWOR
abb0: 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  KS.  sem_t *pSem
abc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
abd0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f       /* Named PO
abe0: 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f  SIX semaphore */
abf0: 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65  .  char aSemName
ac00: 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d  [MAX_PATHNAME+2]
ac10: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
ac20: 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a  at semaphore */.
ac30: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
ac40: 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20   A lists of all 
ac50: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
ac60: 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  jects..*/.static
ac70: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
ac80: 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a  inodeList = 0;..
ac90: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
aca0: 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67  nction - unixLog
acb0: 45 72 72 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e  Error_x(), is on
acc0: 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76  ly ever called v
acd0: 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20  ia the macro.** 
ace0: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a  unixLogError()..
acf0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f  **.** It is invo
ad00: 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72  ked after an err
ad10: 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20  or occurs in an 
ad20: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  OS function and 
ad30: 65 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a  errno has been.*
ad40: 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61  * set. It logs a
ad50: 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73   message using s
ad60: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e  qlite3_log() con
ad70: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
ad80: 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  ent value of.** 
ad90: 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f  errno and, if po
ada0: 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61  ssible, the huma
adb0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76  n-readable equiv
adc0: 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72  alent from strer
add0: 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65  ror() or.** stre
ade0: 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  rror_r()..**.** 
adf0: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
ae00: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  nt passed to the
ae10: 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65   macro should be
ae20: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
ae30: 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  that.** will be 
ae40: 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
ae50: 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f  te (e.g. SQLITE_
ae60: 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51  IOERR_DELETE, SQ
ae70: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20  LITE_CANTOPEN). 
ae80: 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73  .** The two subs
ae90: 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73  equent arguments
aea0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e   should be the n
aeb0: 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75  ame of the OS fu
aec0: 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66  nction that.** f
aed0: 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c  ailed (e.g. "unl
aee0: 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e  ink", "open") an
aef0: 64 20 74 68 65 20 74 68 65 20 61 73 73 6f 63 69  d the the associ
af00: 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d  ated file-system
af10: 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79   path,.** if any
af20: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69  ..*/.#define uni
af30: 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29  xLogError(a,b,c)
af40: 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f       unixLogErro
af50: 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f  rAtLine(a,b,c,__
af60: 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69  LINE__).static i
af70: 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41  nt unixLogErrorA
af80: 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72  tLine(.  int err
af90: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
afa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
afb0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
afc0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
afd0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
afe0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
aff0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
b000: 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
b010: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
b020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
b030: 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
b040: 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
b050: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b070: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
b080: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
b090: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
b0a0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  .){.  char *zErr
b0b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b0c0: 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65        /* Message
b0d0: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
b0e0: 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a   or equivalent *
b0f0: 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d  /.  int iErrno =
b100: 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20   errno;         
b110: 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73      /* Saved sys
b120: 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65  call error numbe
b130: 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  r */..  /* If th
b140: 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65  is is not a thre
b150: 61 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51  adsafe build (SQ
b160: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d  LITE_THREADSAFE=
b170: 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  =0), then use.  
b180: 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28  ** the strerror(
b190: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62  ) function to ob
b1a0: 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72  tain the human-r
b1b0: 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65  eadable error me
b1c0: 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76  ssage.  ** equiv
b1d0: 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20  alent to errno. 
b1e0: 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73  Otherwise, use s
b1f0: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a  trerror_r()..  *
b200: 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  / .#if SQLITE_TH
b210: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
b220: 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f  ned(HAVE_STRERRO
b230: 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72  R_R).  char aErr
b240: 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61  [80];.  memset(a
b250: 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  Err, 0, sizeof(a
b260: 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20  Err));.  zErr = 
b270: 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  aErr;..  /* If S
b280: 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50  TRERROR_R_CHAR_P
b290: 20 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e   (set by autocon
b2a0: 66 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f  f scripts) or __
b2b0: 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e  USE_GNU is defin
b2c0: 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20  ed,.  ** assume 
b2d0: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
b2e0: 70 72 6f 76 69 64 65 73 20 74 68 65 20 74 68 65  provides the the
b2f0: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20   GNU version of 
b300: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61  strerror_r() tha
b310: 74 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  t .  ** returns 
b320: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
b330: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
b340: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
b350: 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72  ge. That pointer
b360: 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74   .  ** may point
b370: 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69   to aErr[], or i
b380: 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73  t may point to s
b390: 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72 61  ome static stora
b3a0: 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20  ge somewhere. . 
b3b0: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61   ** Otherwise, a
b3c0: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73  ssume that the s
b3d0: 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74  ystem provides t
b3e0: 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e  he POSIX version
b3f0: 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72   of .  ** strerr
b400: 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c  or_r(), which al
b410: 77 61 79 73 20 77 72 69 74 65 73 20 61 6e 20 65  ways writes an e
b420: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74  rror message int
b430: 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20  o aErr[]..  **. 
b440: 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20   ** If the code 
b450: 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75  incorrectly assu
b460: 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20 74  mes that it is t
b470: 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e  he POSIX version
b480: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76   that is.  ** av
b490: 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72  ailable, the err
b4a0: 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20  or message will 
b4b0: 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74  often be an empt
b4c0: 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a  y string. Not a.
b4d0: 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65    ** huge proble
b4e0: 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63  m. Incorrectly c
b4f0: 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74  oncluding that t
b500: 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69  he GNU version i
b510: 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a  s available .  *
b520: 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  * could lead to 
b530: 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67  a segfault thoug
b540: 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  h..  */.#if defi
b550: 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43  ned(STRERROR_R_C
b560: 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65  HAR_P) || define
b570: 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a  d(__USE_GNU).  z
b580: 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20  Err = .# endif. 
b590: 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72   strerror_r(iErr
b5a0: 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66  no, aErr, sizeof
b5b0: 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69  (aErr)-1);..#eli
b5c0: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
b5d0: 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73  AFE.  /* This is
b5e0: 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75   a threadsafe bu
b5f0: 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f  ild, but strerro
b600: 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61  r_r() is not ava
b610: 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72  ilable. */.  zEr
b620: 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20  r = "";.#else.  
b630: 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66  /* Non-threadsaf
b640: 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72  e build, use str
b650: 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45  error(). */.  zE
b660: 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45  rr = strerror(iE
b670: 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  rrno);.#endif.. 
b680: 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64 65   assert( errcode
b690: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
b6a0: 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20   if( zPath==0 ) 
b6b0: 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71  zPath = "";.  sq
b6c0: 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64  lite3_log(errcod
b6d0: 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69  e,.      "os_uni
b6e0: 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28  x.c:%d: (%d) %s(
b6f0: 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20  %s) - %s",.     
b700: 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20   iLine, iErrno, 
b710: 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45  zFunc, zPath, zE
b720: 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  rr.  );..  retur
b730: 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n errcode;.}../*
b740: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
b750: 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a   descriptor..**.
b760: 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68 61  ** We assume tha
b770: 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74  t close() almost
b780: 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73   always works, s
b790: 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20  ince it is only 
b7a0: 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63  in a.** very sic
b7b0: 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72  k application or
b7c0: 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20   on a very sick 
b7d0: 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74  platform that it
b7e0: 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20   might fail..** 
b7f0: 49 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c  If it does fail,
b800: 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65   simply leak the
b810: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b820: 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65  , but do log the
b830: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
b840: 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73   Note that it is
b850: 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74   not safe to ret
b860: 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72  ry close() after
b870: 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65   EINTR since the
b880: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
b890: 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 61  tor might have a
b8a0: 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 75 73  lready been reus
b8b0: 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68  ed by another th
b8c0: 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64  read..** So we d
b8d0: 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f  on't even try to
b8e0: 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e   recover from an
b8f0: 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f   EINTR.  Just lo
b900: 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61  g the error.** a
b910: 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73  nd move on..*/.s
b920: 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73  tatic void robus
b930: 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65  t_close(unixFile
b940: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20   *pFile, int h, 
b950: 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69  int lineno){.  i
b960: 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b  f( osClose(h) ){
b970: 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f  .    unixLogErro
b980: 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49  rAtLine(SQLITE_I
b990: 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f  OERR_CLOSE, "clo
b9a0: 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  se",.           
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
b9c0: 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e ? pFile->zPath
b9d0: 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20   : 0, lineno);. 
b9e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
b9f0: 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72  e all file descr
ba00: 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65  iptors accumuate
ba10: 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f  d in the unixIno
ba20: 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20  deInfo->pUnused 
ba30: 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  list..*/ .static
ba40: 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69   void closePendi
ba50: 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a  ngFds(unixFile *
ba60: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
ba70: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
ba80: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
ba90: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
baa0: 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  *p;.  UnixUnused
bab0: 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  Fd *pNext;.  for
bac0: 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  (p=pInode->pUnus
bad0: 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  ed; p; p=pNext){
bae0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
baf0: 70 4e 65 78 74 3b 0a 23 69 66 20 4f 53 43 4c 4f  pNext;.#if OSCLO
bb00: 53 45 5f 43 48 45 43 4b 5f 43 4c 4f 53 45 5f 49  SE_CHECK_CLOSE_I
bb10: 4f 45 52 52 0a 20 20 20 20 69 66 28 20 63 6c 6f  OERR.    if( clo
bb20: 73 65 28 70 2d 3e 66 64 29 20 29 7b 0a 20 20 20  se(p->fd) ){.   
bb30: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
bb40: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
bb50: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
bb60: 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  OERR_CLOSE;.    
bb70: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 45 72    p->pNext = pEr
bb80: 72 6f 72 3b 0a 20 20 20 20 20 20 70 45 72 72 6f  ror;.      pErro
bb90: 72 20 3d 20 70 3b 0a 20 20 20 20 7d 65 6c 73 65  r = p;.    }else
bba0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
bbb0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a 23  free(p);.    }.#
bbc0: 65 6c 73 65 0a 20 20 20 20 72 6f 62 75 73 74 5f  else.    robust_
bbd0: 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e  close(pFile, p->
bbe0: 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
bbf0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
bc00: 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  p);.#endif.  }. 
bc10: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
bc20: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
bc30: 65 6c 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f  elease a unixIno
bc40: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
bc50: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
bc60: 63 61 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f  cated by findIno
bc70: 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20  deInfo()..**.** 
bc80: 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65  The mutex entere
bc90: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78  d using the unix
bca0: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e  EnterMutex() fun
bcb0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65  ction must be he
bcc0: 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ld.** when this 
bcd0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
bce0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
bcf0: 69 64 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  id releaseInodeI
bd00: 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  nfo(unixFile *pF
bd10: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
bd20: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
bd30: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
bd40: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
bd50: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
bd60: 28 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29  ( ALWAYS(pInode)
bd70: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   ){.    pInode->
bd80: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
bd90: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  pInode->nRef==0 
bda0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
bdb0: 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64   pInode->pShmNod
bdc0: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c  e==0 );.      cl
bdd0: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
bde0: 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
bdf0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b  pInode->pPrev ){
be00: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
be10: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
be20: 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b  pNext==pInode );
be30: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
be40: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
be50: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
be60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
be70: 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64      assert( inod
be80: 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b  eList==pInode );
be90: 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69  .        inodeLi
bea0: 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  st = pInode->pNe
beb0: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
bec0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e    if( pInode->pN
bed0: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ext ){.        a
bee0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
bef0: 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e  Next->pPrev==pIn
bf00: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
bf10: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
bf20: 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50  rev = pInode->pP
bf30: 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rev;.      }.   
bf40: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
bf50: 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  pInode);.    }. 
bf60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
bf70: 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
bf80: 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20  tor, locate the 
bf90: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
bfa0: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73  ject that.** des
bfb0: 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65  cribes that file
bfc0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72   descriptor.  Cr
bfd0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
bfe0: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
bff0: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
c000: 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69  e might be unini
c010: 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65  tialized if an e
c020: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  rror occurs..**.
c030: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74  ** The mutex ent
c040: 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75  ered using the u
c050: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
c060: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
c070: 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68   held.** when th
c080: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
c090: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
c0a0: 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  urn an appropria
c0b0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
c0c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
c0d0: 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e  dInodeInfo(.  un
c0e0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c100: 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66  Unix file with f
c110: 69 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e  ile desc used in
c120: 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e   the key */.  un
c130: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70  ixInodeInfo **pp
c140: 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20  Inode        /* 
c150: 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49  Return the unixI
c160: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
c170: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
c180: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
c190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c1a0: 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72  ystem call retur
c1b0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
c1c0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
c1d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c1e0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
c1f0: 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20  r for pFile */. 
c200: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
c210: 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20  Id fileId;      
c220: 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f  /* Lookup key fo
c230: 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  r the unixInodeI
c240: 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nfo */.  struct 
c250: 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
c260: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c          /* Low-l
c270: 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d  evel file inform
c280: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49  ation */.  unixI
c290: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
c2a0: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e   = 0;     /* Can
c2b0: 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65  didate unixInode
c2c0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  Info object */..
c2d0: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
c2e0: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20  texHeld() );..  
c2f0: 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c  /* Get low-level
c300: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
c310: 75 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  ut the file that
c320: 20 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a   we can used to.
c330: 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e    ** create a un
c340: 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  ique name for th
c350: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66  e file..  */.  f
c360: 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
c370: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
c380: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
c390: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc!=0 ){.    p
c3a0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
c3b0: 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20  = errno;.#ifdef 
c3c0: 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66  EOVERFLOW.    if
c3d0: 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
c3e0: 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20  no==EOVERFLOW ) 
c3f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c400: 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LFS;.#endif.    
c410: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
c420: 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ERR;.  }..#ifdef
c430: 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20   __APPLE__.  /* 
c440: 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73  On OS X on an ms
c450: 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20  dos filesystem, 
c460: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
c470: 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a   is reported.  *
c480: 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f  * incorrectly fo
c490: 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65  r zero-size file
c4a0: 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  s.  See ticket #
c4b0: 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20  3260.  To work. 
c4c0: 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20   ** around this 
c4d0: 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73  problem (we cons
c4e0: 69 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e  ider it a bug in
c4f0: 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74   OS X, not SQLit
c500: 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79  e).  ** we alway
c510: 73 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66  s increase the f
c520: 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79  ile size to 1 by
c530: 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
c540: 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f  e byte.  ** prio
c550: 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74  r to accessing t
c560: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
c570: 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77    The one byte w
c580: 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61  ritten is.  ** a
c590: 6e 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72  n ASCII 'S' char
c5a0: 61 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f  acter which also
c5b0: 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74   happens to be t
c5c0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
c5d0: 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ** in the header
c5e0: 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65   of every SQLite
c5f0: 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74   database.  In t
c600: 68 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72  his way, if ther
c610: 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65  e.  ** is a race
c620: 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20   condition such 
c630: 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72  that another thr
c640: 65 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ead has already 
c650: 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74  populated.  ** t
c660: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
c670: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e   the database, n
c680: 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65  o damage is done
c690: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61  ..  */.  if( sta
c6a0: 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20  tbuf.st_size==0 
c6b0: 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61  && (pFile->fsFla
c6c0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c  gs & SQLITE_FSFL
c6d0: 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30  AGS_IS_MSDOS)!=0
c6e0: 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d   ){.    do{ rc =
c6f0: 20 6f 73 57 72 69 74 65 28 66 64 2c 20 22 53 22   osWrite(fd, "S"
c700: 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  , 1); }while( rc
c710: 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
c720: 54 52 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  TR );.    if( rc
c730: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 46 69  !=1 ){.      pFi
c740: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
c750: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  errno;.      ret
c760: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
c770: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
c780: 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74   osFstat(fd, &st
c790: 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20  atbuf);.    if( 
c7a0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  rc!=0 ){.      p
c7b0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
c7c0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
c7d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
c7e0: 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
c7f0: 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26  ndif..  memset(&
c800: 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f  fileId, 0, sizeo
c810: 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69  f(fileId));.  fi
c820: 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62  leId.dev = statb
c830: 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f  uf.st_dev;.#if O
c840: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65  S_VXWORKS.  file
c850: 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e  Id.pId = pFile->
c860: 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c  pId;.#else.  fil
c870: 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75  eId.ino = statbu
c880: 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66  f.st_ino;.#endif
c890: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64  .  pInode = inod
c8a0: 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  eList;.  while( 
c8b0: 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70  pInode && memcmp
c8c0: 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64  (&fileId, &pInod
c8d0: 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f  e->fileId, sizeo
c8e0: 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20  f(fileId)) ){.  
c8f0: 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64    pInode = pInod
c900: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  e->pNext;.  }.  
c910: 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b  if( pInode==0 ){
c920: 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71  .    pInode = sq
c930: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
c940: 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b  zeof(*pInode) );
c950: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d  .    if( pInode=
c960: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
c970: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
c980: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
c990: 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a  t(pInode, 0, siz
c9a0: 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20  eof(*pInode));. 
c9b0: 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64     memcpy(&pInod
c9c0: 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65  e->fileId, &file
c9d0: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
c9e0: 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d));.    pInode-
c9f0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
ca00: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69  Inode->pNext = i
ca10: 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49  nodeList;.    pI
ca20: 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b  node->pPrev = 0;
ca30: 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69  .    if( inodeLi
ca40: 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e  st ) inodeList->
ca50: 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a  pPrev = pInode;.
ca60: 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20      inodeList = 
ca70: 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  pInode;.  }else{
ca80: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
ca90: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e  f++;.  }.  *ppIn
caa0: 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ode = pInode;.  
cab0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cac0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
cad0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
cae0: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
caf0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
cb00: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
cb10: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
cb20: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
cb30: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
cb40: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
cb50: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
cb60: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
cb70: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
cb80: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
cb90: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
cba0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
cbb0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
cbc0: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
cbd0: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
cbe0: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
cbf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
cc00: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
cc10: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
cc20: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
cc30: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
cc40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
cc50: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
cc60: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
cc70: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
cc80: 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
cc90: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
cca0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
ccb0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
ccc0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
ccd0: 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  e );.  unixEnter
cce0: 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
ccf0: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
cd00: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
cd10: 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20  ss threads */.. 
cd20: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
cd30: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
cd40: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
cd50: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
cd60: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
cd70: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
cd80: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
cd90: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  erved = 1;.  }..
cda0: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
cdb0: 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
cdc0: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
cdd0: 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
cde0: 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20  __DJGPP__.  if( 
cdf0: 21 72 65 73 65 72 76 65 64 20 26 26 20 21 70 46  !reserved && !pF
ce00: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
ce10: 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20  ocessLock ){.   
ce20: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
ce30: 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ck;.    lock.l_w
ce40: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
ce50: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
ce60: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
ce70: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
ce80: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  en = 1;.    lock
ce90: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
cea0: 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e  K;.    if( osFcn
ceb0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47  tl(pFile->h, F_G
cec0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  ETLK, &lock) ){.
ced0: 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48  #if OSLOCKING_CH
cee0: 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20  ECK_BUSY_IOERR. 
cef0: 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
cf00: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
cf10: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
cf20: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
cf30: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
cf40: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
cf50: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 46 69  LOCK);.      pFi
cf60: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
cf70: 74 45 72 72 6e 6f 3b 0a 23 65 6c 73 65 0a 20 20  tErrno;.#else.  
cf80: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
cf90: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
cfa0: 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  VEDLOCK;.      p
cfb0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
cfc0: 3d 20 65 72 72 6e 6f 3b 0a 23 65 6e 64 69 66 0a  = errno;.#endif.
cfd0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
cfe0: 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e  ock.l_type!=F_UN
cff0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73  LCK ){.      res
d000: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
d010: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
d020: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
d030: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
d040: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
d050: 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d %d (unix)\n", 
d060: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
d070: 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52  served));..  *pR
d080: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
d090: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d0a0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 75 6e  ..static int _un
d0b0: 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46  ixFileLock(unixF
d0c0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74 72 75  ile *pFile, stru
d0d0: 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 2c  ct flock *pLock,
d0e0: 20 69 6e 74 20 72 65 74 72 79 29 3b 0a 0a 2f 2a   int retry);../*
d0f0: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
d100: 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b  et a system-lock
d110: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46 69   on the file pFi
d120: 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  le.  The lock is
d130: 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62   .** described b
d140: 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  y pLock..**.** I
d150: 66 20 74 68 65 20 70 46 69 6c 65 20 77 61 73 20  f the pFile was 
d160: 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74  opened read/writ
d170: 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c  e from unix-excl
d180: 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20  , then the only 
d190: 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74  lock.** ever obt
d1a0: 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63 6c  ained is an excl
d1b0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20  usive lock, and 
d1c0: 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20 65  it is obtained e
d1d0: 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74  xactly once.** t
d1e0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e  he first time an
d1f0: 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70  y lock is attemp
d200: 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71  ted.  All subseq
d210: 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b  uent system lock
d220: 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
d230: 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e  s become no-ops.
d240: 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74    Locking operat
d250: 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70 65  ions still happe
d260: 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a  n internally,.**
d270: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f   in order to coo
d280: 72 64 69 6e 61 74 65 20 61 63 63 65 73 73 20 62  rdinate access b
d290: 65 74 77 65 65 6e 20 73 65 70 61 72 61 74 65 20  etween separate 
d2a0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
d2b0: 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ions.** within t
d2c0: 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75 74  his process, but
d2d0: 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73 20   all of that is 
d2e0: 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72  handled in memor
d2f0: 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65  y and the.** ope
d300: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64 6f  rating system do
d310: 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70 61  es not participa
d320: 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  te..**.** This f
d330: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61 73  unction is a pas
d340: 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63 6e  s-through to fcn
d350: 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20 70  tl(F_SETLK) if p
d360: 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a  File is using.**
d370: 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20 74   any VFS other t
d380: 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 20  han "unix-excl" 
d390: 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73 20 6f  or if pFile is o
d3a0: 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65  pened on "unix-e
d3b0: 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72  xcl".** and is r
d3c0: 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ead-only..**.** 
d3d0: 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  Zero is returned
d3e0: 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d   if the call com
d3f0: 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66 75  pletes successfu
d400: 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61 20  lly, or -1 if a 
d410: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c  call.** to fcntl
d420: 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68 69  () fails. In thi
d430: 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69 73  s case, errno is
d440: 20 73 65 74 20 61 70 70 72 6f 70 72 69 61 74 65   set appropriate
d450: 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29 2e  ly (by fcntl()).
d460: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
d470: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78  nixFileLock(unix
d480: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74 72  File *pFile, str
d490: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b  uct flock *pLock
d4a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 5f 75 6e 69  ){.  return _uni
d4b0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
d4c0: 20 70 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 73   pLock, 0);.}..s
d4d0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
d4e0: 6c 65 4c 6f 63 6b 32 28 75 6e 69 78 46 69 6c 65  leLock2(unixFile
d4f0: 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20   *pFile, struct 
d500: 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20  flock *pLock){. 
d510: 20 72 65 74 75 72 6e 20 5f 75 6e 69 78 46 69 6c   return _unixFil
d520: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 4c 6f  eLock(pFile, pLo
d530: 63 6b 2c 20 31 30 29 3b 0a 7d 0a 0a 73 74 61 74  ck, 10);.}..stat
d540: 69 63 20 69 6e 74 20 5f 75 6e 69 78 46 69 6c 65  ic int _unixFile
d550: 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
d560: 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f  File, struct flo
d570: 63 6b 20 2a 70 4c 6f 63 6b 2c 20 69 6e 74 20 72  ck *pLock, int r
d580: 65 74 72 79 29 20 7b 0a 20 20 69 6e 74 20 72 63  etry) {.  int rc
d590: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 49 6e 6f 64   = 0;.  unixInod
d5a0: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
d5b0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
d5c0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
d5d0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73  exHeld() );.  as
d5e0: 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20  sert( pInode!=0 
d5f0: 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c 65  );.  if( ((pFile
d600: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
d610: 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20  IXFILE_EXCL)!=0 
d620: 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  || pInode->bProc
d630: 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28  essLock).   && (
d640: 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
d650: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  s & UNIXFILE_RDO
d660: 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20  NLY)==0).  ){.  
d670: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50    if( pInode->bP
d680: 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
d690: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c  .      struct fl
d6a0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  ock lock;.      
d6b0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
d6c0: 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  nLock==0 );.    
d6d0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
d6e0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
d6f0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
d700: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
d710: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
d720: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
d730: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
d740: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
d750: 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70    rc = osFcntl(p
d760: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
d770: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  , &lock);.      
d780: 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72  if( rc<0 ) retur
d790: 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f  n rc;.      pIno
d7a0: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
d7b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f   = 1;.      pIno
d7c0: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
d7d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
d7e0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
d7f0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  lse{.    int i =
d800: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
d810: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 64 6f           .    do
d820: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73   {.      rc = os
d830: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
d840: 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b  F_SETLK, pLock);
d850: 0a 20 20 20 20 20 20 69 66 20 28 72 63 20 26 26  .      if (rc &&
d860: 20 72 65 74 72 79 29 20 7b 0a 20 20 20 20 20 20   retry) {.      
d870: 20 20 75 73 6c 65 65 70 28 31 30 30 20 2a 20 28    usleep(100 * (
d880: 2b 2b 69 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ++i));.      }. 
d890: 20 20 20 7d 20 77 68 69 6c 65 20 28 21 72 63 20     } while (!rc 
d8a0: 26 26 20 72 65 74 72 79 2d 2d 29 3b 0a 20 20 7d  && retry--);.  }
d8b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d8c0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
d8d0: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
d8e0: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
d8f0: 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
d900: 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
d910: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
d920: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
d930: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
d940: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
d950: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
d960: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
d970: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
d980: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
d990: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
d9a0: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
d9b0: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
d9c0: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
d9d0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
d9e0: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
d9f0: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
da00: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
da10: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
da20: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
da30: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
da40: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
da50: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
da60: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
da70: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
da80: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
da90: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
daa0: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
dab0: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
dac0: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
dad0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
dae0: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
daf0: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
db00: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
db10: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
db20: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
db30: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
db40: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
db50: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
db60: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
db70: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
db80: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
db90: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
dba0: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
dbb0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
dbc0: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
dbd0: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
dbe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dbf0: 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33  unixLock(sqlite3
dc00: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
dc10: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20  FileLock){.  /* 
dc20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65  The following de
dc30: 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c  scribes the impl
dc40: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
dc50: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20  e various locks 
dc60: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72  and.  ** lock tr
dc70: 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72  ansitions in ter
dc80: 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20  ms of the POSIX 
dc90: 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20  advisory shared 
dca0: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20  and exclusive.  
dcb0: 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76  ** lock primitiv
dcc0: 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d  es (called read-
dcd0: 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d  locks and write-
dce0: 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20  locks below, to 
dcf0: 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75  avoid.  ** confu
dd00: 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65  sion with SQLite
dd10: 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68   lock names). Th
dd20: 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65  e algorithms are
dd30: 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a   complicated.  *
dd40: 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72  * slightly in or
dd50: 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74  der to be compat
dd60: 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77  ible with window
dd70: 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74  s systems simult
dd80: 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63  aneously.  ** ac
dd90: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
dda0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
ddb0: 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20  in case that is 
ddc0: 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20  ever required.. 
ddd0: 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73   **.  ** Symbols
dde0: 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68   defined in os.h
ddf0: 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27   indentify the '
de00: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e  pending byte' an
de10: 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a  d the 'reserved.
de20: 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68    ** byte', each
de30: 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74   single bytes at
de40: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
de50: 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68  ets, and the 'sh
de60: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
de70: 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f  ange', a range o
de80: 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61  f 510 bytes at a
de90: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
dea0: 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  et..  **.  ** To
deb0: 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44   obtain a SHARED
dec0: 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f   lock, a read-lo
ded0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
dee0: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20  n the 'pending. 
def0: 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74   ** byte'.  If t
df00: 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75  his is successfu
df10: 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  l, a random byte
df20: 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65   from the 'share
df30: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
df40: 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65  e' is read-locke
df50: 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  d and the lock o
df60: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
df70: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20  yte' released.. 
df80: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
df90: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
dfa0: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
dfb0: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
dfc0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20  a SHARED lock.. 
dfd0: 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c   ** A RESERVED l
dfe0: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
dff0: 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61  ed by grabbing a
e000: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
e010: 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65  he.  ** 'reserve
e020: 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20  d byte'. .  **. 
e030: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
e040: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
e050: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74  PENDING lock aft
e060: 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e  er it has obtain
e070: 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44  ed a.  ** SHARED
e080: 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47   lock. A PENDING
e090: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
e0a0: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
e0b0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20  g a write-lock. 
e0c0: 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64   ** on the 'pend
e0d0: 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20  ing byte'. This 
e0e0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
e0f0: 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  new SHARED locks
e100: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74   can be.  ** obt
e110: 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74  ained, but exist
e120: 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ing SHARED locks
e130: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
e140: 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65  persist. A proce
e150: 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ss.  ** does not
e160: 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20   have to obtain 
e170: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
e180: 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20  on the way to a 
e190: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20  PENDING lock..  
e1a0: 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79  ** This property
e1b0: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
e1c0: 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f  algorithm for ro
e1d0: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
e1e0: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61  rnal file.  ** a
e1f0: 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20  fter a crash..  
e200: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55  **.  ** An EXCLU
e210: 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69  SIVE lock, obtai
e220: 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44  ned after a PEND
e230: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ING lock is held
e240: 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d  , is.  ** implem
e250: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
e260: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
e270: 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73  on the entire 's
e280: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
e290: 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c  range'. Since al
e2a0: 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65  l other locks re
e2b0: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
e2c0: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  k on one of the 
e2d0: 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69  bytes.  ** withi
e2e0: 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68  n this range, th
e2f0: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
e300: 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61  no other locks a
e310: 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  re held on the. 
e320: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20   ** database. . 
e330: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61   **.  ** The rea
e340: 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74  son a single byt
e350: 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  e cannot be used
e360: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
e370: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
e380: 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74  * range' is that
e390: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
e3a0: 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74  f windows do not
e3b0: 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f   support read-lo
e3c0: 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63  cks. By.  ** loc
e3d0: 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79  king a random by
e3e0: 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c  te from a range,
e3f0: 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52   concurrent SHAR
e400: 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69  ED locks may exi
e410: 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  st.  ** even if 
e420: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  the locking prim
e430: 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c  itive used is al
e440: 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63  ways a write-loc
e450: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63  k..  */.  int rc
e460: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
e470: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
e480: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
e490: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
e4a0: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
e4b0: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75  ->pInode;.  stru
e4c0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
e4d0: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b   int tErrno = 0;
e4e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
e4f0: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
e500: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
e510: 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
e520: 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  =%d (unix)\n", p
e530: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61  File->h,.      a
e540: 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
e550: 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  ock), azFileLock
e560: 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
e570: 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65  k),.      azFile
e580: 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69  Lock(pInode->eFi
e590: 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d  leLock), pInode-
e5a0: 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69  >nShared , getpi
e5b0: 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  d()));..  /* If 
e5c0: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
e5d0: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
e5e0: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
e5f0: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
e600: 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
e610: 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
e620: 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63   use the end_loc
e630: 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
e640: 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d  .  ** unixEnterM
e650: 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
e660: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
e670: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
e680: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c  >eFileLock>=eFil
e690: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54  eLock ){.    OST
e6a0: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
e6b0: 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
e6c0: 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22   held) (unix)\n"
e6d0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
e6e0: 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
e6f0: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b  ck(eFileLock)));
e700: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e710: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
e720: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
e730: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
e740: 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a  is correct..  **
e750: 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d    (1) We never m
e760: 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65  ove from unlocke
e770: 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69  d to anything hi
e780: 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64  gher than shared
e790: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29   lock..  **  (2)
e7a0: 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78   SQLite never ex
e7b0: 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74  plicitly request
e7c0: 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e  s a pendig lock.
e7d0: 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61  .  **  (3) A sha
e7e0: 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61  red lock is alwa
e7f0: 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72  ys held when a r
e800: 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72  eserve lock is r
e810: 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
e820: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
e830: 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
e840: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
e850: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
e860: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
e870: 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
e880: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
e890: 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56  FileLock!=RESERV
e8a0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
e8b0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
e8c0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  RED_LOCK );..  /
e8d0: 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
e8e0: 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
e8f0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
e900: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
e910: 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69  reads.  */.  uni
e920: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
e930: 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
e940: 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49  >pInode;..  /* I
e950: 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  f some thread us
e960: 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73  ing this PID has
e970: 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69   a lock via a di
e980: 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65  fferent unixFile
e990: 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
e9a0: 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
e9b0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
e9c0: 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
e9d0: 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
e9e0: 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f  >eFileLock!=pIno
e9f0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26  de->eFileLock &&
ea00: 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 6e   .          (pIn
ea10: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ode->eFileLock>=
ea20: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20  PENDING_LOCK || 
ea30: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
ea40: 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
ea50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
ea60: 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  Y;.    goto end_
ea70: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lock;.  }..  /* 
ea80: 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
ea90: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
eaa0: 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
eab0: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
eac0: 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
ead0: 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
eae0: 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
eaf0: 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
eb00: 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
eb10: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
eb20: 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
eb30: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
eb40: 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20  D_LOCK && .     
eb50: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
eb60: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
eb70: 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c   || pInode->eFil
eb80: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
eb90: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
eba0: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
ebb0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
ebc0: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
ebd0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
ebe0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
ebf0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20  node->nShared>0 
ec00: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  );.    pFile->eF
ec10: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
ec20: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
ec30: 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20  e->nShared++;.  
ec40: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
ec50: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  +;.    goto end_
ec60: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  lock;.  }...  /*
ec70: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
ec80: 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
ec90: 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
eca0: 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
ecb0: 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
ecc0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
ecd0: 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
ece0: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
ecf0: 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
ed00: 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
ed10: 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e   */.  lock.l_len
ed20: 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f   = 1L;.  lock.l_
ed30: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
ed40: 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  T;.  if( eFileLo
ed50: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
ed60: 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65  .      || (eFile
ed70: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
ed80: 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
ed90: 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47  FileLock<PENDING
eda0: 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
edb0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65  lock.l_type = (e
edc0: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
edd0: 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f  _LOCK?F_RDLCK:F_
ede0: 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b  WRLCK);.    lock
edf0: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
ee00: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28  NG_BYTE;.    if(
ee10: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
ee20: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
ee30: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
ee40: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
ee50: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
ee60: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
ee70: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
ee80: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
ee90: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
eea0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
eeb0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
eec0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
eed0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
eee0: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ock;.    }.  }..
eef0: 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
ef00: 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
ef10: 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
ef20: 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
ef30: 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
ef40: 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
ef50: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
ef60: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
ef70: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
ef80: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
ef90: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
efa0: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a  ->nShared==0 );.
efb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
efc0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  de->eFileLock==0
efd0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
efe0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
eff0: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74  ..    /* Now get
f000: 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a   the read-lock *
f010: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
f020: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
f030: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  T;.    lock.l_le
f040: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
f050: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
f060: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
f070: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
f080: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f090: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
f0a0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
f0b0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
f0c0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
f0d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70    }..    /* Drop
f0e0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
f0f0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
f100: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
f110: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
f120: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
f130: 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f   1L;.    lock.l_
f140: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
f150: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
f160: 4c 6f 63 6b 32 28 70 46 69 6c 65 2c 20 26 6c 6f  Lock2(pFile, &lo
f170: 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ck) && rc==SQLIT
f180: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
f190: 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70   This could happ
f1a0: 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72  en with a networ
f1b0: 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  k mount */.     
f1c0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
f1d0: 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43  .#if OSLOCKING_C
f1e0: 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a  HECK_BUSY_IOERR.
f1f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f200: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
f210: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
f220: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
f230: 29 3b 20 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  ); .#else.      
f240: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
f250: 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e 64 69  R_UNLOCK; .#endi
f260: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  f.    }..    if(
f270: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28   rc ){.      if(
f280: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
f290: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
f2a0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
f2b0: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
f2c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
f2d0: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  lock;.    }else{
f2e0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
f2f0: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
f300: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e  _LOCK;.      pIn
f310: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
f320: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
f330: 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  red = 1;.    }. 
f340: 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
f350: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
f360: 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e  LOCK && pInode->
f370: 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20  nShared>1 ){.   
f380: 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
f390: 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
f3a0: 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
f3b0: 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
f3c0: 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  is.    ** same p
f3d0: 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
f3e0: 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
f3f0: 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
f400: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
f410: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
f420: 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
f430: 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
f440: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
f450: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
f460: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
f470: 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
f480: 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
f490: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
f4a0: 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
f4b0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  /.    assert( 0!
f4c0: 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
f4d0: 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k );.    lock.l_
f4e0: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
f4f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69  .    assert( eFi
f500: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
f510: 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
f520: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
f530: 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46  CK );.    if( eF
f540: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
f550: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  D_LOCK ){.      
f560: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
f570: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
f580: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
f590: 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1L;.    }else{.
f5a0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
f5b0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
f5c0: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
f5d0: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
f5e0: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  E;.    }..    if
f5f0: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
f600: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
f610: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
f620: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
f630: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
f640: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
f650: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
f660: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
f670: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
f680: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
f690: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
f6a0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
f6b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66     }.  }.  ..#if
f6c0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
f6d0: 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e   Set up the tran
f6e0: 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20  saction-counter 
f6f0: 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20  change checking 
f700: 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20  flags when.  ** 
f710: 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
f720: 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61  om a SHARED to a
f730: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20   RESERVED lock. 
f740: 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a   The change.  **
f750: 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
f760: 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74  RESERVED marks t
f770: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
f780: 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72  a normal.  ** wr
f790: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e  ite operation (n
f7a0: 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ot a hot journal
f7b0: 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f   rollback)..  */
f7c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
f7d0: 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65  E_OK.   && pFile
f7e0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ->eFileLock<=SHA
f7f0: 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65  RED_LOCK.   && e
f800: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
f810: 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20  ED_LOCK.  ){.   
f820: 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
f830: 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70  rChng = 0;.    p
f840: 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
f850: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   0;.    pFile->i
f860: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31  nNormalWrite = 1
f870: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20  ;.  }.#endif... 
f880: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f890: 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
f8a0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
f8b0: 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
f8c0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
f8d0: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
f8e0: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
f8f0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
f900: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
f910: 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
f920: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
f930: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
f940: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
f950: 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
f960: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
f970: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
f980: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
f990: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
f9a0: 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
f9b0: 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
f9c0: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
f9d0: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
f9e0: 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
f9f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
fa00: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
fa10: 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c 65 20  or used by file 
fa20: 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20  handle pFile to 
fa30: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
fa40: 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73  g.** pUnused lis
fa50: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
fa60: 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75  d setPendingFd(u
fa70: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
fa80: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
fa90: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
faa0: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
fab0: 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46  UnusedFd *p = pF
fac0: 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20  ile->pUnused;.  
fad0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64  p->pNext = pInod
fae0: 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49  e->pUnused;.  pI
faf0: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
fb00: 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  p;.  pFile->h = 
fb10: 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e  -1;.  pFile->pUn
fb20: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
fb30: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
fb40: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
fb50: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
fb60: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
fb70: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
fb80: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
fb90: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
fba0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
fbb0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
fbc0: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
fbd0: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
fbe0: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
fbf0: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
fc00: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
fc10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
fc20: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20  a no-op..** .** 
fc30: 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  If handleNFSUnlo
fc40: 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ck is true, then
fc50: 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   on downgrading 
fc60: 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  an EXCLUSIVE_LOC
fc70: 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74  K to SHARED.** t
fc80: 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73  he byte range is
fc90: 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20   divided into 2 
fca0: 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69  parts and the fi
fcb0: 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f  rst part is unlo
fcc0: 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74  cked then.** set
fcd0: 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c   to a read lock,
fce0: 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20   then the other 
fcf0: 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75  part is simply u
fd00: 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77  nlocked.  This w
fd10: 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20  orks .** around 
fd20: 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53  a bug in BSD NFS
fd30: 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65   lockd (also see
fd40: 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33  n on MacOSX 10.3
fd50: 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f  +) that fails to
fd60: 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20   .** remove the 
fd70: 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20  write lock on a 
fd80: 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65  region when a re
fd90: 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a  ad lock is set..
fda0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
fdb0: 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  sixUnlock(sqlite
fdc0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
fdd0: 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68  eFileLock, int h
fde0: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b  andleNFSUnlock){
fdf0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
fe00: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
fe10: 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
fe20: 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73  nfo *pInode;.  s
fe30: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
fe40: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
fe50: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 68 3b  ITE_OK;.  int h;
fe60: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
fe70: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
fe80: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
fe90: 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
fea0: 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  =%d (unix)\n", p
feb0: 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
fec0: 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ck,.      pFile-
fed0: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
fee0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
fef0: 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
ff00: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
ff10: 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a      getpid()));.
ff20: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
ff30: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
ff40: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
ff50: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
ff60: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
ff70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ff80: 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
ff90: 75 74 65 78 28 29 3b 0a 20 20 68 20 3d 20 70 46  utex();.  h = pF
ffa0: 69 6c 65 2d 3e 68 3b 0a 20 20 70 49 6e 6f 64 65  ile->h;.  pInode
ffb0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
ffc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
ffd0: 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29  de->nShared!=0 )
ffe0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
fff0: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
10000 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
10010 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
10020 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46  eLock==pFile->eF
10030 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53  ileLock );.    S
10040 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
10050 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d  nign(1);.    Sim
10060 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
10070 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c  (-1) ).    Simul
10080 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
10090 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  (0);..#ifndef ND
100a0 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
100b0 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
100c0 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
100d0 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
100e0 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
100f0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
10100 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
10110 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
10120 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
10130 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
10140 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
10150 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
10160 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
10170 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
10180 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
10190 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
101a0 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
101b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
101c0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
101d0 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
101e0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
101f0 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
10200 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
10210 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
10220 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
10230 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
10240 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
10250 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
10260 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
10270 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 30 0a 20  ..    */.#if 0. 
10280 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
10290 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
102a0 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
102b0 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d  File->dbUpdate==
102c0 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46  0.         || pF
102d0 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
102e0 6e 67 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  ng==1 );.#endif.
102f0 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
10300 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65  malWrite = 0;.#e
10310 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77  ndif..    /* dow
10320 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68  ngrading to a sh
10330 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53  ared lock on NFS
10340 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69   involves cleari
10350 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ng the write loc
10360 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  k.    ** before 
10370 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65  establishing the
10380 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61   readlock - to a
10390 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64  void a race cond
103a0 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61  ition we downgra
103b0 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  de.    ** the lo
103c0 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20  ck in 2 blocks, 
103d0 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20  so that part of 
103e0 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62  the range will b
103f0 65 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a  e covered by a .
10400 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63      ** write loc
10410 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74  k until the rest
10420 20 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61   is covered by a
10430 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20   read lock:.    
10440 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d  **  1:   [WWWWW]
10450 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e  .    **  2:   [.
10460 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a  ...W].    **  3:
10470 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a     [RRRRW].    *
10480 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a  *  4:   [RRRR.].
10490 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
104a0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
104b0 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66 20 21 64  _LOCK ){..#if !d
104c0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
104d0 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41  ) || !SQLITE_ENA
104e0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
104f0 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29 68 61  E.      (void)ha
10500 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20  ndleNFSUnlock;. 
10510 20 20 20 20 20 61 73 73 65 72 74 28 20 68 61 6e       assert( han
10520 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20  dleNFSUnlock==0 
10530 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
10540 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
10550 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
10560 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
10570 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
10580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10590 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
105a0 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 65  om system call e
105b0 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 69  rrors */.      i
105c0 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  f( handleNFSUnlo
105d0 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 66  ck ){.        of
105e0 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48  f_t divSize = SH
105f0 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20  ARED_SIZE - 1;. 
10600 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
10610 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
10620 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  UNLCK;.        l
10630 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
10640 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
10650 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
10660 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
10670 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
10680 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20   = divSize;.    
10690 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
106a0 4c 6f 63 6b 32 28 70 46 69 6c 65 2c 20 26 6c 6f  Lock2(pFile, &lo
106b0 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
106c0 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
106d0 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43  errno;.#if OSLOC
106e0 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f  KING_CHECK_BUSY_
106f0 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
10700 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
10710 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
10720 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
10730 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c  ERR_UNLOCK);.#el
10740 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  se.          rc 
10750 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
10760 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  NLOCK;.#endif.  
10770 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
10780 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
10790 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
107a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
107b0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
107c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
107d0 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
107e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
107f0 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
10800 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
10810 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
10820 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
10830 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
10840 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
10850 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
10860 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
10870 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
10880 65 4c 6f 63 6b 32 28 70 46 69 6c 65 2c 20 26 6c  eLock2(pFile, &l
10890 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)==(-1) ){.  
108a0 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
108b0 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f   errno;.#if OSLO
108c0 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59  CKING_CHECK_BUSY
108d0 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
108e0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
108f0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
10900 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
10910 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 23 65  OERR_RDLOCK);.#e
10920 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63  lse.          rc
10930 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
10940 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20  UNLOCK;.#endif. 
10950 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
10960 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
10970 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  {.            pF
10980 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10990 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
109a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
109b0 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
109c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
109d0 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
109e0 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_UNLCK;.       
109f0 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
10a00 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
10a10 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
10a20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64  = SHARED_FIRST+d
10a30 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
10a40 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
10a50 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65  RED_SIZE-divSize
10a60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
10a70 69 78 46 69 6c 65 4c 6f 63 6b 32 28 70 46 69 6c  ixFileLock2(pFil
10a80 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
10a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
10aa0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
10ab0 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
10ac0 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
10ad0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10ae0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
10af0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
10b00 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
10b10 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
10b20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
10b30 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e  OERR_UNLOCK;.#en
10b40 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 69 66  dif.          if
10b50 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
10b60 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
10b70 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
10b80 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
10b90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10ba0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
10bb0 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
10bc0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
10bd0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
10be0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
10bf0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
10c00 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20  _STYLE */.      
10c10 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  {.        lock.l
10c20 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
10c30 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
10c40 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
10c50 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
10c60 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
10c70 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
10c80 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
10c90 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
10ca0 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
10cb0 63 6b 32 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ck2(pFile, &lock
10cc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
10cd0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
10ce0 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
10cf0 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
10d00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
10d10 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10d20 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
10d30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
10d40 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  CK);.#else.     
10d50 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72       /* In theor
10d60 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75  y, the call to u
10d70 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61  nixFileLock() ca
10d80 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73  nnot fail becaus
10d90 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20  e another.      
10da0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69      ** process i
10db0 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63  s holding an inc
10dc0 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20  ompatible lock. 
10dd0 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73  If it does, this
10de0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
10df0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
10e00 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
10e10 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
10e20 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20   the locking.   
10e30 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63         ** protoc
10e40 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ol. If this happ
10e50 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ens, return SQLI
10e60 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e  TE_IOERR_RDLOCK.
10e70 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20   Returning.     
10e80 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42       ** SQLITE_B
10e90 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73  USY would confus
10ea0 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  e the upper laye
10eb0 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20 69  r (in practice i
10ec0 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20 20  t causes .      
10ed0 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74      ** an assert
10ee0 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20   to fail). */ . 
10ef0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
10f00 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
10f10 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  K;.          pFi
10f20 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
10f30 74 45 72 72 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20  tErrno;.#endif. 
10f40 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
10f50 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
10f60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  {.            pF
10f70 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10f80 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
10f90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
10fa0 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
10fb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10fc0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b  }.    }.    lock
10fd0 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
10fe0 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  K;.    lock.l_wh
10ff0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
11000 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
11010 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
11020 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
11030 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20   = 2L;  assert( 
11040 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d  PENDING_BYTE+1==
11050 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b  RESERVED_BYTE );
11060 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
11070 65 4c 6f 63 6b 32 28 70 46 69 6c 65 2c 20 26 6c  eLock2(pFile, &l
11080 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
11090 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
110a0 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
110b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
110c0 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
110d0 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
110e0 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
110f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
11100 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
11110 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
11120 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
11130 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
11140 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
11150 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
11160 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
11170 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 23  Errno;.      }.#
11180 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
11190 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
111a0 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  OCK;.      pFile
111b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
111c0 72 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  rno;.#endif.    
111d0 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
111e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
111f0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  f( eFileLock==NO
11200 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
11210 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
11220 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
11230 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
11240 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
11250 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
11260 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
11270 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
11280 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
11290 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
112a0 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
112b0 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
112c0 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
112d0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
112e0 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
112f0 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
11300 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
11310 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
11320 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
11330 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
11340 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75  = 0L;.      Simu
11350 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
11360 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  n(1);.      Simu
11370 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
11380 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75  -1) ).      Simu
11390 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
113a0 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
113b0 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 32 28 70 46  unixFileLock2(pF
113c0 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  ile, &lock)==0 )
113d0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
113e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
113f0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
11400 73 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e  se{.#if OSLOCKIN
11410 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
11420 52 52 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e  RR.        tErrn
11430 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
11440 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
11450 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
11460 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
11470 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
11480 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
11490 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
114a0 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
114b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
114c0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rrno;.        }.
114d0 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63  #else.        rc
114e0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
114f0 55 4e 4c 4f 43 4b 3b 0a 09 20 20 20 20 70 46 69  UNLOCK;..    pFi
11500 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11510 65 72 72 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20  errno;.#endif.  
11520 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->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 20 20 70 46 69 6c 65  K;.        pFile
11550 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
11560 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
11570 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
11580 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74  rement the count
11590 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73   of locks agains
115a0 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65  t this same file
115b0 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20  .  When the.    
115c0 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ** count reaches
115d0 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79   zero, close any
115e0 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
115f0 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c  riptors whose cl
11600 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64  ose.    ** was d
11610 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20  eferred because 
11620 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
11630 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ocks..    */.   
11640 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d   pInode->nLock--
11650 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
11660 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
11670 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
11680 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ->nLock==0 ){.  
11690 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
116a0 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
116b0 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f  }.  }...end_unlo
116c0 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
116d0 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
116e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46  ==SQLITE_OK ) pF
116f0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
11700 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
11710 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11720 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
11730 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
11740 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
11750 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
11760 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
11770 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
11780 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
11790 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
117a0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
117b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
117c0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
117d0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
117e0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
117f0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
11800 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
11810 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
11820 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b  c int unixUnlock
11830 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11840 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
11850 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69  ){.  return posi
11860 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
11870 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  eLock, 0);.}../*
11880 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11890 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70  n performs the p
118a0 61 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f  arts of the "clo
118b0 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69  se file" operati
118c0 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f  on .** common to
118d0 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68   all locking sch
118e0 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20  emes. It closes 
118f0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e  the directory an
11900 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65  d file.** handle
11910 73 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76  s, if they are v
11920 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61  alid, and sets a
11930 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
11940 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72   unixFile.** str
11950 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a  ucture to 0..**.
11960 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e  ** It is *not* n
11970 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64  ecessary to hold
11980 20 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20   the mutex when 
11990 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
119a0 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20  called,.** even 
119b0 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d  on VxWorks.  A m
119c0 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71  utex will be acq
119d0 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73  uired on VxWorks
119e0 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72   by the.** vxwor
119f0 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
11a00 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
11a10 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e  atic int closeUn
11a20 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66  ixFile(sqlite3_f
11a30 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
11a40 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11a50 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66  nixFile*)id;.#if
11a60 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43   OSCLOSE_CHECK_C
11a70 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20 69 66 28  LOSE_IOERR.  if(
11a80 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30   pFile->dirfd>=0
11a90 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 20   ){.    int err 
11aa0 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64  = close(pFile->d
11ab0 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 65  irfd);.    if( e
11ac0 72 72 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  rr ){.      pFil
11ad0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
11ae0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
11af0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
11b00 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 7d  DIR_CLOSE;.    }
11b10 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
11b20 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20 20  e->dirfd=-1;.   
11b30 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69   }.  }.  if( pFi
11b40 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  le->h>=0 ){.    
11b50 69 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28  int err = close(
11b60 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 69  pFile->h);.    i
11b70 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
11b80 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11b90 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
11ba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
11bb0 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 7d  ERR_CLOSE;.    }
11bc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
11bd0 65 2d 3e 68 3d 2d 31 3b 0a 20 20 20 20 7d 0a 20  e->h=-1;.    }. 
11be0 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70   }.#else.  if( p
11bf0 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
11c00 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  {.    robust_clo
11c10 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  se(pFile, pFile-
11c20 3e 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  >dirfd, __LINE__
11c30 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 69  );.    pFile->di
11c40 72 66 64 3d 2d 31 3b 0a 20 20 7d 0a 20 20 69 66  rfd=-1;.  }.  if
11c50 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
11c60 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
11c70 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  e(pFile, pFile->
11c80 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
11c90 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
11ca0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20  .  }.#endif.#if 
11cb0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
11cc0 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20   pFile->pId ){. 
11cd0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73     if( pFile->is
11ce0 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
11cf0 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49  unlink(pFile->pI
11d00 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
11d10 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78  e);.    }.    vx
11d20 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
11d30 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a  Id(pFile->pId);.
11d40 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d      pFile->pId =
11d50 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
11d60 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
11d70 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c     %-3d\n", pFil
11d80 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f  e->h));.  OpenCo
11d90 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c  unter(-1);.  sql
11da0 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
11db0 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d  >pUnused);.  mem
11dc0 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
11dd0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
11de0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11df0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
11e00 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
11e10 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c  tatic int unixCl
11e20 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
11e30 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20   *id){.  int rc 
11e40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11e50 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11e60 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
11e70 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64  .  unixUnlock(id
11e80 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e  , NO_LOCK);.  un
11e90 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
11ea0 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70  .  /* unixFile.p
11eb0 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20  Inode is always 
11ec0 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65  valid here. Othe
11ed0 72 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65  rwise, a differe
11ee0 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f  nt close.  ** ro
11ef0 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f  utine (e.g. nolo
11f00 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64  ckClose()) would
11f10 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
11f20 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ad..  */.  asser
11f30 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  t( pFile->pInode
11f40 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69  ->nLock>0 || pFi
11f50 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  le->pInode->bPro
11f60 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  cessLock==0 );. 
11f70 20 69 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c   if( ALWAYS(pFil
11f80 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46  e->pInode) && pF
11f90 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
11fa0 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ck ){.    /* If 
11fb0 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
11fc0 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
11fd0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
11fe0 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
11ff0 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61  .    ** yet beca
12000 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
12010 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
12020 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
12030 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
12040 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49  descriptor to pI
12050 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69  node->pUnused li
12060 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  st.  It will be 
12070 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
12080 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68 65  osed .    ** whe
12090 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  n the last lock 
120a0 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
120b0 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e  */.    setPendin
120c0 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  gFd(pFile);.  }.
120d0 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
120e0 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20  fo(pFile);.  rc 
120f0 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
12100 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  id);.  unixLeave
12110 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
12120 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  n rc;.}../******
12130 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
12140 74 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  the posix adviso
12150 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  ry lock implemen
12160 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
12170 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
12180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121c0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
121d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12210 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
12220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12230 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c  ******** No-op L
12240 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
12250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12260 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
12270 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  Of the various l
12280 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
12290 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65  ations available
122a0 2c 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72  , this is by far
122b0 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74   the.** simplest
122c0 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67  :  locking is ig
122d0 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d  nored.  No attem
122e0 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f  pt is made to lo
122f0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ck the database.
12300 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  ** file for read
12310 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a  ing or writing..
12320 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69  **.** This locki
12330 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f  ng mode is appro
12340 70 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f  priate for use o
12350 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  n read-only data
12360 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61  bases.** (ex: da
12370 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65  tabases that are
12380 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d   burned into CD-
12390 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ROM, for example
123a0 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c  .)  It can.** al
123b0 73 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68  so be used if th
123c0 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d  e application em
123d0 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72  ploys some exter
123e0 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f  nal mechanism to
123f0 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75  .** prevent simu
12400 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20  ltaneous access 
12410 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  of the same data
12420 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d  base by two or m
12430 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ore.** database 
12440 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75  connections.  Bu
12450 74 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72  t there is a ser
12460 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74  ious risk of dat
12470 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74  abase.** corrupt
12480 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b  ion if this lock
12490 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
124a0 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77   in situations w
124b0 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  here multiple.**
124c0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
124d0 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73  tions are access
124e0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
124f0 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
12500 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61  e same.** time a
12510 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  nd one or more o
12520 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69  f those connecti
12530 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e  ons are writing.
12540 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
12550 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
12560 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
12570 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
12580 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
12590 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
125a0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52  (NotUsed);.  *pR
125b0 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74  esOut = 0;.  ret
125c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
125d0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
125e0 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
125f0 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
12600 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55  t NotUsed2){.  U
12610 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
12620 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
12630 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d2);.  return SQ
12640 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
12650 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f  c int nolockUnlo
12660 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
12670 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
12680 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
12690 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
126a0 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
126b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
126c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
126d0 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ose the file..*/
126e0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
126f0 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
12700 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65  file *id) {.  re
12710 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69  turn closeUnixFi
12720 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  le(id);.}../****
12730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
12740 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70  End of the no-op
12750 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
12760 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
12770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
12780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
127d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
12820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12830 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d  ***** Begin dot-
12840 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  file Locking ***
12850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
12870 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f  * The dotfile lo
12880 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
12890 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78  tion uses the ex
128a0 69 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61 72  istance of separ
128b0 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65  ate lock.** file
128c0 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  s in order to co
128d0 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20  ntrol access to 
128e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
128f0 68 69 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73  his works on jus
12900 74 0a 2a 2a 20 61 62 6f 75 74 20 65 76 65 72 79  t.** about every
12910 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67   filesystem imag
12920 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65  inable.  But the
12930 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64  re are serious d
12940 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20  ownsides:.**.** 
12950 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73     (1)  There is
12960 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63   zero concurrenc
12970 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61  y.  A single rea
12980 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f  der blocks all o
12990 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  ther.**         
129a0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  connections from
129b0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
129c0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
129d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
129e0 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  An application c
129f0 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f  rash or power lo
12a00 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61  ss can leave sta
12a10 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a  le lock files.**
12a20 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67           sitting
12a30 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65   around that nee
12a40 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20  d to be cleared 
12a50 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  manually..**.** 
12a60 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20  Nevertheless, a 
12a70 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70  dotlock is an ap
12a80 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
12a90 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69  g mode for use i
12aa0 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f  f no.** other lo
12ab0 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69  cking strategy i
12ac0 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  s available..**.
12ad0 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  ** Dotfile locki
12ae0 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61  ng works by crea
12af0 74 69 6e 67 20 61 20 66 69 6c 65 20 69 6e 20 74  ting a file in t
12b00 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
12b10 79 20 61 73 20 74 68 65 0a 2a 2a 20 64 61 74 61  y as the.** data
12b20 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
12b30 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
12b40 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
12b50 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
12b60 2a 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63 65  ** The existance
12b70 20 6f 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20   of a lock file 
12b80 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55  implies an EXCLU
12b90 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20  SIVE lock.  All 
12ba0 6f 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79  other lock.** ty
12bb0 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53  pes (SHARED, RES
12bc0 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20  ERVED, PENDING) 
12bd0 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  are mapped into 
12be0 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f  EXCLUSIVE..*/../
12bf0 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75  *.** The file su
12c00 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68  ffix added to th
12c10 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65  e data base file
12c20 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  name in order to
12c30 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c   create the.** l
12c40 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65  ock file..*/.#de
12c50 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  fine DOTLOCK_SUF
12c60 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a  FIX ".lock"../*.
12c70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12c80 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
12c90 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
12ca0 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
12cb0 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
12cc0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
12cd0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
12ce0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
12cf0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
12d00 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
12d10 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
12d20 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
12d30 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
12d40 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
12d50 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
12d60 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
12d70 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
12d80 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
12d90 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ecking..**.** In
12da0 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
12db0 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20  , either a lock 
12dc0 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65  exists or it doe
12dd0 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68  s not.  So in th
12de0 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20  is.** variation 
12df0 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64  of CheckReserved
12e00 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74  Lock(), *pResOut
12e10 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
12e20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69  if any lock.** i
12e30 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  s held on the fi
12e40 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  le and false if 
12e50 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
12e60 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cked..*/.static 
12e70 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  int dotlockCheck
12e80 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
12e90 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12ea0 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
12eb0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12ec0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
12ed0 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
12ee0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12ef0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
12f00 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
12f10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
12f20 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
12f30 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
12f40 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
12f50 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
12f60 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
12f70 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
12f80 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
12f90 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
12fa0 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
12fb0 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
12fc0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
12fd0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   or some other c
12fe0 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65  onnection in the
12ff0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20   same process.  
13000 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63    ** holds a loc
13010 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  k on the file.  
13020 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  No need to check
13030 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
13040 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
13050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
13060 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  he lock is held 
13070 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74  if and only if t
13080 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73  he lockfile exis
13090 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ts */.    const 
130a0 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
130b0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
130c0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
130d0 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76  text;.    reserv
130e0 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c  ed = osAccess(zL
130f0 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a  ockFile, 0)==0;.
13100 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
13110 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
13120 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  %d %d (dotlock)\
13130 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
13140 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
13150 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
13160 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
13170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
13180 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
13190 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
131a0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
131b0 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
131c0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
131d0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
131e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
131f0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
13200 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
13210 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
13220 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
13230 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
13240 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
13250 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
13260 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
13270 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
13280 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
13290 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
132a0 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
132b0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
132c0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
132d0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
132e0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
132f0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
13300 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
13310 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
13320 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
13330 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
13340 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
13350 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
13360 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
13370 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
13380 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
13390 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
133a0 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
133b0 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
133c0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
133d0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
133e0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
133f0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
13400 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
13410 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
13420 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
13430 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
13440 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
13450 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
13460 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
13470 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
13480 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
13490 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
134a0 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
134b0 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
134c0 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
134d0 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
134e0 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
134f0 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
13500 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
13510 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
13520 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
13530 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13540 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
13550 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
13560 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
13570 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  id;.  int fd;.  
13580 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
13590 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
135a0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
135b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
135c0 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66  TE_OK;...  /* If
135d0 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63   we have any loc
135e0 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  k, then the lock
135f0 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78   file already ex
13600 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61  ists.  All we ha
13610 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
13620 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65   adjust our inte
13630 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
13640 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20  he lock level.. 
13650 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
13660 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
13670 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
13680 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
13690 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a  FileLock;.    /*
136a0 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
136b0 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
136c0 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
136d0 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
136e0 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63  E.    utime(zLoc
136f0 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
13700 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a  lse.    utimes(z
13710 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
13720 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
13730 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13740 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
13750 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
13760 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73   */.  fd = robus
13770 74 5f 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65  t_open(zLockFile
13780 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41  ,O_RDONLY|O_CREA
13790 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a  T|O_EXCL,0600);.
137a0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
137b0 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f    /* failed to o
137c0 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66  pen/create the f
137d0 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73  ile, someone els
137e0 65 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65  e may have stole
137f0 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  n the lock */.  
13800 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
13810 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45  rrno;.    if( EE
13820 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29  XIST == tErrno )
13830 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
13840 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20  ITE_BUSY;.    } 
13850 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20  else {.      rc 
13860 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
13870 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
13880 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
13890 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
138a0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
138b0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
138c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
138d0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
138e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
138f0 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 23 69 66 20  rn rc;.  } .#if 
13900 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c  OSCLOSE_CHECK_CL
13910 4f 53 45 5f 49 4f 45 52 52 0a 20 20 69 66 28 20  OSE_IOERR.  if( 
13920 63 6c 6f 73 65 28 66 64 29 20 29 7b 0a 20 20 20  close(fd) ){.   
13930 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13940 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
13950 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
13960 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a 23 65 6c 73  _CLOSE;.  }.#els
13970 65 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  e.  robust_close
13980 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49  (pFile, fd, __LI
13990 4e 45 5f 5f 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NE__);.#endif.  
139a0 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
139b0 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
139c0 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
139d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
139e0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
139f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13a00 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
13a10 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
13a20 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
13a30 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
13a40 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
13a50 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
13a60 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
13a70 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
13a80 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
13a90 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
13aa0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
13ab0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
13ac0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
13ad0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
13ae0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
13af0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68   no-op..**.** Wh
13b00 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  en the locking l
13b10 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f  evel reaches NO_
13b20 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65  LOCK, delete the
13b30 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73   lock file..*/.s
13b40 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
13b50 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
13b60 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
13b70 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
13b80 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
13b90 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
13ba0 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
13bb0 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
13bc0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
13bd0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
13be0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
13bf0 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
13c00 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f  as %d pid=%d (do
13c10 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  tlock)\n", pFile
13c20 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
13c30 09 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  .   pFile->eFile
13c40 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29  Lock, getpid()))
13c50 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
13c60 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
13c70 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
13c80 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
13c90 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
13ca0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
13cb0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
13cc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13cd0 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67  }..  /* To downg
13ce0 72 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20  rade to shared, 
13cf0 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75  simply update ou
13d00 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f  r internal notio
13d10 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
13d20 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65  ck state.  No ne
13d30 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20  ed to mess with 
13d40 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
13d50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
13d60 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
13d70 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
13d80 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
13d90 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  ARED_LOCK;.    r
13da0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13db0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20  .  }.  .  /* To 
13dc0 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65  fully unlock the
13dd0 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74   database, delet
13de0 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  e the lock file 
13df0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  */.  assert( eFi
13e00 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
13e10 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28  );.  if( unlink(
13e20 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20  zLockFile) ){.  
13e30 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
13e40 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
13e50 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e  rrno;.    if( EN
13e60 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29  OENT != tErrno )
13e70 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  {.#if OSLOCKING_
13e80 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
13e90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13ea0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
13eb0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
13ec0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
13ed0 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  K);.#else.      
13ee0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
13ef0 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66  R_UNLOCK;.#endif
13f00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
13f10 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
13f20 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
13f30 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
13f40 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
13f50 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
13f60 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13f70 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  k = NO_LOCK;.  r
13f80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
13fa0 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75  a file.  Make su
13fb0 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  re the lock has 
13fc0 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65  been released be
13fd0 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f  fore closing..*/
13fe0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
13ff0 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
14000 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
14010 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20  nt rc;.  if( id 
14020 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
14030 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
14040 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c  le*)id;.    dotl
14050 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
14060 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69  _LOCK);.    sqli
14070 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
14080 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
14090 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73  .  }.  rc = clos
140a0 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
140b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a   return rc;.}./*
140c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140d0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74  * End of the dot
140e0 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  -file lock imple
140f0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
14100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
14110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
14160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
141b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
141d0 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a  flock Locking **
141e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
14200 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f  *.** Use the flo
14210 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  ck() system call
14220 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b   to do file lock
14230 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  ing..**.** flock
14240 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  () locking is li
14250 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  ke dot-file lock
14260 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20  ing in that the 
14270 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d  various.** fine-
14280 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65  grain locking le
14290 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62  vels supported b
142a0 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c  y SQLite are col
142b0 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61  lapsed into.** a
142c0 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76   single exclusiv
142d0 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65  e lock.  In othe
142e0 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c  r words, SHARED,
142f0 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a   RESERVED, and.*
14300 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20  * PENDING locks 
14310 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69  are the same thi
14320 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49  ng as an EXCLUSI
14330 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65  VE lock.  SQLite
14340 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20  .** still works 
14350 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73  when you do this
14360 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63  , but concurrenc
14370 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e  y is reduced sin
14380 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  ce.** only a sin
14390 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
143a0 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  be reading the d
143b0 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d  atabase at a tim
143c0 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68  e..**.** Omit th
143d0 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51  is section if SQ
143e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
143f0 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72  ING_STYLE is tur
14400 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a  ned off or if.**
14410 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56   compiling for V
14420 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53  XWORKS..*/.#if S
14430 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
14440 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
14450 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
14460 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63   Retry flock() c
14470 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77  alls that fail w
14480 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66  ith EINTR.*/.#if
14490 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63  def EINTR.static
144a0 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63   int robust_floc
144b0 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70  k(int fd, int op
144c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  ){.  int rc;.  d
144d0 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64  o{ rc = flock(fd
144e0 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  ,op); }while( rc
144f0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
14500 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  TR );.  return r
14510 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  c;.}.#else.# def
14520 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  ine robust_flock
14530 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29  (a,b) flock(a,b)
14540 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f  .#endif.     ../
14550 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14560 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
14570 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
14580 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
14590 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
145a0 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
145b0 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
145c0 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
145d0 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
145e0 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
145f0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
14600 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
14610 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
14620 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
14630 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
14640 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
14650 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
14660 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
14670 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
14680 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65  tic int flockChe
14690 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
146a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
146b0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
146c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
146d0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
146e0 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
146f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
14700 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
14710 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
14720 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
14730 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
14740 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
14750 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
14760 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  );.  .  /* Check
14770 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
14780 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
14790 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
147a0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
147b0 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
147c0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
147d0 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
147e0 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
147f0 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
14800 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
14810 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
14820 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
14830 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20   attempt to get 
14840 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
14850 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74  int lrc = robust
14860 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
14870 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
14880 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72  NB);.    if( !lr
14890 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f  c ){.      /* go
148a0 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  t the lock, unlo
148b0 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c  ck it */.      l
148c0 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
148d0 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
148e0 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28  _UN);.      if (
148f0 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20   lrc ) {.       
14900 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
14910 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  rno;.        /* 
14920 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69  unlock failed wi
14930 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 23  th an error */.#
14940 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
14950 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
14960 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69        lrc = sqli
14970 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
14980 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
14990 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
149a0 4b 29 3b 0a 23 65 6c 73 65 20 0a 20 20 20 20 20  K);.#else .     
149b0 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f     lrc = SQLITE_
149c0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23  IOERR_UNLOCK; .#
149d0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
149e0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
149f0 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lrc) ){.        
14a00 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
14a10 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
14a20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b         rc = lrc;
14a30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14a40 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
14a50 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
14a60 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
14a70 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
14a80 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65      /* someone e
14a90 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20 69  lse might have i
14aa0 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20  t reserved */.  
14ab0 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65      lrc = sqlite
14ac0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
14ad0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
14ae0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20  TE_IOERR_LOCK); 
14af0 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
14b00 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
14b10 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
14b20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
14b30 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  no;.        rc =
14b40 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   lrc;.      }.  
14b50 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
14b60 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
14b70 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b   %d %d %d (flock
14b80 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
14b90 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
14ba0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
14bb0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
14bc0 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
14bd0 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c & SQLITE_IOERR
14be0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
14bf0 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  R ){.    rc = SQ
14c00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73  LITE_OK;.    res
14c10 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e  erved=1;.  }.#en
14c20 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
14c30 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
14c40 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65  ERRORS */.  *pRe
14c50 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
14c60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14c70 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
14c80 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
14c90 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
14ca0 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
14cb0 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
14cc0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
14cd0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
14ce0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
14cf0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
14d00 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
14d10 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
14d20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
14d30 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
14d40 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
14d50 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
14d60 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
14d70 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
14d80 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
14d90 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
14da0 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
14db0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
14dc0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
14dd0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
14de0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
14df0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
14e00 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
14e10 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
14e20 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
14e30 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
14e40 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
14e50 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
14e60 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
14e70 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
14e80 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
14e90 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
14ea0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
14eb0 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
14ec0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
14ed0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
14ee0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
14ef0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
14f00 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
14f10 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
14f20 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  IVE.**.** flock(
14f30 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  ) only really su
14f40 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
14f50 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
14f60 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
14f70 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
14f80 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
14f90 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
14fa0 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
14fb0 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
14fc0 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
14fd0 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
14fe0 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
14ff0 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
15000 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
15010 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
15020 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
15030 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
15040 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
15050 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
15060 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
15070 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
15080 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
15090 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
150a0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
150b0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
150c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
150d0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
150e0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
150f0 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
15100 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20  ile );..  /* if 
15110 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
15120 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
15130 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
15140 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
15150 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
15160 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
15170 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
15180 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
15190 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
151a0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
151b0 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
151c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
151d0 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
151e0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
151f0 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66   .  if (robust_f
15200 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
15210 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
15220 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  )) {.    int tEr
15230 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
15240 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20   /* didn't get, 
15250 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a  must be busy */.
15260 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
15270 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
15280 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
15290 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
152a0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
152b0 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
152c0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
152d0 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
152e0 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20   }.  } else {.  
152f0 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
15300 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
15310 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70  turn ok */.    p
15320 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15330 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
15340 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
15350 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 66  K    %d %s %s (f
15360 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
15370 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
15380 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
15390 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
153a0 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
153b0 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66  ailed"));.#ifdef
153c0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
153d0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
153e0 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c  .  if( (rc & SQL
153f0 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
15400 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
15410 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
15420 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  SY;.  }.#endif /
15430 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
15440 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
15450 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  S */.  return rc
15460 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  ;.}.../*.** Lowe
15470 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
15480 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
15490 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
154a0 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
154b0 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
154c0 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
154d0 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
154e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
154f0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
15500 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
15510 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
15520 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
15530 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
15540 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
15550 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
15560 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15570 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  flockUnlock(sqli
15580 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
15590 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
155a0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
155b0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
155c0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
155d0 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
155e0 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
155f0 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
15600 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
15610 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
15620 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
15630 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65  e->eFileLock, ge
15640 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65  tpid()));.  asse
15650 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
15660 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
15670 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
15680 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
15690 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
156a0 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k==eFileLock ){.
156b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
156c0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
156d0 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
156e0 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
156f0 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
15700 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
15710 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    if (eFileLock=
15720 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
15730 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
15740 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
15750 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15760 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
15770 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20   /* no, really, 
15780 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28  unlock. */.  if(
15790 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
157a0 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
157b0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
157c0 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
157d0 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72  OCK_ERRORS.    r
157e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
157f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15800 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
15810 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
15820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15830 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
15840 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
15850 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
15860 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72  _LOCK;.    retur
15870 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
15890 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
158a0 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65  c int flockClose
158b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
158c0 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
158d0 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  .    flockUnlock
158e0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
158f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73   }.  return clos
15900 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
15910 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
15920 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
15930 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
15940 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  XWORK */../*****
15950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
15960 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20  nd of the flock 
15970 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
15980 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
15990 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
159a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159e0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
159f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
15a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a50 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20  *** Begin Named 
15a60 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e  Semaphore Lockin
15a70 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
15a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
15a90 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
15aa0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
15ab0 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78   supported on Vx
15ac0 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d  Works..**.** Sem
15ad0 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69  aphore locking i
15ae0 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20  s like dot-lock 
15af0 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61  and flock in tha
15b00 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  t it really only
15b10 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43  .** supports EXC
15b20 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20  LUSIVE locking. 
15b30 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70   Only a single p
15b40 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64 20  rocess can read 
15b50 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20  or write.** the 
15b60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
15b70 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72   a time.  This r
15b80 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c  educes potential
15b90 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75   concurrency, bu
15ba0 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c  t.** makes the l
15bb0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
15bc0 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a  on much easier..
15bd0 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  */.#if OS_VXWORK
15be0 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  S../*.** This ro
15bf0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
15c00 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
15c10 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
15c20 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
15c30 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
15c40 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
15c50 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
15c60 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
15c70 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
15c80 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
15c90 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
15ca0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
15cb0 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
15cc0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
15cd0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
15ce0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
15cf0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
15d00 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
15d10 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43  .static int semC
15d20 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
15d30 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
15d40 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
15d50 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
15d60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
15d70 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
15d80 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
15d90 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
15da0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
15db0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
15dc0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
15dd0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
15de0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
15df0 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
15e00 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
15e10 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
15e20 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
15e30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
15e40 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
15e50 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
15e60 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
15e70 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
15e80 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
15e90 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
15ea0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
15eb0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d  erved ){.    sem
15ec0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
15ed0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
15ee0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
15ef0 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66  statBuf;..    if
15f00 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
15f10 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  em)==-1 ){.     
15f20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
15f30 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45  rno;.      if( E
15f40 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20  AGAIN != tErrno 
15f50 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
15f60 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
15f70 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
15f80 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
15f90 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
15fa0 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  );.        pFile
15fb0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
15fc0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c  rrno;.      } el
15fd0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  se {.        /* 
15fe0 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73  someone else has
15ff0 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77   the lock when w
16000 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b  e are in NO_LOCK
16010 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
16020 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65  rved = (pFile->e
16030 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45  FileLock < SHARE
16040 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
16050 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16060 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61    /* we could ha
16070 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74  ve it if we want
16080 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d   it */.      sem
16090 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20  _post(pSem);.   
160a0 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
160b0 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
160c0 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e  %d %d %d (sem)\n
160d0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
160e0 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20   reserved));..  
160f0 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
16100 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
16110 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
16120 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
16130 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
16140 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
16150 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
16160 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
16170 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
16180 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
16190 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
161a0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
161b0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
161c0 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
161d0 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
161e0 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
161f0 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
16200 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
16210 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
16220 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
16230 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
16240 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
16250 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
16260 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
16270 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
16280 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
16290 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
162a0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
162b0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
162c0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
162d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
162e0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
162f0 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
16300 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
16310 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
16320 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
16330 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
16340 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
16350 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
16360 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
16370 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
16380 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
16390 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
163a0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
163b0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
163c0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65  CLUSIVE.**.** Se
163d0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e  maphore locks on
163e0 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
163f0 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
16400 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
16410 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
16420 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
16430 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
16440 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
16450 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
16460 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
16470 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
16480 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
16490 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
164a0 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
164b0 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
164c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
164d0 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
164e0 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
164f0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
16500 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
16510 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
16520 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
16530 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b  atic int semLock
16540 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
16550 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
16560 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
16570 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
16580 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b  e*)id;.  int fd;
16590 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d  .  sem_t *pSem =
165a0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
165b0 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pSem;.  int rc =
165c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
165d0 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
165e0 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
165f0 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
16600 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
16610 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
16620 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
16630 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
16640 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
16650 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
16660 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
16670 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d  leLock;.    rc =
16680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
16690 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
166a0 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c  k;.  }.  .  /* l
166b0 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f  ock semaphore no
166c0 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77  w but bail out w
166d0 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b  hen already lock
166e0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d  ed. */.  if( sem
166f0 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d  _trywait(pSem)==
16700 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  -1 ){.    rc = S
16710 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
16720 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
16730 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74  k;.  }..  /* got
16740 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
16750 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
16760 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  */.  pFile->eFil
16770 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
16780 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  k;.. sem_end_loc
16790 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k:.  return rc;.
167a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
167b0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
167c0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
167d0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
167e0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
167f0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
16800 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
16810 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
16820 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
16830 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
16840 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
16850 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
16860 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
16870 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
16880 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
16890 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
168a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
168b0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
168c0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
168d0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
168e0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
168f0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
16900 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
16910 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
16920 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
16930 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
16940 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43  pSem );.  OSTRAC
16950 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
16960 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
16970 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
16980 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09  >h, eFileLock,..
16990 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
169a0 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
169b0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
169c0 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
169d0 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
169e0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
169f0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
16a00 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
16a10 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
16a20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16a30 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
16a40 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
16a50 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
16a60 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
16a70 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
16a80 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
16a90 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
16aa0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
16ab0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
16ac0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16ad0 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
16ae0 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  eally unlock. */
16af0 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74  .  if ( sem_post
16b00 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20  (pSem)==-1 ) {. 
16b10 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e     int rc, tErrn
16b20 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
16b30 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
16b40 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
16b50 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
16b60 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
16b70 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
16b80 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
16b90 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
16ba0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
16bb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
16bc0 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69    }.  pFile->eFi
16bd0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
16be0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16bf0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  E_OK;.}../*. ** 
16c00 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a  Close a file.. *
16c10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
16c20 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
16c30 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
16c40 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
16c50 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
16c60 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73  xFile*)id;.    s
16c70 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  emUnlock(id, NO_
16c80 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72  LOCK);.    asser
16c90 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  t( pFile );.    
16ca0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
16cb0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  ;.    releaseIno
16cc0 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
16cd0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
16ce0 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  x();.    closeUn
16cf0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a  ixFile(id);.  }.
16d00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16d10 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
16d20 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
16d30 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
16d40 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
16d50 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
16d60 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
16d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
16d80 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73  d of the named s
16d90 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d  emaphore lock im
16da0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
16db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
16dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
16e10 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
16e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
16e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
16e80 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n AFP Locking **
16e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
16eb0 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65  **.** AFP is the
16ec0 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72   Apple Filing Pr
16ed0 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20  otocol.  AFP is 
16ee0 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79  a network filesy
16ef0 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e  stem found.** on
16f00 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68   Apple Macintosh
16f10 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74   computers - bot
16f20 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a  h OS9 and OSX..*
16f30 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79  *.** Third-party
16f40 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
16f50 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69   of AFP are avai
16f60 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73  lable.  But this
16f70 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e   code here.** on
16f80 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e  ly works on OSX.
16f90 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
16fa0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
16fb0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
16fc0 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a  KING_STYLE./*.**
16fd0 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   The afpLockingC
16fe0 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
16ff0 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66   contains all af
17000 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20  p lock specific 
17010 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66  state.*/.typedef
17020 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69   struct afpLocki
17030 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63  ngContext afpLoc
17040 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
17050 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
17060 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65  ntext {.  int re
17070 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20  served;.  const 
17080 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
17090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
170a0 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
170b0 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  le */.};..struct
170c0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
170d0 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  2.{.  unsigned l
170e0 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b  ong long offset;
170f0 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
17100 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
17110 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
17120 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
17130 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f  length;        /
17140 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74  * nbr of bytes t
17150 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
17160 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72  gned long long r
17170 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a  etRangeStart; /*
17180 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65   nbr of 1st byte
17190 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65   locked if succe
171a0 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67  ssful */.  unsig
171b0 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46  ned char unLockF
171c0 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lag;         /* 
171d0 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20  1 = unlock, 0 = 
171e0 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
171f0 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64  ed char startEnd
17200 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31  Flag;       /* 1
17210 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66  =rel to end of f
17220 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74  ork, 0=rel to st
17230 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  art */.  int fd;
17240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
17260 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63  le desc to assoc
17270 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20   this lock with 
17280 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61  */.};..#define a
17290 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
172a0 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f  k2FSCTL        _
172b0 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
172c0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
172d0 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ckPB2)../*.** Th
172e0 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  is is a utility 
172f0 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63  for setting or c
17300 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61  learing a bit-ra
17310 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a  nge lock on an.*
17320 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d  * AFP filesystem
17330 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ..** .** Return 
17340 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
17350 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53  cess, SQLITE_BUS
17360 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  Y on failure..*/
17370 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53  .static int afpS
17380 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20  etLock(.  const 
17390 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
173a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
173b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
173c0 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c  be locked or unl
173d0 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46  ocked */.  unixF
173e0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
173f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
17400 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
17410 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75  r on path */.  u
17420 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
17430 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a  g offset,     /*
17440 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   First byte to b
17450 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  e locked */.  un
17460 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
17470 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20   length,     /* 
17480 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
17490 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
174a0 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20   setLockFlag    
174b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
174c0 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e  rue to set lock.
174d0 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72    False to clear
174e0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
174f0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
17500 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20  ckPB2 pb;.  int 
17510 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c  err;.  .  pb.unL
17520 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63  ockFlag = setLoc
17530 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20  kFlag ? 0 : 1;. 
17540 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67   pb.startEndFlag
17550 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65   = 0;.  pb.offse
17560 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62  t = offset;.  pb
17570 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68  .length = length
17580 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69  ; .  pb.fd = pFi
17590 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52  le->h;.  .  OSTR
175a0 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
175b0 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69   [%s] for %d%s i
175c0 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c  n range %llx:%ll
175d0 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c  x\n", .    (setL
175e0 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46  ockFlag?"ON":"OF
175f0 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28  F"), pFile->h, (
17600 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74  pb.fd==-1?"[test
17610 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20  val-1]":""),.   
17620 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
17630 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c  );.  err = fsctl
17640 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65  (path, afpfsByte
17650 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c  RangeLock2FSCTL,
17660 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28   &pb, 0);.  if (
17670 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20   err==-1 ) {.   
17680 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
17690 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
176a0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
176b0 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64  FPSETLOCK failed
176c0 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27   to fsctl() '%s'
176d0 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
176e0 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45          path, tE
176f0 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74  rrno, strerror(t
17700 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66  Errno)));.#ifdef
17710 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
17720 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  FP_LOCK_ERRORS. 
17730 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
17740 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72  USY;.#else.    r
17750 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
17760 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
17770 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
17780 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63            setLoc
17790 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49  kFlag ? SQLITE_I
177a0 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49  OERR_LOCK : SQLI
177b0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
177c0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
177d0 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
177e0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
177f0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
17800 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
17810 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
17820 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
17830 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
17840 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
17850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17860 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
17870 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
17880 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
17890 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
178a0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
178b0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
178c0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
178d0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
178e0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
178f0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
17900 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
17910 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
17920 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
17930 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
17940 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
17950 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
17960 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
17970 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
17980 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
17990 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
179a0 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
179b0 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
179c0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
179d0 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
179e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
179f0 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
17a00 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
17a10 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
17a20 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74  id;.  .  Simulat
17a30 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
17a40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
17a50 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
17a60 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
17a70 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 66 70 4c   pFile );.  afpL
17a80 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
17a90 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
17aa0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
17ab0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
17ac0 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74  text;.  if( cont
17ad0 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
17ae0 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  .    *pResOut = 
17af0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
17b00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
17b10 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
17b20 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
17b30 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
17b40 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
17b50 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68  ds */.  .  /* Ch
17b60 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
17b70 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
17b80 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
17b90 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
17ba0 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
17bb0 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
17bc0 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
17bd0 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
17be0 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
17bf0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
17c00 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
17c10 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65    */.  if( !rese
17c20 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  rved ){.    /* l
17c30 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44  ock the RESERVED
17c40 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74   byte */.    int
17c50 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
17c60 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17c70 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
17c80 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20  ED_BYTE, 1,1);  
17c90 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
17ca0 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20  OK==lrc ){.     
17cb0 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65   /* if we succee
17cc0 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68  ded in taking th
17cd0 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c  e reserved lock,
17ce0 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65   unlock it to re
17cf0 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  store.      ** t
17d00 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  he original stat
17d10 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  e */.      lrc =
17d20 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17d30 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17d40 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
17d50 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
17d60 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
17d70 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  if we failed to 
17d80 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65  get the lock the
17d90 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  n someone else m
17da0 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20  ust have it */. 
17db0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
17dc0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
17dd0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
17de0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  rc) ){.      rc=
17df0 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  lrc;.    }.  }. 
17e00 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
17e10 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
17e20 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
17e30 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22  d %d %d (afp)\n"
17e40 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
17e50 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20  reserved));.  . 
17e60 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
17e70 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
17e80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
17e90 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
17ea0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
17eb0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
17ec0 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
17ed0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
17ee0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
17ef0 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
17f00 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
17f10 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
17f20 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
17f30 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
17f40 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
17f50 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
17f60 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
17f70 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
17f80 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
17f90 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
17fa0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
17fb0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
17fc0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
17fd0 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
17fe0 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
17ff0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
18000 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
18010 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
18020 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
18030 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
18040 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
18050 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
18060 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
18070 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
18080 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
18090 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
180a0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
180b0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
180c0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
180d0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
180e0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
180f0 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
18100 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
18110 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
18120 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
18130 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
18140 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
18150 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
18160 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
18170 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
18180 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
18190 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
181a0 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
181b0 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c   int afpLock(sql
181c0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
181d0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
181e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
181f0 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
18200 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
18210 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
18220 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
18230 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
18240 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
18250 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
18260 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
18270 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
18280 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a  kingContext;.  .
18290 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
182a0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
182b0 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
182c0 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
182d0 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
182e0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
182f0 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
18300 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f  eLock), azFileLo
18310 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ck(pFile->eFileL
18320 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ock),.          
18330 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f   azFileLock(pIno
18340 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  de->eFileLock), 
18350 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
18360 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20  , getpid()));.. 
18370 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
18380 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
18390 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
183a0 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
183b0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78  on the.  ** unix
183c0 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
183d0 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
183e0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  afp_end_lock: ex
183f0 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
18400 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
18410 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
18420 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
18430 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
18440 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b  eLock>=eFileLock
18450 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
18460 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
18470 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
18480 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  ) (afp)\n", pFil
18490 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
184a0 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
184b0 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65  eLock)));.    re
184c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
184d0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
184e0 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
184f0 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
18500 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65  ect.  **  (1) We
18510 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d   never move from
18520 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79   unlocked to any
18530 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61  thing higher tha
18540 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20  n shared lock.. 
18550 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20   **  (2) SQLite 
18560 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79  never explicitly
18570 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64   requests a pend
18580 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ig lock..  **  (
18590 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  3) A shared lock
185a0 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
185b0 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c  when a reserve l
185c0 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
185d0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
185e0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
185f0 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46  k!=NO_LOCK || eF
18600 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
18610 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
18620 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e  ( eFileLock!=PEN
18630 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
18640 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
18650 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
18660 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  || pFile->eFileL
18670 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
18680 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73   );.  .  /* This
18690 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
186a0 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
186b0 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
186c0 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
186d0 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
186e0 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
186f0 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
18700 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65  e;..  /* If some
18710 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
18720 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63  is PID has a loc
18730 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e  k via a differen
18740 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a  t unixFile*.  **
18750 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65   handle that pre
18760 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65  cludes the reque
18770 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72  sted lock, retur
18780 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  n BUSY..  */.  i
18790 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  f( (pFile->eFile
187a0 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46  Lock!=pInode->eF
187b0 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20  ileLock && .    
187c0 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
187d0 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
187e0 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
187f0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
18800 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20      ){.    rc = 
18810 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
18820 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
18830 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
18840 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
18850 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
18860 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
18870 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
18880 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
18890 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
188a0 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
188b0 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
188c0 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
188d0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
188e0 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
188f0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
18900 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20  D_LOCK && .     
18910 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
18920 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18930 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  || pInode->eFile
18940 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
18950 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65  OCK) ){.    asse
18960 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  rt( eFileLock==S
18970 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
18980 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
18990 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
189a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
189b0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29  ode->nShared>0 )
189c0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  ;.    pFile->eFi
189d0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
189e0 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
189f0 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20  ->nShared++;.   
18a00 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
18a10 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
18a20 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20  nd_lock;.  }.   
18a30 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47   .  /* A PENDING
18a40 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
18a50 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
18a60 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
18a70 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  nd before.  ** a
18a80 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
18a90 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
18aa0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
18ab0 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
18ac0 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61  ll.  ** be relea
18ad0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sed..  */.  if( 
18ae0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
18af0 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
18b00 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43   (eFileLock==EXC
18b10 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
18b20 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
18b30 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20  PENDING_LOCK).  
18b40 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  ){.    int faile
18b50 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20  d;.    failed = 
18b60 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18b70 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18b80 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
18b90 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28   1, 1);.    if (
18ba0 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20  failed) {.      
18bb0 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
18bc0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
18bd0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
18be0 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72    .  /* If contr
18bf0 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
18c00 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
18c10 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
18c20 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
18c30 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
18c40 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
18c50 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
18c60 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
18c70 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
18c80 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72      int lrc1, lr
18c90 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20  c2, lrc1Errno;. 
18ca0 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b     long lk, mask
18cb0 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72  ;.    .    asser
18cc0 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
18cd0 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
18ce0 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
18cf0 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
18d00 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d       .    mask =
18d10 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d   (sizeof(long)==
18d20 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54  8) ? LARGEST_INT
18d30 36 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b  64 : 0x7fffffff;
18d40 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
18d50 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48  the read-lock SH
18d60 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  ARED_LOCK */.   
18d70 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68   /* note that th
18d80 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65  e quality of the
18d90 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73   randomness does
18da0 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20  n't matter that 
18db0 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d  much */.    lk =
18dc0 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20   random(); .    
18dd0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
18de0 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29  te = (lk & mask)
18df0 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
18e00 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61  1);.    lrc1 = a
18e10 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
18e20 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
18e30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41  , .          SHA
18e40 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
18e50 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
18e60 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f   1);.    if( IS_
18e70 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
18e80 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72   ){.      lrc1Er
18e90 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  rno = pFile->las
18ea0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
18eb0 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
18ec0 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
18ed0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32  lock */.    lrc2
18ee0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
18ef0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
18f00 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
18f10 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a  TE, 1, 0);.    .
18f20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
18f30 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a  ERROR(lrc1) ) {.
18f40 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
18f50 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72  tErrno = lrc1Err
18f60 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  no;.      rc = l
18f70 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc1;.      goto 
18f80 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
18f90 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f    } else if( IS_
18fa0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29  LOCK_ERROR(lrc2)
18fb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c   ){.      rc = l
18fc0 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc2;.      goto 
18fd0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
18fe0 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63    } else if( lrc
18ff0 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  1 != SQLITE_OK )
19000 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72   {.      rc = lr
19010 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  c1;.    } else {
19020 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
19030 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
19040 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e  _LOCK;.      pIn
19050 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
19060 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
19070 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  red = 1;.    }. 
19080 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
19090 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
190a0 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e  LOCK && pInode->
190b0 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20  nShared>1 ){.   
190c0 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
190d0 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
190e0 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
190f0 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
19100 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20  is.     ** same 
19110 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
19120 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
19130 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72  d lock. */.    r
19140 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
19150 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19160 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
19170 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
19180 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
19190 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
191a0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
191b0 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
191c0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
191d0 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
191e0 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
191f0 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  */.    int faile
19200 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  d = 0;.    asser
19210 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69  t( 0!=pFile->eFi
19220 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  leLock );.    if
19230 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52   (eFileLock >= R
19240 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
19250 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
19260 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b   < RESERVED_LOCK
19270 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  ) {.        /* A
19280 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45  cquire a RESERVE
19290 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  D lock */.      
192a0 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
192b0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
192c0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
192d0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31  SERVED_BYTE, 1,1
192e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66 61  );.      if( !fa
192f0 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
19300 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
19310 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
19320 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61     }.    if (!fa
19330 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63  iled && eFileLoc
19340 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  k == EXCLUSIVE_L
19350 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20  OCK) {.      /* 
19360 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
19370 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  SIVE lock */.   
19380 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52       .      /* R
19390 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64  emove the shared
193a0 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79   lock before try
193b0 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20  ing the range.  
193c0 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20  we'll need to . 
193d0 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c       ** reestabl
193e0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
193f0 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20  ock if we can't 
19400 67 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f  get the  afpUnlo
19410 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ck.      */.    
19420 20 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d    if( !(failed =
19430 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
19440 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
19450 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
19460 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
19470 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f              pIno
19480 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
19490 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20  1, 0)) ){.      
194a0 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20    int failed2 = 
194b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
194c0 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d     /* now attemm
194d0 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78  pt to get the ex
194e0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e  clusive lock ran
194f0 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ge */.        fa
19500 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
19510 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
19520 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
19530 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20  _FIRST, .       
19540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19550 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
19560 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  IZE, 1);.       
19570 20 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28   if( failed && (
19580 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74  failed2 = afpSet
19590 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
195a0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
195b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195c0 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
195d0 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72  T + pInode->shar
195e0 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29  edByte, 1, 1)) )
195f0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
19600 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 68  an't reestablish
19610 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
19620 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20  .  Sqlite can't 
19630 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20  deal, this is.  
19640 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69          ** a cri
19650 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a  tical I/O error.
19660 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
19670 20 20 20 20 20 20 20 72 63 20 3d 20 28 28 66 61         rc = ((fa
19680 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f  iled & SQLITE_IO
19690 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
196a0 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20  OERR) ? failed2 
196b0 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  : .             
196c0 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c    SQLITE_IOERR_L
196d0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  OCK;.          g
196e0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
196f0 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20  ;.        } .   
19700 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19710 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a    rc = failed; .
19720 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19730 20 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a    if( failed ){.
19740 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
19750 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  d;.    }.  }.  .
19760 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19770 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
19780 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
19790 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e  ileLock;.    pIn
197a0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
197b0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65   eFileLock;.  }e
197c0 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
197d0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
197e0 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
197f0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
19800 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  ING_LOCK;.    pI
19810 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
19820 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
19830 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c    }.  .afp_end_l
19840 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
19850 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
19860 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
19870 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20  %s %s (afp)\n", 
19880 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
19890 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
198a0 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53   .         rc==S
198b0 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
198c0 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
198d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
198e0 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
198f0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
19900 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
19910 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
19920 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
19930 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
19940 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
19950 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
19960 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
19970 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
19980 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
19990 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
199a0 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
199b0 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
199c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
199d0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
199e0 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63  tic int afpUnloc
199f0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
19a00 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
19a10 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  k) {.  int rc = 
19a20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
19a30 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
19a40 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
19a50 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
19a60 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b  Inode;.  afpLock
19a70 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
19a80 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
19a90 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
19aa0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
19ab0 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61  t;.  int skipSha
19ac0 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  red = 0;.#ifdef 
19ad0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
19ae0 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  t h = pFile->h;.
19af0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
19b00 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
19b10 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
19b20 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25  d %d was %d(%d,%
19b30 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
19b40 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
19b50 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
19b60 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
19b70 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
19b80 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ode->eFileLock, 
19b90 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
19ba0 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20  Shared,.        
19bb0 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a     getpid()));..
19bc0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
19bd0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
19be0 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
19bf0 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c  >eFileLock<=eFil
19c00 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
19c10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19c20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
19c30 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
19c40 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
19c50 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
19c60 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b  e->nShared!=0 );
19c70 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
19c80 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
19c90 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
19ca0 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
19cb0 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69  Lock==pFile->eFi
19cc0 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69  leLock );.    Si
19cd0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
19ce0 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75  ign(1);.    Simu
19cf0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
19d00 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61  -1) ).    Simula
19d10 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
19d20 30 29 3b 0a 20 20 20 20 0a 23 69 66 6e 64 65 66  0);.    .#ifndef
19d30 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57   NDEBUG.    /* W
19d40 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
19d50 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
19d60 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
19d70 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
19d80 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
19d90 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
19da0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
19db0 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
19dc0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
19dd0 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
19de0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
19df0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
19e00 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
19e10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
19e20 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
19e30 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
19e40 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
19e50 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
19e60 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
19e70 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
19e80 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
19e90 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
19ea0 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
19eb0 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
19ec0 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
19ed0 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
19ee0 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
19ef0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
19f00 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
19f10 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
19f20 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
19f30 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
19f40 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30  ile->dbUpdate==0
19f50 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
19f60 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
19f70 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46  hng==1 );.    pF
19f80 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
19f90 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
19fa0 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c     .    if( pFil
19fb0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  e->eFileLock==EX
19fc0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
19fd0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
19fe0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
19ff0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
1a000 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52  ARED_FIRST, SHAR
1a010 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
1a020 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a030 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
1a040 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
1a050 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
1a060 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ed>1) ){.       
1a070 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61   /* only re-esta
1a080 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
1a090 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61   lock if necessa
1a0a0 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ry */.        in
1a0b0 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
1a0c0 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
1a0d0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
1a0e0 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  te;.        rc =
1a0f0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
1a100 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
1a110 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  le, sharedLockBy
1a120 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
1a130 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
1a140 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31    skipShared = 1
1a150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a160 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a170 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
1a180 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
1a190 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
1a1a0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
1a1b0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1a1c0 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
1a1d0 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
1a1e0 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
1a1f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
1a200 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
1a210 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
1a220 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
1a230 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
1a240 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
1a250 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
1a260 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
1a270 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  E, 1, 0);.      
1a280 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20  if( !rc ){ .    
1a290 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
1a2a0 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20  erved = 0; .    
1a2b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1a2c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a2d0 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
1a2e0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
1a2f0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
1a300 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
1a310 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
1a320 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
1a330 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1a340 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65  LITE_OK && eFile
1a350 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock==NO_LOCK ){
1a360 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
1a370 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
1a380 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
1a390 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
1a3a0 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
1a3b0 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
1a3c0 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
1a3d0 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
1a3e0 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
1a3f0 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
1a400 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67      */.    unsig
1a410 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
1a420 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
1a430 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
1a440 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
1a450 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
1a460 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  red--;.    if( p
1a470 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
1a480 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c  0 ){.      Simul
1a490 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1a4a0 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
1a4b0 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
1a4c0 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
1a4d0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1a4e0 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  (0);.      if( !
1a4f0 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20  skipShared ){.  
1a500 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
1a510 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
1a520 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
1a530 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
1a540 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1a550 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
1a560 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
1a570 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
1a580 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
1a590 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
1a5a0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
1a5b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1a5c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a5d0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
1a5e0 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k--;.      asser
1a5f0 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  t( pInode->nLock
1a600 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
1a610 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
1a620 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  0 ){.        clo
1a630 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
1a640 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
1a650 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
1a660 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
1a670 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a680 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  K ) pFile->eFile
1a690 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
1a6a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a6b0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
1a6c0 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41  file & cleanup A
1a6d0 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b  FP specific lock
1a6e0 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a  ing context .*/.
1a6f0 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c  static int afpCl
1a700 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
1a710 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
1a720 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1a730 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
1a740 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1a750 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1a760 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c     afpUnlock(id,
1a770 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75   NO_LOCK);.    u
1a780 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
1a790 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
1a7a0 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d  pInode && pFile-
1a7b0 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
1a7c0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1a7d0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
1a7e0 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
1a7f0 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
1a800 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
1a810 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61       ** yet beca
1a820 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
1a830 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
1a840 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
1a850 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
1a860 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
1a870 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67  pInode->aPending
1a880 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
1a890 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
1a8a0 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ed when.      **
1a8b0 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
1a8c0 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20  s cleared..     
1a8d0 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e   */.      setPen
1a8e0 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20  dingFd(pFile);. 
1a8f0 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
1a900 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
1a910 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1a920 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
1a930 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72  gContext);.    r
1a940 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
1a950 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c  e(id);.    unixL
1a960 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
1a970 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a980 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
1a990 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1a9a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1a9b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
1a9c0 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
1a9d0 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20  bove is the AFP 
1a9e0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
1a9f0 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
1aa00 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
1aa10 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
1aa20 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
1aa30 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
1aa40 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
1aa50 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
1aa60 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27  le.  If you don'
1aa70 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20  t compile for a 
1aa80 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75  mac, then the "u
1aa90 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20  nix-afp".** VFS 
1aaa0 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
1aab0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
1aac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
1aad0 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  f the AFP lock i
1aae0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
1aaf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab00 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1ab10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab50 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
1ab60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aba0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
1abb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abc0 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b  * Begin NFS Lock
1abd0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
1abe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abf0 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  ****/..#if defin
1ac00 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1ac10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1ac20 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
1ac30 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f   ** Lower the lo
1ac40 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
1ac50 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
1ac60 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
1ac70 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a  k.  eFileLock. *
1ac80 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
1ac90 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
1aca0 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a  ED_LOCK.. **. **
1acb0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
1acc0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
1acd0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
1ace0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
1acf0 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75  low. ** the requ
1ad00 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
1ad10 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
1ad20 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a  e is a no-op.. *
1ad30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73  /.static int nfs
1ad40 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
1ad50 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
1ad60 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72  leLock){.  retur
1ad70 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
1ad80 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b  , eFileLock, 1);
1ad90 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
1ada0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1adb0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1adc0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1add0 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
1ade0 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e  e above is the N
1adf0 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
1ae00 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
1ae10 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
1ae20 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
1ae30 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
1ae40 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
1ae50 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
1ae60 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
1ae70 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a  lable.  .**.****
1ae80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae90 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53  * End of the NFS
1aea0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
1aeb0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
1aec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
1aed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
1af20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
1af70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
1af80 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  n-locking sqlite
1af90 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
1afa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1afb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
1afc0 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69  ** The next divi
1afd0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d  sion contains im
1afe0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
1aff0 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66  r all methods of
1b000 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
1b010 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68  _file object oth
1b020 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b  er than the lock
1b030 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68  ing methods.  Th
1b040 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74  e locking.** met
1b050 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65  hods were define
1b060 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61  d in divisions a
1b070 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e  bove (one lockin
1b080 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20  g method per.** 
1b090 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73  division).  Thos
1b0a0 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61  e methods that a
1b0b0 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  re common to all
1b0c0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a   locking modes.*
1b0d0 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67  * are gather tog
1b0e0 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20  ether into this 
1b0f0 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a  division..*/../*
1b100 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
1b110 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73  offset passed as
1b120 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1b130 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20  ment, then read 
1b140 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  cnt .** bytes in
1b150 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20  to pBuf. Return 
1b160 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1b170 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
1b180 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66  d..**.** NB:  If
1b190 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f   you define USE_
1b1a0 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45  PREAD or USE_PRE
1b1b0 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69  AD64, then it mi
1b1c0 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e  ght also.** be n
1b1d0 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69  ecessary to defi
1b1e0 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
1b1f0 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69   to be 500.  Thi
1b200 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a  s varies from.**
1b210 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61   one system to a
1b220 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53  nother.  Since S
1b230 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64  QLite does not d
1b240 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a  efine USE_PREAD.
1b250 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20  ** any any form 
1b260 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77  by default, we w
1b270 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
1b280 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
1b290 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20  _SOURCE..** See 
1b2a0 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e  tickets #2741 an
1b2b0 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54  d #2681..**.** T
1b2c0 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
1b2d0 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
1b2e0 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61   on a failed rea
1b2f0 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  d the lastErrno 
1b300 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
1b310 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1b320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b330 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78  seekAndRead(unix
1b340 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  File *id, sqlite
1b350 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20  3_int64 offset, 
1b360 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
1b370 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
1b380 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
1b390 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
1b3a0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
1b3b0 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
1b3c0 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  set;.#endif.  TI
1b3d0 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64  MER_START;.#if d
1b3e0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1b3f0 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73  ).  do{ got = os
1b400 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  Pread(id->h, pBu
1b410 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
1b420 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26   }while( got<0 &
1b430 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
1b440 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1b450 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
1b460 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
1b470 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f  SE_PREAD64).  do
1b480 7b 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36  { got = osPread6
1b490 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
1b4a0 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68  nt, offset); }wh
1b4b0 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
1b4c0 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 20 20 53  rno==EINTR);.  S
1b4d0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1b4e0 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73  got = -1 );.#els
1b4f0 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20  e.  newOffset = 
1b500 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66  lseek(id->h, off
1b510 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  set, SEEK_SET);.
1b520 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b530 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29  r( newOffset-- )
1b540 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65  ;.  if( newOffse
1b550 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20  t!=offset ){.   
1b560 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d   if( newOffset =
1b570 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28  = -1 ){.      ((
1b580 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
1b590 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1b5a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b5b0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1b5c0 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
1b5d0 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20  0;....    }.    
1b5e0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
1b5f0 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61   do{ got = osRea
1b600 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
1b610 6e 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74  nt); }while( got
1b620 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
1b630 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  TR );.#endif.  T
1b640 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20  IMER_END;.  if( 
1b650 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75  got<0 ){.    ((u
1b660 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
1b670 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1b680 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
1b690 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35  "READ    %-3d %5
1b6a0 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
1b6b0 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66   id->h, got, off
1b6c0 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  set, TIMER_ELAPS
1b6d0 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  ED));.  return g
1b6e0 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  ot;.}../*.** Rea
1b6f0 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69  d data from a fi
1b700 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  le into a buffer
1b710 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1b720 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79  _OK if all.** by
1b730 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75  tes were read su
1b740 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53  ccessfully and S
1b750 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61  QLITE_IOERR if a
1b760 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1b770 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
1b780 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20   int unixRead(. 
1b790 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
1b7a0 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  d, .  void *pBuf
1b7b0 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
1b7c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
1b7d0 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69  fset.){.  unixFi
1b7e0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1b7f0 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e  xFile *)id;.  in
1b800 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28  t got;.  assert(
1b810 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20   id );..  /* If 
1b820 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
1b830 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
1b840 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
1b850 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
1b860 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
1b870 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
1b880 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
1b890 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
1b8a0 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
1b8b0 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
1b8c0 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a  ile->pUnused==0.
1b8d0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1b8e0 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
1b8f0 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
1b900 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
1b910 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
1b920 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b  if..  got = seek
1b930 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f  AndRead(pFile, o
1b940 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
1b950 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d  );.  if( got==am
1b960 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
1b970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
1b980 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  se if( got<0 ){.
1b990 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f      /* lastErrno
1b9a0 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52   set by seekAndR
1b9b0 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ead */.    retur
1b9c0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
1b9d0 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
1b9e0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1b9f0 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61  no = 0; /* not a
1ba00 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f   system error */
1ba10 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70  .    /* Unread p
1ba20 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  arts of the buff
1ba30 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  er must be zero-
1ba40 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65  filled */.    me
1ba50 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
1ba60 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74  uf)[got], 0, amt
1ba70 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72  -got);.    retur
1ba80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
1ba90 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d  HORT_READ;.  }.}
1baa0 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
1bab0 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64  the offset in id
1bac0 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65  ->offset then re
1bad0 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74  ad cnt bytes int
1bae0 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72  o pBuf..** Retur
1baf0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1bb00 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
1bb10 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65  ead.  Update the
1bb20 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54   offset..**.** T
1bb30 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
1bb40 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
1bb50 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69   on a failed wri
1bb60 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  te the lastErrno
1bb70 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
1bb80 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1bb90 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1bba0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e   seekAndWrite(un
1bbb0 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  ixFile *id, i64 
1bbc0 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f  offset, const vo
1bbd0 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
1bbe0 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23  t){.  int got;.#
1bbf0 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45  if (!defined(USE
1bc00 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69  _PREAD) && !defi
1bc10 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
1bc20 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ).  i64 newOffse
1bc30 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  t;.#endif.  TIME
1bc40 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66  R_START;.#if def
1bc50 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
1bc60 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77    do{ got = osPw
1bc70 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66  rite(id->h, pBuf
1bc80 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20  , cnt, offset); 
1bc90 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
1bca0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
1bcb0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
1bcc0 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f  SE_PREAD64).  do
1bcd0 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65  { got = osPwrite
1bce0 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  64(id->h, pBuf, 
1bcf0 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 7d 77 68  cnt, offset);}wh
1bd00 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
1bd10 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c  rno==EINTR);.#el
1bd20 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  se.  newOffset =
1bd30 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
1bd40 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
1bd50 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1bd60 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20  or( newOffset-- 
1bd70 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73  );.  if( newOffs
1bd80 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20  et!=offset ){.  
1bd90 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20    if( newOffset 
1bda0 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28  == -1 ){.      (
1bdb0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1bdc0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1bdd0 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  o;.    }else{.  
1bde0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1bdf0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
1be00 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20   0;....    }.   
1be10 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
1be20 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 57 72    do{ got = osWr
1be30 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ite(id->h, pBuf,
1be40 20 63 6e 74 29 3b 20 7d 77 68 69 6c 65 28 20 67   cnt); }while( g
1be50 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ot<0 && errno==E
1be60 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20  INTR );.#endif. 
1be70 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66   TIMER_END;.  if
1be80 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28  ( got<0 ){.    (
1be90 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1bea0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1beb0 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  o;.  }..  OSTRAC
1bec0 45 28 28 22 57 52 49 54 45 20 20 20 25 2d 33 64  E(("WRITE   %-3d
1bed0 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c   %5d %7lld %llu\
1bee0 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20  n", id->h, got, 
1bef0 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c  offset, TIMER_EL
1bf00 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72  APSED));.  retur
1bf10 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n got;.}.../*.**
1bf20 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
1bf30 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
1bf40 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
1bf50 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
1bf60 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
1bf70 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
1bf80 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
1bf90 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72  tatic int unixWr
1bfa0 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
1bfb0 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73  ile *id, .  cons
1bfc0 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20  t void *pBuf, . 
1bfd0 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
1bfe0 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
1bff0 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20   .){.  unixFile 
1c000 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1c010 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72  le*)id;.  int wr
1c020 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ote = 0;.  asser
1c030 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
1c040 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f  t( amt>0 );..  /
1c050 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
1c060 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
1c070 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73  t a journal, mas
1c080 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ter-journal or t
1c090 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20  emp.  ** file), 
1c0a0 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
1c0b0 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73   locking range s
1c0c0 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72  hould never be r
1c0d0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
1c0e0 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
1c0f0 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  t( pFile->pUnuse
1c100 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
1c110 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
1c120 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
1c130 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
1c140 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
1c150 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1c160 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20   NDEBUG.  /* If 
1c170 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
1c180 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
1c190 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1c1a0 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
1c1b0 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1c1c0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1c1d0 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1c1e0 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1c1f0 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
1c200 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1c210 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
1c220 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
1c230 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
1c240 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
1c250 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1c260 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
1c270 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
1c280 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
1c290 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  /.  if( pFile->i
1c2a0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a  nNormalWrite ){.
1c2b0 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
1c2c0 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ate = 1;  /* The
1c2d0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
1c2e0 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  en modified */. 
1c2f0 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32     if( offset<=2
1c300 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e  4 && offset+amt>
1c310 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =27 ){.      int
1c320 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
1c330 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20  oldCntr[4];.    
1c340 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1c350 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
1c360 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65    rc = seekAndRe
1c370 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c  ad(pFile, 24, ol
1c380 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20  dCntr, 4);.     
1c390 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1c3a0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1c3b0 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65   if( rc!=4 || me
1c3c0 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28  mcmp(oldCntr, &(
1c3d0 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d  (char*)pBuf)[24-
1c3e0 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29  offset], 4)!=0 )
1c3f0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1c400 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
1c410 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e   1;  /* The tran
1c420 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1c430 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  has changed */. 
1c440 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c450 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65  .#endif..  while
1c460 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74  ( amt>0 && (wrot
1c470 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1c480 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
1c490 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b  pBuf, amt))>0 ){
1c4a0 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74  .    amt -= wrot
1c4b0 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  e;.    offset +=
1c4c0 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66   wrote;.    pBuf
1c4d0 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66   = &((char*)pBuf
1c4e0 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20  )[wrote];.  }.  
1c4f0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1c500 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d  ( wrote=(-1), am
1c510 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61  t=1 ));.  Simula
1c520 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1c530 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31  ( wrote=0, amt=1
1c540 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e   ));..  if( amt>
1c550 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f  0 ){.    if( wro
1c560 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c  te<0 && pFile->l
1c570 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43  astErrno!=ENOSPC
1c580 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73   ){.      /* las
1c590 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
1c5a0 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
1c5b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c5c0 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
1c5d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c5e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1c5f0 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
1c600 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
1c610 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1c620 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
1c630 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
1c640 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
1c650 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
1c660 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
1c670 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
1c680 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
1c690 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
1c6a0 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
1c6b0 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
1c6c0 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
1c6d0 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
1c6e0 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
1c6f0 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
1c700 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
1c710 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1c720 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
1c730 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74  *.** We do not t
1c740 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20  rust systems to 
1c750 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e  provide a workin
1c760 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20  g fdatasync().  
1c770 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65  Some do..** Othe
1c780 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65  rs do no.  To be
1c790 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73   safe, we will s
1c7a0 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73  tick with the (s
1c7b0 6c 6f 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a  lower) fsync()..
1c7c0 2a 2a 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74  ** If you know t
1c7d0 68 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20  hat your system 
1c7e0 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61  does support fda
1c7f0 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74  tasync() correct
1c800 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70  ly,.** then simp
1c810 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20  ly compile with 
1c820 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74  -Dfdatasync=fdat
1c830 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65  async.*/.#if !de
1c840 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29  fined(fdatasync)
1c850 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c   && !defined(__l
1c860 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65  inux__).# define
1c870 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63   fdatasync fsync
1c880 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
1c890 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
1c8a0 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64  SYNC to 0 or 1 d
1c8b0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
1c8c0 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
1c8d0 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61  e F_FULLFSYNC ma
1c8e0 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20  cro is defined. 
1c8f0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20   F_FULLFSYNC is 
1c900 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c  currently.** onl
1c910 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d  y available on M
1c920 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68  ac OS X.  But th
1c930 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e  at could change.
1c940 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c  .*/.#ifdef F_FUL
1c950 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  LFSYNC.# define 
1c960 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31  HAVE_FULLFSYNC 1
1c970 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1c980 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30  HAVE_FULLFSYNC 0
1c990 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1c9a0 53 51 4c 49 54 45 5f 55 53 45 5f 52 45 51 55 45  SQLITE_USE_REQUE
1c9b0 53 54 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 69 6d  ST_FULLFSYNC.#im
1c9c0 70 6f 72 74 20 3c 6e 6f 74 69 66 79 2e 68 3e 0a  port <notify.h>.
1c9d0 23 69 6d 70 6f 72 74 20 3c 6c 69 62 6b 65 72 6e  #import <libkern
1c9e0 2f 4f 53 41 74 6f 6d 69 63 2e 68 3e 0a 73 74 61  /OSAtomic.h>.sta
1c9f0 74 69 63 20 4f 53 53 70 69 6e 4c 6f 63 6b 20 6e  tic OSSpinLock n
1ca00 6f 74 69 66 79 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  otify_lock = 0;.
1ca10 23 64 65 66 69 6e 65 20 52 45 51 55 45 53 54 5f  #define REQUEST_
1ca20 46 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43  FULLSYNC_NOTIFIC
1ca30 41 54 49 4f 4e 20 20 20 20 22 63 6f 6d 2e 61 70  ATION    "com.ap
1ca40 70 6c 65 2e 72 65 71 73 79 6e 63 22 0a 23 65 6e  ple.reqsync".#en
1ca50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
1ca60 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61  sync() system ca
1ca70 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ll does not work
1ca80 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f   as advertised o
1ca90 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73  n many.** unix s
1caa0 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c  ystems.  The fol
1cab0 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65  lowing procedure
1cac0 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
1cad0 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72  o make.** it wor
1cae0 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  k better..**.** 
1caf0 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  The SQLITE_NO_SY
1cb00 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65  NC macro disable
1cb10 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20  s all fsync()s. 
1cb20 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a   This is useful.
1cb30 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77  ** for testing w
1cb40 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72  hen we want to r
1cb50 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74  un through the t
1cb60 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c  est suite quickl
1cb70 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74  y..** You are st
1cb80 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a  rongly advised *
1cb90 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77  not* to deploy w
1cba0 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
1cbb0 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68  NC.** enabled, h
1cbc0 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69  owever, since wi
1cbd0 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
1cbe0 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53  C enabled, an OS
1cbf0 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77   crash.** or pow
1cc00 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  er failure will 
1cc10 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74  likely corrupt t
1cc20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cc30 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73  ..**.** SQLite s
1cc40 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79  ets the dataOnly
1cc50 20 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a   flag if the siz
1cc60 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  e of the file is
1cc70 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54   unchanged..** T
1cc80 68 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64  he idea behind d
1cc90 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20  ataOnly is that 
1cca0 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77  it should only w
1ccb0 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f  rite the file co
1ccc0 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b  ntent.** to disk
1ccd0 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e  , not the inode.
1cce0 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61    We only set da
1ccf0 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69  taOnly if the fi
1cd00 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75  le size is .** u
1cd10 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74  nchanged since t
1cd20 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  he file size is 
1cd30 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64  part of the inod
1cd40 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a  e.  However, .**
1cd50 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20   Ted Ts'o tells 
1cd60 75 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e  us that fdatasyn
1cd70 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72  c() will also wr
1cd80 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66  ite the inode if
1cd90 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a   the.** file siz
1cda0 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  e has changed.  
1cdb0 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69  The only real di
1cdc0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
1cdd0 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20   fdatasync().** 
1cde0 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64  and fsync(), Ted
1cdf0 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68   tells us, is th
1ce00 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77  at fdatasync() w
1ce10 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68  ill not flush th
1ce20 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68  e.** inode if th
1ce30 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72  e mtime or owner
1ce40 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20   or other inode 
1ce50 61 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20  attributes have 
1ce60 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f  changed..** We o
1ce70 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74  nly care about t
1ce80 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f  he file size, no
1ce90 74 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65  t the other file
1cea0 20 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a   attributes, so.
1ceb0 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c  ** as far as SQL
1cec0 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64  ite is concerned
1ced0 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29  , an fdatasync()
1cee0 20 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75   is always adequ
1cef0 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61  ate..** So, we a
1cf00 6c 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73  lways use fdatas
1cf10 79 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61  ync() if it is a
1cf20 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64  vailable, regard
1cf30 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76  less of.** the v
1cf40 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
1cf50 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74  Only flag..*/.st
1cf60 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73  atic int full_fs
1cf70 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ync(int fd, int 
1cf80 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61  fullSync, int da
1cf90 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  taOnly){.  int r
1cfa0 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  c;..  /* The fol
1cfb0 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c  lowing "ifdef/el
1cfc0 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20  if/else/" block 
1cfd0 68 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72  has the same str
1cfe0 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74  ucture as.  ** t
1cff0 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74  he one below. It
1d000 20 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68   is replicated h
1d010 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76  ere solely to av
1d020 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a  oid cluttering .
1d030 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c    ** up the real
1d040 20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55   code with the U
1d050 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1d060 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23  ) macros..  */.#
1d070 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
1d080 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
1d090 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55  RAMETER(fd);.  U
1d0a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1d0b0 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55  fullSync);.  UNU
1d0c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
1d0d0 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48  taOnly);.#elif H
1d0e0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  AVE_FULLFSYNC.  
1d0f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1d100 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73  (dataOnly);.#els
1d110 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
1d120 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a  ETER(fullSync);.
1d130 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1d140 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
1d150 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  ndif..  /* Recor
1d160 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
1d170 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f  times that we do
1d180 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28   a normal fsync(
1d190 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c  ) and .  ** FULL
1d1a0 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75  SYNC.  This is u
1d1b0 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69  sed during testi
1d1c0 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ng to verify tha
1d1d0 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  t this procedure
1d1e0 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65  .  ** gets calle
1d1f0 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  d with the corre
1d200 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20  ct arguments..  
1d210 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1d220 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c  _TEST.  if( full
1d230 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66  Sync ) sqlite3_f
1d240 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  ullsync_count++;
1d250 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
1d260 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
1d270 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
1d280 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
1d290 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
1d2a0 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
1d2b0 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
1d2c0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1d2d0 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20  TE_NO_SYNC.  rc 
1d2e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  = SQLITE_OK;.#el
1d2f0 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1d300 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  C.  if( fullSync
1d310 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
1d320 45 5f 55 53 45 5f 52 45 51 55 45 53 54 5f 46 55  E_USE_REQUEST_FU
1d330 4c 4c 46 53 59 4e 43 0a 20 20 20 20 72 63 20 3d  LLFSYNC.    rc =
1d340 20 6f 73 46 73 79 6e 63 28 66 64 29 3b 0a 20 20   osFsync(fd);.  
1d350 20 20 69 66 20 28 21 72 63 29 20 7b 0a 20 20 20    if (!rc) {.   
1d360 20 20 20 4f 53 53 70 69 6e 4c 6f 63 6b 4c 6f 63     OSSpinLockLoc
1d370 6b 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b  k(&notify_lock);
1d380 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 74 69  .      rc = noti
1d390 66 79 5f 70 6f 73 74 28 52 45 51 55 45 53 54 5f  fy_post(REQUEST_
1d3a0 46 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43  FULLSYNC_NOTIFIC
1d3b0 41 54 49 4f 4e 29 3b 0a 20 20 20 20 20 20 4f 53  ATION);.      OS
1d3c0 53 70 69 6e 4c 6f 63 6b 55 6e 6c 6f 63 6b 28 26  SpinLockUnlock(&
1d3d0 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20  notify_lock);.  
1d3e0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72 63    }.#else.    rc
1d3f0 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46   = osFcntl(fd, F
1d400 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a  _FULLFSYNC, 0);.
1d410 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
1d420 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
1d430 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c    /* If the FULL
1d440 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61  FSYNC failed, fa
1d450 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d  ll back to attem
1d460 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29  pting an fsync()
1d470 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64  ..  ** It should
1d480 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  n't be possible 
1d490 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f  for fullfsync to
1d4a0 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   fail on the loc
1d4b0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79  al .  ** file sy
1d4c0 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73  stem (on OSX), s
1d4d0 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61  o failure indica
1d4e0 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59  tes that FULLFSY
1d4f0 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75  NC.  ** isn't su
1d500 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73  pported for this
1d510 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f   file system. So
1d520 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79  , attempt an fsy
1d530 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f  nc .  ** and (fo
1d540 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68  r now) ignore th
1d550 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20  e overhead of a 
1d560 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74  superfluous fcnt
1d570 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49  l call.  .  ** I
1d580 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f  t'd be better to
1d590 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e   detect fullfsyn
1d5a0 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61  c support once a
1d5b0 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74  nd avoid .  ** t
1d5c0 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76  he fcntl call ev
1d5d0 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73  ery time sync is
1d5e0 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20   called..  */.  
1d5f0 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73  if( rc ) rc = fs
1d600 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20  ync(fd);..#elif 
1d610 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1d620 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e  _).  /* fdatasyn
1d630 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73  c() on HFS+ does
1d640 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68  n't yet flush th
1d650 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69  e file size if i
1d660 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63  t changed correc
1d670 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72  tly.  ** so curr
1d680 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74  ently we default
1d690 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68   to the macro th
1d6a0 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61  at redefines fda
1d6b0 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a  tasync to fsync.
1d6c0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e    */.  rc = fsyn
1d6d0 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20  c(fd);.#else .  
1d6e0 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
1d6f0 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d);.#if OS_VXWOR
1d700 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20  KS.  if( rc==-1 
1d710 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55  && errno==ENOTSU
1d720 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73  P ){.    rc = fs
1d730 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e  ync(fd);.  }.#en
1d740 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
1d750 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69  S */.#endif /* i
1d760 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1d770 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55  YNC elif HAVE_FU
1d780 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66  LLFSYNC */..  if
1d790 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  ( OS_VXWORKS && 
1d7a0 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72  rc!= -1 ){.    r
1d7b0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 0;.  }.  ret
1d7c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d7d0 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
1d7e0 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
1d7f0 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
1d800 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
1d810 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
1d820 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
1d830 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
1d840 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
1d850 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
1d860 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
1d870 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
1d880 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
1d890 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
1d8a0 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
1d8b0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
1d8c0 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
1d8d0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
1d8e0 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1d8f0 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
1d900 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
1d910 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
1d920 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
1d930 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
1d940 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
1d950 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
1d960 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
1d970 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
1d980 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
1d990 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
1d9a0 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
1d9b0 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
1d9c0 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
1d9d0 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
1d9e0 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
1d9f0 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
1da00 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
1da10 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
1da20 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
1da30 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1da40 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
1da50 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
1da60 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
1da70 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
1da80 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
1da90 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
1daa0 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
1dab0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
1dac0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1dad0 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
1dae0 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
1daf0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1db00 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
1db10 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
1db20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
1db30 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
1db40 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
1db50 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
1db60 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
1db70 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
1db80 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
1db90 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
1dba0 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
1dbb0 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
1dbc0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1dbd0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
1dbe0 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
1dbf0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
1dc00 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
1dc10 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
1dc20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
1dc30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1dc40 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
1dc50 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
1dc60 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
1dc70 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
1dc80 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
1dc90 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
1dca0 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
1dcb0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
1dcc0 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72  FULL );..  asser
1dcd0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
1dce0 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20  TRACE(("SYNC    
1dcf0 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
1dd00 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c  h));.  rc = full
1dd10 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c  _fsync(pFile->h,
1dd20 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44   isFullsync, isD
1dd30 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75  ataOnly);.  Simu
1dd40 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
1dd50 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  1 );.  if( rc ){
1dd60 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
1dd70 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1dd80 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1dd90 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1dda0 45 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c  ERR_FSYNC, "full
1ddb0 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e  _fsync", pFile->
1ddc0 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66  zPath);.  }.  if
1ddd0 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d  ( pFile->dirfd>=
1dde0 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
1ddf0 28 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20  (("DIRSYNC %-3d 
1de00 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d  (have_fullfsync=
1de10 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c  %d fullsync=%d)\
1de20 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  n", pFile->dirfd
1de30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41  ,.            HA
1de40 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73  VE_FULLFSYNC, is
1de50 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 23 69 66 6e  Fullsync));.#ifn
1de60 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
1de70 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f  LE_DIRSYNC.    /
1de80 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
1de90 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74  sync is only att
1dea0 65 6d 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66  empted if full_f
1deb0 73 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74  sync is.    ** t
1dec0 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61  urned off or una
1ded0 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20  vailable.  If a 
1dee0 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72  full_fsync occur
1def0 72 65 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a  red above,.    *
1df00 2a 20 74 68 65 6e 20 74 68 65 20 64 69 72 65 63  * then the direc
1df10 74 6f 72 79 20 73 79 6e 63 20 69 73 20 73 75 70  tory sync is sup
1df20 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f  erfluous..    */
1df30 0a 20 20 20 20 69 66 28 20 28 21 48 41 56 45 5f  .    if( (!HAVE_
1df40 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73  FULLFSYNC || !is
1df50 46 75 6c 6c 73 79 6e 63 29 20 26 26 20 66 75 6c  Fullsync) && ful
1df60 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64  l_fsync(pFile->d
1df70 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20  irfd,0,0) ){.   
1df80 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a      /*.       **
1df90 20 57 65 20 68 61 76 65 20 72 65 63 65 69 76 65   We have receive
1dfa0 64 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72  d multiple repor
1dfb0 74 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65  ts of fsync() re
1dfc0 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a  turning.       *
1dfd0 2a 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70  * errors when ap
1dfe0 70 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f  plied to directo
1dff0 72 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20  ries on certain 
1e000 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20  file systems..  
1e010 20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64       ** A failed
1e020 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   directory sync 
1e030 69 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61  is not a big dea
1e040 6c 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a  l.  So it seems.
1e050 20 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72         ** better
1e060 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65   to ignore the e
1e070 72 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31  rror.  Ticket #1
1e080 36 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  657.       */.  
1e090 20 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 6c       /* pFile->l
1e0a0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1e0b0 3b 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72  ; */.       /* r
1e0c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1e0d0 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e  RR; */.    }.#en
1e0e0 64 69 66 0a 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65  dif.  /* Only ne
1e0f0 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c  ed to sync once,
1e100 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 20 64   so close the  d
1e110 69 72 65 63 74 6f 72 79 20 77 68 65 6e 20 77 65  irectory when we
1e120 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a 23 69 66   are done */.#if
1e130 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43   OSCLOSE_CHECK_C
1e140 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 69  LOSE_IOERR.    i
1e150 66 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e  f( close(pFile->
1e160 64 69 72 66 64 29 3d 3d 30 20 29 7b 0a 20 20 20  dirfd)==0 ){.   
1e170 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20     pFile->dirfd 
1e180 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
1e190 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
1e1a0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1e1b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e1c0 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
1e1d0 53 45 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  SE;.    }.#else.
1e1e0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
1e1f0 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 64  (pFile, pFile->d
1e200 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  irfd, __LINE__);
1e210 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66  .    pFile->dirf
1e220 64 20 3d 20 2d 31 3b 0a 23 65 6e 64 69 66 0a 20  d = -1;.#endif. 
1e230 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1e240 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
1e250 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
1e260 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
1e270 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
1e280 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71   unixTruncate(sq
1e290 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1e2a0 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e  i64 nByte){.  un
1e2b0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1e2c0 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
1e2d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1e2e0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
1e2f0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1e300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1e310 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a  ERR_TRUNCATE );.
1e320 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
1e330 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
1e340 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
1e350 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75  r this file, tru
1e360 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66  ncate the.  ** f
1e370 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ile so that it c
1e380 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e  onsists of an in
1e390 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
1e3a0 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65  chunks (i.e. the
1e3b0 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c  .  ** actual fil
1e3c0 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65  e size after the
1e3d0 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62   operation may b
1e3e0 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
1e3f0 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a  e requested.  **
1e400 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   size)..  */.  i
1e410 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1e420 6b 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  k ){.    nByte =
1e430 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65   ((nByte + pFile
1e440 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70  ->szChunk - 1)/p
1e450 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a  File->szChunk) *
1e460 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b   pFile->szChunk;
1e470 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62  .  }..  rc = rob
1e480 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
1e490 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e  ile->h, (off_t)n
1e4a0 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Byte);.  if( rc 
1e4b0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
1e4c0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1e4d0 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1e4e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1e4f0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1e500 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1e510 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
1e520 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45  lse{.#ifndef NDE
1e530 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  BUG.    /* If we
1e540 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1e550 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1e560 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1e570 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20   opposed to.    
1e580 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1e590 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1e5a0 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1e5b0 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1e5c0 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d  an a.    ** norm
1e5d0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1e5e0 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74  ) and we truncat
1e5f0 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1e600 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a  ro length,.    *
1e610 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65  * that effective
1e620 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1e630 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20  hange counter.  
1e640 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1e650 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65  n.    ** when re
1e660 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61  storing a databa
1e670 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63  se using the bac
1e680 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a  kup API from a z
1e690 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ero-length.    *
1e6a0 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f  * source..    */
1e6b0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
1e6c0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26  inNormalWrite &&
1e6d0 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
1e6e0 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
1e6f0 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20  ntrChng = 1;.   
1e700 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72   }.#endif..    r
1e710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e720 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1e730 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
1e740 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
1e750 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
1e760 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1e770 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
1e780 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
1e790 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
1e7a0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1e7b0 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  f;.  assert( id 
1e7c0 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61  );.  rc = osFsta
1e7d0 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  t(((unixFile*)id
1e7e0 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53  )->h, &buf);.  S
1e7f0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1e800 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1e810 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  !=0 ){.    ((uni
1e820 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
1e830 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1e840 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e850 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1e860 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
1e870 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  .st_size;..  /* 
1e880 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a  When opening a z
1e890 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73  ero-size databas
1e8a0 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65  e, the findInode
1e8b0 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65  Info() procedure
1e8c0 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73  .  ** writes a s
1e8d0 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20  ingle byte into 
1e8e0 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64  that file in ord
1e8f0 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  er to work aroun
1e900 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20  d a bug.  ** in 
1e910 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66  the OS-X msdos f
1e920 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f  ilesystem.  In o
1e930 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72  rder to avoid pr
1e940 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65  oblems with uppe
1e950 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77  r.  ** layers, w
1e960 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74  e need to report
1e970 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20   this file size 
1e980 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f  as zero even tho
1e990 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72  ugh it is.  ** r
1e9a0 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65  eally 1.   Ticke
1e9b0 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20  t #3260..  */.  
1e9c0 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20  if( *pSize==1 ) 
1e9d0 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20  *pSize = 0;...  
1e9e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e9f0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1ea00 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1ea10 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1ea20 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
1ea30 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f   Handler for pro
1ea40 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d  xy-locking file-
1ea50 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20  control verbs.  
1ea60 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e  Defined below in
1ea70 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67   the.** proxying
1ea80 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f   locking divisio
1ea90 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1eaa0 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
1eab0 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  l(sqlite3_file*,
1eac0 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64  int,void*);.#end
1ead0 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  if../* .** This 
1eae0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1eaf0 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
1eb00 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1eb10 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65  ZE_HINT .** file
1eb20 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69  -control operati
1eb30 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
1eb40 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
1eb50 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
1eb60 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
1eb70 20 69 74 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20   it could be.** 
1eb80 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6e 65  that the file ne
1eb90 65 64 73 20 74 6f 20 62 65 20 65 78 74 65 6e 64  eds to be extend
1eba0 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
1ebb0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
1ebc0 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  .** SQLITE_FCNTL
1ebd0 5f 53 49 5a 45 5f 48 49 4e 54 20 6f 70 65 72 61  _SIZE_HINT opera
1ebe0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
1ebf0 66 6f 72 20 55 6e 69 78 2e 0a 2a 2f 0a 73 74 61  for Unix..*/.sta
1ec00 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a  tic int fcntlSiz
1ec10 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a  eHint(unixFile *
1ec20 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74 65  pFile, i64 nByte
1ec30 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ){.  if( pFile->
1ec40 73 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 69  szChunk ){.    i
1ec50 36 34 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20  64 nSize;       
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec70 52 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  Required file si
1ec80 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ze */.    struct
1ec90 20 73 74 61 74 20 62 75 66 3b 20 20 20 20 20 20   stat buf;      
1eca0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
1ecb0 74 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76  to hold return v
1ecc0 61 6c 75 65 73 20 6f 66 20 66 73 74 61 74 28 29  alues of fstat()
1ecd0 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20   */.   .    if( 
1ece0 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  osFstat(pFile->h
1ecf0 2c 20 26 62 75 66 29 20 29 20 72 65 74 75 72 6e  , &buf) ) return
1ed00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1ed10 54 41 54 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20  TAT;..    nSize 
1ed20 3d 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d  = ((nByte+pFile-
1ed30 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46  >szChunk-1) / pF
1ed40 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
1ed50 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
1ed60 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69      if( nSize>(i
1ed70 36 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29  64)buf.st_size )
1ed80 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  {..#if defined(H
1ed90 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1eda0 41 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53  ATE) && HAVE_POS
1edb0 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20  IX_FALLOCATE.   
1edc0 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62     /* The code b
1edd0 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67  elow is handling
1ede0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1edf0 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65  e of osFallocate
1ee00 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  () .      ** cor
1ee10 72 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61  rectly. posix_fa
1ee20 6c 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66  llocate() is def
1ee30 69 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73  ined to "returns
1ee40 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73   zero on success
1ee50 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61  , .      ** or a
1ee60 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f  n error number o
1ee70 6e 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65  n  failure". See
1ee80 20 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72   the manpage for
1ee90 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
1eea0 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20     int err;.    
1eeb0 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72    do{.        er
1eec0 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28  r = osFallocate(
1eed0 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74  pFile->h, buf.st
1eee0 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66  _size, nSize-buf
1eef0 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20  .st_size);.     
1ef00 20 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49   }while( err==EI
1ef10 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28  NTR );.      if(
1ef20 20 65 72 72 20 29 20 72 65 74 75 72 6e 20 53 51   err ) return SQ
1ef30 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
1ef40 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a  ;.#else.      /*
1ef50 20 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20   If the OS does 
1ef60 6e 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66  not have posix_f
1ef70 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65  allocate(), fake
1ef80 20 69 74 2e 20 46 69 72 73 74 20 75 73 65 0a 20   it. First use. 
1ef90 20 20 20 20 20 2a 2a 20 66 74 72 75 6e 63 61 74       ** ftruncat
1efa0 65 28 29 20 74 6f 20 73 65 74 20 74 68 65 20 66  e() to set the f
1efb0 69 6c 65 20 73 69 7a 65 2c 20 74 68 65 6e 20 77  ile size, then w
1efc0 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 62 79  rite a single by
1efd0 74 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  te to.      ** t
1efe0 68 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20  he last byte in 
1eff0 65 61 63 68 20 62 6c 6f 63 6b 20 77 69 74 68 69  each block withi
1f000 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  n the extended r
1f010 65 67 69 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20  egion. This.    
1f020 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
1f030 20 74 65 63 68 6e 69 71 75 65 20 75 73 65 64 20   technique used 
1f040 62 79 20 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c  by glibc to impl
1f050 65 6d 65 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c  ement posix_fall
1f060 6f 63 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a  ocate().      **
1f070 20 6f 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74   on systems that
1f080 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72   do not have a r
1f090 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20  eal fallocate() 
1f0a0 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20  system call..   
1f0b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
1f0c0 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c  nBlk = buf.st_bl
1f0d0 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d  ksize;  /* File-
1f0e0 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a  system block siz
1f0f0 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69  e */.      i64 i
1f100 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
1f110 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f         /* Next o
1f120 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74  ffset to write t
1f130 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  o */..      if( 
1f140 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1f150 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65  (pFile->h, nSize
1f160 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
1f170 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1f180 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
1f190 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1f1a0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1f1b0 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e  TRUNCATE, "ftrun
1f1c0 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  cate", pFile->zP
1f1d0 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
1f1e0 20 20 20 20 69 57 72 69 74 65 20 3d 20 28 28 62      iWrite = ((b
1f1f0 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e  uf.st_size + 2*n
1f200 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e  Blk - 1)/nBlk)*n
1f210 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 77 68 69  Blk-1;.      whi
1f220 6c 65 28 20 69 57 72 69 74 65 3c 6e 53 69 7a 65  le( iWrite<nSize
1f230 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1f240 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64  nWrite = seekAnd
1f250 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72  Write(pFile, iWr
1f260 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20  ite, "", 1);.   
1f270 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21       if( nWrite!
1f280 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
1f290 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1f2a0 20 20 20 20 20 20 20 20 69 57 72 69 74 65 20 2b          iWrite +
1f2b0 3d 20 6e 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a  = nBlk;.      }.
1f2c0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
1f2d0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1f2e0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 28 53 51  E_OK;.}..#if (SQ
1f2f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c  LITE_ENABLE_APPL
1f300 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69  E_SPI>0) && defi
1f310 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
1f320 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
1f330 5f 70 72 69 76 61 74 65 2e 68 22 0a 23 69 6e 63  _private.h".#inc
1f340 6c 75 64 65 20 3c 63 6f 70 79 66 69 6c 65 2e 68  lude <copyfile.h
1f350 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  >.static int get
1f360 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c  DbPathForUnixFil
1f370 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
1f380 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29  e, char *dbPath)
1f390 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ;.#endif.static 
1f3a0 69 6e 74 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69  int isProxyLocki
1f3b0 6e 67 4d 6f 64 65 28 75 6e 69 78 46 69 6c 65 20  ngMode(unixFile 
1f3c0 2a 29 3b 0a 0a 23 69 66 20 28 53 51 4c 49 54 45  *);..#if (SQLITE
1f3d0 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50  _ENABLE_APPLE_SP
1f3e0 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28  I>0) && defined(
1f3f0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 73 74 61 74 69  __APPLE__).stati
1f400 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61  c int unixTrunca
1f410 74 65 44 61 74 61 62 61 73 65 28 75 6e 69 78 46  teDatabase(unixF
1f420 69 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a 73 74  ile *, int);..st
1f430 61 74 69 63 20 69 6e 74 20 75 6e 69 78 49 6e 76  atic int unixInv
1f440 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46 69  alidateSupportFi
1f450 6c 65 73 28 75 6e 69 78 46 69 6c 65 20 2a 2c 20  les(unixFile *, 
1f460 69 6e 74 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e  int);..static in
1f470 74 20 75 6e 69 78 52 65 70 6c 61 63 65 44 61 74  t unixReplaceDat
1f480 61 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  abase(unixFile *
1f490 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 20 2a  pFile, sqlite3 *
1f4a0 73 72 63 64 62 29 20 7b 0a 20 20 73 71 6c 69 74  srcdb) {.  sqlit
1f4b0 65 33 5f 66 69 6c 65 20 2a 69 64 20 3d 20 28 73  e3_file *id = (s
1f4c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 46  qlite3_file *)pF
1f4d0 69 6c 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 53  ile;.  Btree *pS
1f4e0 72 63 42 74 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a  rcBtree = NULL;.
1f4f0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1f500 73 72 63 5f 66 69 6c 65 20 3d 20 4e 55 4c 4c 3b  src_file = NULL;
1f510 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 53 72  .  unixFile *pSr
1f520 63 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  cFile = NULL;.  
1f530 63 68 61 72 20 73 72 63 57 61 6c 50 61 74 68 5b  char srcWalPath[
1f540 4d 41 58 50 41 54 48 4c 45 4e 2b 35 5d 3b 0a 20  MAXPATHLEN+5];. 
1f550 20 69 6e 74 20 73 72 63 57 61 6c 46 44 20 3d 20   int srcWalFD = 
1f560 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  -1;.  int rc = S
1f570 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69 64  QLITE_OK;.  void
1f580 20 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a   *pLock = NULL;.
1f590 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b    int flags = 0;
1f5a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 73 72 63 64  .  sqlite3 *srcd
1f5b0 62 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 6f 70  b2 = NULL;.  cop
1f5c0 79 66 69 6c 65 5f 73 74 61 74 65 5f 74 20 73 3b  yfile_state_t s;
1f5d0 0a 20 20 69 6e 74 20 63 6f 72 72 75 70 74 53 72  .  int corruptSr
1f5e0 63 46 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20  cFileLock = 0;. 
1f5f0 20 69 6e 74 20 63 6f 72 72 75 70 74 44 73 74 46   int corruptDstF
1f600 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69  ileLock = 0;.  i
1f610 6e 74 20 69 73 53 72 63 43 6f 72 72 75 70 74 20  nt isSrcCorrupt 
1f620 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 44 73 74  = 0;.  int isDst
1f630 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 0a  Corrupt = 0;.  .
1f640 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1f650 66 65 74 79 43 68 65 63 6b 4f 6b 28 73 72 63 64  fetyCheckOk(srcd
1f660 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
1f670 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
1f680 20 20 7d 0a 20 20 20 20 0a 23 69 66 20 53 51 4c    }.    .#if SQL
1f690 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
1f6a0 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 66 6c 61  PROTECTION.  fla
1f6b0 67 73 20 7c 3d 20 70 46 69 6c 65 2d 3e 70 72 6f  gs |= pFile->pro
1f6c0 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23  tFlags;.#endif.#
1f6d0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1f6e0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
1f6f0 20 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b   if( isProxyLock
1f700 69 6e 67 4d 6f 64 65 28 70 46 69 6c 65 29 20 29  ingMode(pFile) )
1f710 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  {.    flags |= S
1f720 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
1f730 52 4f 58 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ROXY;.  }.#endif
1f740 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .  .  rc = sqlit
1f750 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b  e3demo_superlock
1f760 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 30  (pFile->zPath, 0
1f770 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 26  , flags, 0, 0, &
1f780 70 4c 6f 63 6b 29 3b 0a 20 20 69 66 28 20 72 63  pLock);.  if( rc
1f790 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
1f7a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c  SQLITE_CORRUPT |
1f7b0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  | rc==SQLITE_NOT
1f7c0 41 44 42 20 29 7b 0a 20 20 20 20 20 20 69 73 44  ADB ){.      isD
1f7d0 73 74 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20  stCorrupt = 1;. 
1f7e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f7f0 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f  3demo_superlock_
1f800 63 6f 72 72 75 70 74 28 69 64 2c 20 53 51 4c 49  corrupt(id, SQLI
1f810 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56  TE_LOCK_EXCLUSIV
1f820 45 2c 20 26 63 6f 72 72 75 70 74 44 73 74 46 69  E, &corruptDstFi
1f830 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20  leLock);.    }. 
1f840 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1f850 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f860 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 67 65 74    }.  }.  /* get
1f870 20 74 68 65 20 73 72 63 20 66 69 6c 65 20 64 65   the src file de
1f880 73 63 72 69 70 74 6f 72 20 61 64 68 65 72 69 6e  scriptor adherin
1f890 67 20 74 6f 20 74 68 65 20 64 62 20 73 74 72 75  g to the db stru
1f8a0 63 74 20 61 63 63 65 73 73 20 72 75 6c 65 73 20  ct access rules 
1f8b0 0a 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65  .   ** this code
1f8c0 20 69 73 20 6d 6f 64 65 6c 65 64 20 61 66 74 65   is modeled afte
1f8d0 72 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  r sqlite3_file_c
1f8e0 6f 6e 74 72 6f 6c 28 29 20 69 6e 20 6d 61 69 6e  ontrol() in main
1f8f0 2e 63 0a 20 20 20 2a 2f 20 0a 20 20 73 71 6c 69  .c.   */ .  sqli
1f900 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1f910 73 72 63 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  srcdb->mutex);. 
1f920 20 69 66 28 20 73 72 63 64 62 2d 3e 6e 44 62 3e   if( srcdb->nDb>
1f930 30 20 29 7b 0a 20 20 20 20 70 53 72 63 42 74 72  0 ){.    pSrcBtr
1f940 65 65 20 3d 20 73 72 63 64 62 2d 3e 61 44 62 5b  ee = srcdb->aDb[
1f950 30 5d 2e 70 42 74 3b 0a 20 20 7d 0a 20 20 69 66  0].pBt;.  }.  if
1f960 28 20 70 53 72 63 42 74 72 65 65 20 29 7b 0a 20  ( pSrcBtree ){. 
1f970 20 20 20 50 61 67 65 72 20 2a 70 53 72 63 50 61     Pager *pSrcPa
1f980 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
1f990 42 74 72 65 65 45 6e 74 65 72 28 70 53 72 63 42  BtreeEnter(pSrcB
1f9a0 74 72 65 65 29 3b 0a 20 20 20 20 70 53 72 63 50  tree);.    pSrcP
1f9b0 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
1f9c0 72 65 65 50 61 67 65 72 28 70 53 72 63 42 74 72  reePager(pSrcBtr
1f9d0 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ee);.    assert(
1f9e0 20 70 53 72 63 50 61 67 65 72 21 3d 30 20 29 3b   pSrcPager!=0 );
1f9f0 0a 20 20 20 20 73 72 63 5f 66 69 6c 65 20 3d 20  .    src_file = 
1fa00 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1fa10 28 70 53 72 63 50 61 67 65 72 29 3b 0a 20 20 20  (pSrcPager);.   
1fa20 20 61 73 73 65 72 74 28 20 73 72 63 5f 66 69 6c   assert( src_fil
1fa30 65 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e!=0 );.    if( 
1fa40 73 72 63 5f 66 69 6c 65 2d 3e 70 4d 65 74 68 6f  src_file->pMetho
1fa50 64 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ds ){.      int 
1fa60 73 72 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  srcFlags = 0;.  
1fa70 20 20 20 20 70 53 72 63 46 69 6c 65 20 3d 20 28      pSrcFile = (
1fa80 75 6e 69 78 46 69 6c 65 20 2a 29 73 72 63 5f 66  unixFile *)src_f
1fa90 69 6c 65 3b 0a 20 20 20 20 20 20 2f 2a 20 77 61  ile;.      /* wa
1faa0 6c 20 6d 6f 64 65 20 64 62 20 63 61 6e 6e 6f 74  l mode db cannot
1fab0 20 62 65 20 6f 70 65 6e 65 64 20 72 65 61 64 6f   be opened reado
1fac0 6e 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 20  nly */.      if 
1fad0 28 28 70 53 72 63 46 69 6c 65 2d 3e 6f 70 65 6e  ((pSrcFile->open
1fae0 46 6c 61 67 73 20 26 20 4f 5f 52 44 57 52 29 20  Flags & O_RDWR) 
1faf0 3d 3d 20 4f 5f 52 44 57 52 29 20 7b 0a 20 20 20  == O_RDWR) {.   
1fb00 20 20 20 20 20 73 72 63 46 6c 61 67 73 20 3d 20       srcFlags = 
1fb10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1fb20 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 20 65  WRITE;.      } e
1fb30 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 72  lse {.        sr
1fb40 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
1fb50 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
1fb60 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54       }.#if SQLIT
1fb70 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
1fb80 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 73  OTECTION.      s
1fb90 72 63 46 6c 61 67 73 20 7c 3d 20 70 53 72 63 46  rcFlags |= pSrcF
1fba0 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b 0a  ile->protFlags;.
1fbb0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1fbc0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1fbd0 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28  _STYLE.      if(
1fbe0 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d   isProxyLockingM
1fbf0 6f 64 65 28 70 53 72 63 46 69 6c 65 29 20 29 7b  ode(pSrcFile) ){
1fc00 0a 20 20 20 20 20 20 20 20 73 72 63 46 6c 61 67  .        srcFlag
1fc10 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
1fc20 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20 20 20 20  _AUTOPROXY;.    
1fc30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1fc40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
1fc50 65 6e 5f 76 32 28 70 53 72 63 46 69 6c 65 2d 3e  en_v2(pSrcFile->
1fc60 7a 50 61 74 68 2c 20 26 73 72 63 64 62 32 2c 20  zPath, &srcdb2, 
1fc70 73 72 63 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  srcFlags, 0);.  
1fc80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fc90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fca0 20 2f 2a 20 73 74 61 72 74 20 61 20 64 65 66 65   /* start a defe
1fcb0 72 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  rred transaction
1fcc0 20 61 6e 64 20 72 65 61 64 20 74 6f 20 65 73 74   and read to est
1fcd0 61 62 6c 69 73 68 20 61 20 72 65 61 64 20 6c 6f  ablish a read lo
1fce0 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  ck */.        rc
1fcf0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1fd00 73 72 63 64 62 32 2c 20 22 42 45 47 49 4e 20 44  srcdb2, "BEGIN D
1fd10 45 46 45 52 52 45 44 3b 20 50 52 41 47 4d 41 20  EFERRED; PRAGMA 
1fd20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22 2c  schema_version",
1fd30 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
1fd40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1fd50 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d  E_CORRUPT || rc=
1fd60 3d 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29  =SQLITE_NOTADB )
1fd70 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 53 72  {.          isSr
1fd80 63 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20 20  cCorrupt = 1;.  
1fd90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1fda0 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f  ite3demo_superlo
1fdb0 63 6b 5f 63 6f 72 72 75 70 74 28 73 72 63 5f 66  ck_corrupt(src_f
1fdc0 69 6c 65 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ile, SQLITE_LOCK
1fdd0 5f 53 48 41 52 45 44 2c 20 26 63 6f 72 72 75 70  _SHARED, &corrup
1fde0 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  tSrcFileLock);. 
1fdf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1fe00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1fe10 20 21 73 72 63 64 62 32 20 7c 7c 20 70 53 72 63   !srcdb2 || pSrc
1fe20 46 69 6c 65 3d 3d 4e 55 4c 4c 20 7c 7c 20 70 53  File==NULL || pS
1fe30 72 63 46 69 6c 65 2d 3e 68 3c 30 29 7b 0a 20 20  rcFile->h<0){.  
1fe40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e    rc = SQLITE_IN
1fe50 54 45 52 4e 41 4c 3b 0a 20 20 7d 0a 20 20 69 66  TERNAL;.  }.  if
1fe60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fe70 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1fe80 72 65 70 6c 61 63 65 5f 64 61 74 61 62 61 73 65  replace_database
1fe90 3b 0a 20 20 7d 0a 20 20 2f 2a 20 62 6f 74 68 20  ;.  }.  /* both 
1fea0 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6c 6f  databases are lo
1feb0 63 6b 65 64 20 61 70 70 72 6f 70 72 69 61 74 65  cked appropriate
1fec0 6c 79 2c 20 63 6f 70 79 20 74 68 65 20 73 72 63  ly, copy the src
1fed0 20 77 61 6c 20 6a 6f 75 72 6e 61 6c 20 69 66 20   wal journal if 
1fee0 0a 20 20 20 2a 2a 20 6f 6e 65 20 65 78 69 73 74  .   ** one exist
1fef0 73 20 61 6e 64 20 74 68 65 6e 20 74 68 65 20 61  s and then the a
1ff00 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
1ff10 69 6c 65 0a 20 20 20 2a 2f 0a 20 20 73 74 72 6c  ile.   */.  strl
1ff20 63 70 79 28 73 72 63 57 61 6c 50 61 74 68 2c 20  cpy(srcWalPath, 
1ff30 70 53 72 63 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  pSrcFile->zPath,
1ff40 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a   MAXPATHLEN+5);.
1ff50 20 20 73 74 72 6c 63 61 74 28 73 72 63 57 61 6c    strlcat(srcWal
1ff60 50 61 74 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41  Path, "-wal", MA
1ff70 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 73  XPATHLEN+5);.  s
1ff80 72 63 57 61 6c 46 44 20 3d 20 6f 70 65 6e 28 73  rcWalFD = open(s
1ff90 72 63 57 61 6c 50 61 74 68 2c 20 4f 5f 52 44 4f  rcWalPath, O_RDO
1ffa0 4e 4c 59 29 3b 0a 20 20 69 66 28 20 21 28 73 72  NLY);.  if( !(sr
1ffb0 63 57 61 6c 46 44 3c 30 29 20 29 7b 0a 20 20 20  cWalFD<0) ){.   
1ffc0 20 63 68 61 72 20 64 73 74 57 61 6c 50 61 74 68   char dstWalPath
1ffd0 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 35 5d 3b 0a  [MAXPATHLEN+5];.
1ffe0 20 20 20 20 69 6e 74 20 64 73 74 57 61 6c 46 44      int dstWalFD
1fff0 20 3d 20 2d 31 3b 0a 20 20 20 20 73 74 72 6c 63   = -1;.    strlc
20000 70 79 28 64 73 74 57 61 6c 50 61 74 68 2c 20 70  py(dstWalPath, p
20010 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58  File->zPath, MAX
20020 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 20 20  PATHLEN+5);.    
20030 73 74 72 6c 63 61 74 28 64 73 74 57 61 6c 50 61  strlcat(dstWalPa
20040 74 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50  th, "-wal", MAXP
20050 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 20 20 64  ATHLEN+5);.    d
20060 73 74 57 61 6c 46 44 20 3d 20 6f 70 65 6e 28 64  stWalFD = open(d
20070 73 74 57 61 6c 50 61 74 68 2c 20 4f 5f 52 44 57  stWalPath, O_RDW
20080 52 7c 4f 5f 43 52 45 41 54 2c 20 53 51 4c 49 54  R|O_CREAT, SQLIT
20090 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
200a0 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
200b0 20 69 66 28 20 21 28 64 73 74 57 61 6c 46 44 3c   if( !(dstWalFD<
200c0 30 29 20 29 7b 0a 20 20 20 20 20 20 73 20 3d 20  0) ){.      s = 
200d0 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 61  copyfile_state_a
200e0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 6c 73  lloc();.      ls
200f0 65 65 6b 28 73 72 63 57 61 6c 46 44 2c 20 30 2c  eek(srcWalFD, 0,
20100 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
20110 20 20 6c 73 65 65 6b 28 64 73 74 57 61 6c 46 44    lseek(dstWalFD
20120 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  , 0, SEEK_SET);.
20130 20 20 20 20 20 20 69 66 28 20 66 63 6f 70 79 66        if( fcopyf
20140 69 6c 65 28 73 72 63 57 61 6c 46 44 2c 20 64 73  ile(srcWalFD, ds
20150 74 57 61 6c 46 44 2c 20 73 2c 20 43 4f 50 59 46  tWalFD, s, COPYF
20160 49 4c 45 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  ILE_ALL) ){.    
20170 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e      int err=errn
20180 6f 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  o;.        switc
20190 68 28 65 72 72 29 20 7b 0a 20 20 20 20 20 20 20  h(err) {.       
201a0 20 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a     case ENOMEM:.
201b0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
201c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
201d0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
201e0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61  ;.          defa
201f0 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ult:.           
20200 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
20210 6f 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 20  o = err;.       
20220 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20230 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
20240 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
20250 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66  copyfile_state_f
20260 72 65 65 28 73 29 3b 0a 20 20 20 20 20 20 63 6c  ree(s);.      cl
20270 6f 73 65 28 64 73 74 57 61 6c 46 44 29 3b 0a 20  ose(dstWalFD);. 
20280 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28 73     }.    close(s
20290 72 63 57 61 6c 46 44 29 3b 0a 20 20 7d 0a 20 20  rcWalFD);.  }.  
202a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
202b0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 62 65 66 6f  K ){.    /* befo
202c0 72 65 20 77 65 20 63 6f 70 79 2c 20 65 6e 73 75  re we copy, ensu
202d0 72 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  re that the file
202e0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
202f0 77 69 6c 6c 20 62 65 20 6d 6f 64 69 66 69 65 64  will be modified
20300 20 2a 2f 0a 20 20 20 20 75 69 6e 74 33 32 5f 74   */.    uint32_t
20310 20 73 72 63 43 68 61 6e 67 65 20 3d 20 30 3b 0a   srcChange = 0;.
20320 20 20 20 20 75 69 6e 74 33 32 5f 74 20 64 73 74      uint32_t dst
20330 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
20340 70 72 65 61 64 28 70 53 72 63 46 69 6c 65 2d 3e  pread(pSrcFile->
20350 68 2c 20 26 73 72 63 43 68 61 6e 67 65 2c 20 34  h, &srcChange, 4
20360 2c 20 32 34 29 3b 0a 20 20 20 20 70 72 65 61 64  , 24);.    pread
20370 28 70 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43  (pFile->h, &dstC
20380 68 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20  hange, 4, 24);. 
20390 20 20 20 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20     .    /* copy 
203a0 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
203b0 61 73 65 20 2a 2f 0a 20 20 20 20 73 20 3d 20 63  ase */.    s = c
203c0 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c  opyfile_state_al
203d0 6c 6f 63 28 29 3b 0a 20 20 20 20 6c 73 65 65 6b  loc();.    lseek
203e0 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 30 2c  (pSrcFile->h, 0,
203f0 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
20400 6c 73 65 65 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  lseek(pFile->h, 
20410 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  0, SEEK_SET);.  
20420 20 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28    if( fcopyfile(
20430 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 70 46 69  pSrcFile->h, pFi
20440 6c 65 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46 49  le->h, s, COPYFI
20450 4c 45 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  LE_ALL) ){.     
20460 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a   int err=errno;.
20470 20 20 20 20 20 20 73 77 69 74 63 68 28 65 72 72        switch(err
20480 29 20 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ) {.        case
20490 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20 20   ENOMEM:.       
204a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
204b0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
204c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64  break;.        d
204d0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
204e0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
204f0 6e 6f 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20  no = err;.      
20500 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20510 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20  IOERR;.      }. 
20520 20 20 20 7d 0a 20 20 20 20 63 6f 70 79 66 69 6c     }.    copyfil
20530 65 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b  e_state_free(s);
20540 0a 20 20 20 20 0a 20 20 20 20 69 66 20 28 73 72  .    .    if (sr
20550 63 43 68 61 6e 67 65 20 3d 3d 20 64 73 74 43 68  cChange == dstCh
20560 61 6e 67 65 29 20 7b 0a 20 20 20 20 20 20 2f 2a  ange) {.      /*
20570 20 6d 6f 64 69 66 79 20 74 68 65 20 63 68 61 6e   modify the chan
20580 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 66 6f  ge counter to fo
20590 72 63 65 20 70 61 67 65 20 7a 65 72 6f 20 74 6f  rce page zero to
205a0 20 62 65 20 72 65 6c 6f 61 64 65 64 20 2a 2f 0a   be reloaded */.
205b0 20 20 20 20 20 20 64 73 74 43 68 61 6e 67 65 20        dstChange 
205c0 2b 2b 3b 0a 20 20 20 20 20 20 70 77 72 69 74 65  ++;.      pwrite
205d0 28 70 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43  (pFile->h, &dstC
205e0 68 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20  hange, 4, 24);. 
205f0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
20600 73 53 72 63 43 6f 72 72 75 70 74 20 29 7b 0a 20  sSrcCorrupt ){. 
20610 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73     sqlite3demo_s
20620 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75  uperunlock_corru
20630 70 74 28 73 72 63 5f 66 69 6c 65 2c 20 63 6f 72  pt(src_file, cor
20640 72 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29  ruptSrcFileLock)
20650 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
20660 2a 20 64 6f 6e 65 20 77 69 74 68 20 74 68 65 20  * done with the 
20670 73 6f 75 72 63 65 20 64 62 20 73 6f 20 65 6e 64  source db so end
20680 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20690 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
206a0 65 78 65 63 28 73 72 63 64 62 32 2c 20 22 43 4f  exec(srcdb2, "CO
206b0 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b  MMIT", 0, 0, 0);
206c0 0a 20 20 7d 0a 20 20 2f 2a 20 7a 65 72 6f 20 6f  .  }.  /* zero o
206d0 75 74 20 61 6e 79 20 6f 6c 64 20 6a 6f 75 72 6e  ut any old journ
206e0 61 6c 20 63 6c 75 74 74 65 72 20 2a 2f 0a 20 20  al clutter */.  
206f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20700 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 6b 69  K ){.    int ski
20710 70 57 41 4c 20 3d 20 28 73 72 63 57 61 6c 46 44  pWAL = (srcWalFD
20720 3c 30 29 3f 30 3a 31 3b 0a 20 20 20 20 75 6e 69  <0)?0:1;.    uni
20730 78 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f  xInvalidateSuppo
20740 72 74 46 69 6c 65 73 28 70 46 69 6c 65 2c 20 73  rtFiles(pFile, s
20750 6b 69 70 57 41 4c 29 3b 0a 20 20 7d 0a 20 20 0a  kipWAL);.  }.  .
20760 65 6e 64 5f 72 65 70 6c 61 63 65 5f 64 61 74 61  end_replace_data
20770 62 61 73 65 3a 0a 20 20 69 66 28 20 70 53 72 63  base:.  if( pSrc
20780 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  Btree ){.    sql
20790 69 74 65 33 5f 63 6c 6f 73 65 28 73 72 63 64 62  ite3_close(srcdb
207a0 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  2);.    sqlite3B
207b0 74 72 65 65 4c 65 61 76 65 28 70 53 72 63 42 74  treeLeave(pSrcBt
207c0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ree);.  }.  sqli
207d0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
207e0 73 72 63 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  srcdb->mutex);. 
207f0 20 69 66 28 20 69 73 44 73 74 43 6f 72 72 75 70   if( isDstCorrup
20800 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
20810 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b  demo_superunlock
20820 5f 63 6f 72 72 75 70 74 28 69 64 2c 20 63 6f 72  _corrupt(id, cor
20830 72 75 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29  ruptDstFileLock)
20840 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
20850 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
20860 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20  unlock(pLock);. 
20870 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20880 7d 0a 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54  }..#define SQLIT
20890 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45  E_FILE_HEADER_LE
208a0 4e 20 31 36 0a 23 69 6e 63 6c 75 64 65 20 22 62  N 16.#include "b
208b0 74 72 65 65 49 6e 74 2e 68 22 0a 2f 2a 20 43 68  treeInt.h"./* Ch
208c0 65 63 6b 20 66 6f 72 20 61 20 63 6f 6e 66 6c 69  eck for a confli
208d0 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 49 66 20  cting lock.  If 
208e0 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 70 72  one is found, pr
208f0 69 6e 74 20 61 6e 20 74 68 69 73 0a 20 2a 2a 20  int an this. ** 
20900 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70  on standard outp
20910 75 74 20 75 73 69 6e 67 20 74 68 65 20 66 6f 72  ut using the for
20920 6d 61 74 20 73 74 72 69 6e 67 20 67 69 76 65 6e  mat string given
20930 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 20   and return 1.. 
20940 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
20950 6e 6f 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c  no conflicting l
20960 6f 63 6b 73 2c 20 72 65 74 75 72 6e 20 30 2e 0a  ocks, return 0..
20970 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75   */.static int u
20980 6e 69 78 49 73 4c 6f 63 6b 65 64 28 0a 20 20 70  nixIsLocked(.  p
20990 69 64 5f 74 20 70 69 64 2c 20 20 20 20 20 20 20  id_t pid,       
209a0 20 20 20 20 20 2f 2a 20 50 49 44 20 74 6f 20 74       /* PID to t
209b0 65 73 74 20 66 6f 72 20 6c 6f 63 6b 20 6f 77 6e  est for lock own
209c0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20  er */.  int h,  
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
209e0 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
209f0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
20a00 6e 74 20 74 79 70 65 2c 20 20 20 20 20 20 20 20  nt type,        
20a10 20 20 20 20 20 2f 2a 20 46 5f 52 44 4c 43 4b 20       /* F_RDLCK 
20a20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  or F_WRLCK */.  
20a30 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4f 66  unsigned int iOf
20a40 73 74 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 62  st,   /* First b
20a50 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  yte of the lock 
20a60 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
20a70 74 20 69 43 6e 74 2c 20 20 20 20 2f 2a 20 4e 75  t iCnt,    /* Nu
20a80 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
20a90 20 74 68 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20   the lock range 
20aa0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
20ab0 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 54 79  *zType     /* Ty
20ac0 70 65 20 6f 66 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  pe of lock */.){
20ad0 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
20ae0 6c 6b 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20  lk;.  int err;. 
20af0 20 0a 20 20 6d 65 6d 73 65 74 28 26 6c 6b 2c 20   .  memset(&lk, 
20b00 30 2c 20 73 69 7a 65 6f 66 28 6c 6b 29 29 3b 0a  0, sizeof(lk));.
20b10 20 20 6c 6b 2e 6c 5f 74 79 70 65 20 3d 20 74 79    lk.l_type = ty
20b20 70 65 3b 0a 20 20 6c 6b 2e 6c 5f 77 68 65 6e 63  pe;.  lk.l_whenc
20b30 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
20b40 6c 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 69 4f 66  lk.l_start = iOf
20b50 73 74 3b 0a 20 20 6c 6b 2e 6c 5f 6c 65 6e 20 3d  st;.  lk.l_len =
20b60 20 69 43 6e 74 3b 0a 20 20 0a 20 20 69 66 28 20   iCnt;.  .  if( 
20b70 70 69 64 21 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b  pid!=SQLITE_LOCK
20b80 53 54 41 54 45 5f 41 4e 59 50 49 44 20 29 7b 0a  STATE_ANYPID ){.
20b90 23 69 66 6e 64 65 66 20 46 5f 47 45 54 4c 4b 50  #ifndef F_GETLKP
20ba0 49 44 0a 23 20 77 61 72 6e 69 6e 67 20 46 5f 47  ID.# warning F_G
20bb0 45 54 4c 4b 50 49 44 20 75 6e 64 65 66 69 6e 65  ETLKPID undefine
20bc0 64 2c 20 5f 73 71 6c 69 74 65 33 5f 6c 6f 63 6b  d, _sqlite3_lock
20bd0 73 74 61 74 65 20 66 61 6c 6c 69 6e 67 20 62 61  state falling ba
20be0 63 6b 20 74 6f 20 46 5f 47 45 54 4c 4b 0a 20 20  ck to F_GETLK.  
20bf0 20 20 65 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c    err = fcntl(h,
20c00 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a   F_GETLK, &lk);.
20c10 23 65 6c 73 65 0a 20 20 20 20 6c 6b 2e 6c 5f 70  #else.    lk.l_p
20c20 69 64 20 3d 20 70 69 64 3b 0a 20 20 20 20 65 72  id = pid;.    er
20c30 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47  r = fcntl(h, F_G
20c40 45 54 4c 4b 50 49 44 2c 20 26 6c 6b 29 3b 0a 23  ETLKPID, &lk);.#
20c50 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
20c60 20 20 20 65 72 72 20 3d 20 66 63 6e 74 6c 28 68     err = fcntl(h
20c70 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b  , F_GETLK, &lk);
20c80 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 65 72  .  }.  .  if( er
20c90 72 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 66  r==(-1) ){.    f
20ca0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
20cb0 66 63 6e 74 6c 28 25 64 29 20 66 61 69 6c 65 64  fcntl(%d) failed
20cc0 3a 20 65 72 72 6e 6f 3d 25 64 5c 6e 22 2c 20 68  : errno=%d\n", h
20cd0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65  , errno);.    re
20ce0 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 0a  turn -1;.  }.  .
20cf0 20 20 69 66 28 20 6c 6b 2e 6c 5f 74 79 70 65 21    if( lk.l_type!
20d00 3d 46 5f 55 4e 4c 43 4b 20 26 26 20 28 70 69 64  =F_UNLCK && (pid
20d10 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41  ==SQLITE_LOCKSTA
20d20 54 45 5f 41 4e 59 50 49 44 20 7c 7c 20 6c 6b 2e  TE_ANYPID || lk.
20d30 6c 5f 70 69 64 3d 3d 70 69 64 29 20 29 7b 0a 23  l_pid==pid) ){.#
20d40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
20d50 55 47 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  UG.    fprintf(s
20d60 74 64 65 72 72 2c 20 22 25 73 20 6c 6f 63 6b 20  tderr, "%s lock 
20d70 68 65 6c 64 20 62 79 20 25 64 5c 6e 22 2c 20 7a  held by %d\n", z
20d80 54 79 70 65 2c 20 28 69 6e 74 29 6c 6b 2e 6c 5f  Type, (int)lk.l_
20d90 70 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pid);.#endif.   
20da0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20 0a   return 1;.  } .
20db0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73    return 0;.}..s
20dc0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
20dd0 63 6b 73 74 61 74 65 50 69 64 28 75 6e 69 78 46  ckstatePid(unixF
20de0 69 6c 65 20 2a 2c 20 70 69 64 5f 74 2c 20 69 6e  ile *, pid_t, in
20df0 74 20 2a 29 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  t *);..#endif /*
20e00 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   (SQLITE_ENABLE_
20e10 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20  APPLE_SPI>0) && 
20e20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
20e30 5f 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  _) */.          
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 20 20 20 20 20 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f       ./*.** Info
20e60 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74  rmation and cont
20e70 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66  rol of an open f
20e80 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
20e90 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
20ea0 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
20eb0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
20ec0 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
20ed0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
20ee0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
20ef0 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  id;.  switch( op
20f00 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
20f10 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
20f20 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  ATE: {.      *(i
20f30 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
20f40 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  ->eFileLock;.   
20f50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20f60 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
20f70 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
20f80 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
20f90 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
20fa0 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
20fb0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
20fc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
20fd0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
20fe0 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  TE_FCNTL_CHUNK_S
20ff0 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69  IZE: {.      pFi
21000 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28  le->szChunk = *(
21010 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  int *)pArg;.    
21020 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21030 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
21040 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
21050 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
21060 20 20 20 72 65 74 75 72 6e 20 66 63 6e 74 6c 53     return fcntlS
21070 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a  izeHint(pFile, *
21080 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20  (i64 *)pArg);.  
21090 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
210a0 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
210b0 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 69  T_WAL: {.      i
210c0 6e 74 20 62 50 65 72 73 69 73 74 20 3d 20 2a 28  nt bPersist = *(
210d0 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  int*)pArg;.     
210e0 20 69 66 28 20 62 50 65 72 73 69 73 74 3c 30 20   if( bPersist<0 
210f0 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 69 6e 74  ){.        *(int
21100 2a 29 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d  *)pArg = (pFile-
21110 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
21120 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  XFILE_PERSIST_WA
21130 4c 29 21 3d 30 3b 0a 20 20 20 20 20 20 7d 65 6c  L)!=0;.      }el
21140 73 65 20 69 66 28 20 62 50 65 72 73 69 73 74 3d  se if( bPersist=
21150 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
21160 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
21170 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 50 45 52 53  = ~UNIXFILE_PERS
21180 49 53 54 5f 57 41 4c 3b 0a 20 20 20 20 20 20 7d  IST_WAL;.      }
21190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
211a0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
211b0 3d 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49  = UNIXFILE_PERSI
211c0 53 54 5f 57 41 4c 3b 0a 20 20 20 20 20 20 7d 0a  ST_WAL;.      }.
211d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
211e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69  ITE_OK;.    }.#i
211f0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
21200 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
21210 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20  lls this method 
21220 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69  to signal that i
21230 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a  t has done.    *
21240 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  * a rollback and
21250 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
21260 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  se is therefore 
21270 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20  unchanged and.  
21280 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74    ** it hence it
21290 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74   is OK for the t
212a0 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67  ransaction chang
212b0 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a  e counter to be.
212c0 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64      ** unchanged
212d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
212e0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  e SQLITE_FCNTL_D
212f0 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20  B_UNCHANGED: {. 
21300 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
21310 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d  )id)->dbUpdate =
21320 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
21330 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
21340 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  }.#endif.#if SQL
21350 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
21360 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
21370 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
21380 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
21390 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_SET_LOCKPRO
213a0 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65  XYFILE:.    case
213b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45   SQLITE_FCNTL_GE
213c0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
213d0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
213e0 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
213f0 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20  (id,op,pArg);.  
21400 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
21410 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
21420 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
21430 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
21440 2a 2f 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45  */.#if (SQLITE_E
21450 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e  NABLE_APPLE_SPI>
21460 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  0) && defined(__
21470 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73  APPLE__).    cas
21480 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
21490 52 55 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45  RUNCATE_DATABASE
214a0 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
214b0 20 75 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74   unixTruncateDat
214c0 61 62 61 73 65 28 70 46 69 6c 65 2c 20 28 70 41  abase(pFile, (pA
214d0 72 67 20 3f 20 28 2a 28 69 6e 74 20 2a 29 70 41  rg ? (*(int *)pA
214e0 72 67 29 20 3a 20 30 29 29 3b 0a 20 20 20 20 7d  rg) : 0));.    }
214f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
21500 5f 46 43 4e 54 4c 5f 52 45 50 4c 41 43 45 5f 44  _FCNTL_REPLACE_D
21510 41 54 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20  ATABASE: {.     
21520 20 72 65 74 75 72 6e 20 75 6e 69 78 52 65 70 6c   return unixRepl
21530 61 63 65 44 61 74 61 62 61 73 65 28 70 46 69 6c  aceDatabase(pFil
21540 65 2c 20 28 73 71 6c 69 74 65 33 20 2a 29 70 41  e, (sqlite3 *)pA
21550 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  rg);.    }.    c
21560 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
21570 5f 4c 4f 43 4b 53 54 41 54 45 5f 50 49 44 3a 20  _LOCKSTATE_PID: 
21580 7b 0a 20 20 20 20 20 20 4c 6f 63 6b 73 74 61 74  {.      Lockstat
21590 65 50 49 44 20 2a 70 4c 6f 63 6b 73 74 61 74 65  ePID *pLockstate
215a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  ;.      int rc;.
215b0 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
215c0 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 29 7b 0a 20   pArg==NULL ){. 
215d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
215e0 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20  LITE_MISUSE;.   
215f0 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 63 6b     }.      pLock
21600 73 74 61 74 65 20 3d 20 28 4c 6f 63 6b 73 74 61  state = (Locksta
21610 74 65 50 49 44 20 2a 29 70 41 72 67 3b 0a 20 20  tePID *)pArg;.  
21620 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63      rc = unixLoc
21630 6b 73 74 61 74 65 50 69 64 28 70 46 69 6c 65 2c  kstatePid(pFile,
21640 20 70 4c 6f 63 6b 73 74 61 74 65 2d 3e 70 69 64   pLockstate->pid
21650 2c 20 26 28 70 4c 6f 63 6b 73 74 61 74 65 2d 3e  , &(pLockstate->
21660 73 74 61 74 65 29 29 3b 0a 20 20 20 20 20 20 72  state));.      r
21670 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
21680 23 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49 54  #endif /* (SQLIT
21690 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53  E_ENABLE_APPLE_S
216a0 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64  PI>0) && defined
216b0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20  (__APPLE__) */. 
216c0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
216d0 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45  CNTL_SYNC_OMITTE
216e0 44 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  D: {.      retur
216f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
21700 20 41 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20   A no-op */.    
21710 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
21720 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
21730 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21740 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
21750 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
21760 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
21770 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
21780 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
21790 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
217a0 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
217b0 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
217c0 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
217d0 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
217e0 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
217f0 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
21800 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
21810 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
21820 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
21830 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
21840 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
21850 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
21860 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
21870 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
21880 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
21890 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
218a0 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
218b0 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
218c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
218d0 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  ixSectorSize(sql
218e0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
218f0 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
21900 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
21910 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21920 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
21930 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _SIZE;.}../*.** 
21940 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63  Return the devic
21950 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
21960 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 20  s for the file. 
21970 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 30  This is always 0
21980 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74   for unix..*/.st
21990 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76  atic int unixDev
219a0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
219b0 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
219c0 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
219d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
219e0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
219f0 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   0;.}..#ifndef S
21a00 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
21a10 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73  ./*.** Object us
21a20 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
21a30 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  an shared memory
21a40 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a   buffer.  .**.**
21a50 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74   When multiple t
21a60 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72  hreads all refer
21a70 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20 77 61  ence the same wa
21a80 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68  l-index, each th
21a90 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20  read.** has its 
21aa0 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  own unixShm obje
21ab0 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c  ct, but they all
21ac0 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
21ad0 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f  le instance.** o
21ae0 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f  f this unixShmNo
21af0 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f  de object.  In o
21b00 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68  ther words, each
21b10 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70   wal-index is op
21b20 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63  ened.** only onc
21b30 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a  e per process..*
21b40 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68  *.** Each unixSh
21b50 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
21b60 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73  connected to a s
21b70 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49  ingle unixInodeI
21b80 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57  nfo object..** W
21b90 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65  e could coalesce
21ba0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74   this object int
21bb0 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c  o unixInodeInfo,
21bc0 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20   but that would 
21bd0 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70  mean.** every op
21be0 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65  en file that doe
21bf0 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64  s not use shared
21c00 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65   memory (in othe
21c10 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a  r words, most.**
21c20 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75   open files) wou
21c30 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72 72 79  ld have to carry
21c40 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74   around this ext
21c50 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ra information. 
21c60 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49   So.** the unixI
21c70 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
21c80 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
21c90 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53  er to this unixS
21ca0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a  hmNode object.**
21cb0 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d   and the unixShm
21cc0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63  Node object is c
21cd0 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e  reated only when
21ce0 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75   needed..**.** u
21cf0 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  nixMutexHeld() m
21d00 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e  ust be true when
21d10 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73   creating or des
21d20 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20  troying.** this 
21d30 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20  object or while 
21d40 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
21d50 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
21d60 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20   fields:.**.**  
21d70 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54      nRef.**.** T
21d80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
21d90 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  lds are read-onl
21da0 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65  y after the obje
21db0 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a  ct is created:.*
21dc0 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a  * .**      fid.*
21dd0 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  *      zFilename
21de0 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e  .**.** Either un
21df0 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20  ixShmNode.mutex 
21e00 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20  must be held or 
21e10 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66  unixShmNode.nRef
21e20 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d  ==0 and.** unixM
21e30 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72  utexHeld() is tr
21e40 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20  ue when reading 
21e50 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f  or writing any o
21e60 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e  ther field.** in
21e70 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e   this structure.
21e80 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53  .*/.struct unixS
21e90 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49  hmNode {.  unixI
21ea0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
21eb0 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f  ;     /* unixIno
21ec0 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73  deInfo that owns
21ed0 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a   this SHM node *
21ee0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
21ef0 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f  x *mutex;      /
21f00 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73  * Mutex to acces
21f10 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  s this object */
21f20 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
21f30 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
21f40 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61   Name of the mma
21f50 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69  pped file */.  i
21f60 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  nt h;           
21f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
21f80 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
21f90 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  r */.  int szReg
21fa0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
21fb0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61    /* Size of sha
21fc0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
21fd0 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67  ns */.  u16 nReg
21fe0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
21ff0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
22000 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  ray apRegion */.
22010 20 20 75 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b    u8 isReadonly;
22020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22030 54 72 75 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c  True if read-onl
22040 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70  y */.  char **ap
22050 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
22060 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 61    /* Array of ma
22070 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  pped shared-memo
22080 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
22090 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
220a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
220b0 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20  mber of unixShm 
220c0 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
220d0 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e   to this */.  un
220e0 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  ixShm *pFirst;  
220f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
22100 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20  unixShm objects 
22110 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
22120 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
22130 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78 63  E_DEBUG.  u8 exc
22140 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
22150 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
22160 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
22170 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61  held */.  u8 sha
22180 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
22190 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
221a0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
221b0 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68  d */.  u8 nextSh
221c0 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
221d0 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
221e0 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76  ble unixShm.id v
221f0 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
22200 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75  ;../*.** Structu
22210 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  re used internal
22220 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74  ly by this VFS t
22230 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  o record the sta
22240 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e  te of an.** open
22250 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63   shared memory c
22260 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
22270 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
22280 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61  ields are initia
22290 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
222a0 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
222b0 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61  d and.** are rea
222c0 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65  d-only thereafte
222d0 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78  r:.**.**    unix
222e0 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20  Shm.pFile.**    
222f0 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a  unixShm.id.**.**
22300 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64   All other field
22310 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65  s are read/write
22320 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e 70  .  The unixShm.p
22330 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74  File->mutex must
22340 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c   be held.** whil
22350 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20  e accessing any 
22360 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64  read/write field
22370 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  s..*/.struct uni
22380 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d  xShm {.  unixShm
22390 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
223a0 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
223b0 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64  lying unixShmNod
223c0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e  e object */.  un
223d0 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20  ixShm *pNext;   
223e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
223f0 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68   unixShm with th
22400 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f  e same unixShmNo
22410 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75  de */.  u8 hasMu
22420 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
22430 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f     /* True if ho
22440 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68  lding the unixSh
22450 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20  mNode mutex */. 
22460 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b   u16 sharedMask;
22470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
22480 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
22490 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31  cks held */.  u1
224a0 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  6 exclMask;     
224b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
224c0 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
224d0 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64  cks held */.#ifd
224e0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
224f0 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20    u8 id;        
22500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22510 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  Id of this conne
22520 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73  ction within its
22530 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
22540 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
22550 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
22560 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
22570 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
22580 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
22590 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
225a0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73           /* firs
225b0 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23  t lock byte */.#
225c0 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
225d0 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d  DMS    (UNIX_SHM
225e0 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
225f0 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
22600 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
22610 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78  *.** Apply posix
22620 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
22630 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72  for all bytes fr
22640 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20  om ofst through 
22650 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20  ofst+n-1..**.** 
22660 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74  Locks block if t
22670 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74  he mask is exact
22680 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e  ly UNIX_SHM_C an
22690 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69  d are non-blocki
226a0 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  ng.** otherwise.
226b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
226c0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
226d0 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  (.  unixShmNode 
226e0 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70  *pShmNode, /* Ap
226f0 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69  ply locks to thi
22700 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65  s open shared-me
22710 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
22720 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
22730 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e           /* F_UN
22740 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72  LCK, F_RDLCK, or
22750 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e   F_WRLCK */.  in
22760 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
22770 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
22780 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  te of the lockin
22790 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74  g range */.  int
227a0 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   n              
227b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
227c0 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
227d0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  /.){.  struct fl
227e0 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20  ock f;       /* 
227f0 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  The posix adviso
22800 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ry locking struc
22810 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ture */.  int rc
22820 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
22830 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
22840 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a  orm fcntl() */..
22850 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
22860 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  he unixShmNode o
22870 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
22880 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
22890 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  r */.  assert( s
228a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
228b0 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  d(pShmNode->mute
228c0 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  x) || pShmNode->
228d0 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
228e0 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65   Shared locks ne
228f0 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68  ver span more th
22900 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20  an one byte */. 
22910 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
22920 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c   lockType!=F_RDL
22930 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
22940 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  s are within ran
22950 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
22960 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45  n>=1 && n<SQLITE
22970 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  _SHM_NLOCK );.. 
22980 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
22990 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  >=0 ){.    /* In
229a0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
229b0 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
229c0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66  */.    memset(&f
229d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b  , 0, sizeof(f));
229e0 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20  .    f.l_type = 
229f0 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e  lockType;.    f.
22a00 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
22a10 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61  SET;.    f.l_sta
22a20 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66  rt = ofst;.    f
22a30 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20  .l_len = n;..   
22a40 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53   rc = osFcntl(pS
22a50 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54  hmNode->h, F_SET
22a60 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20  LK, &f);.    rc 
22a70 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53  = (rc!=(-1)) ? S
22a80 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
22a90 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f  E_BUSY;.  }..  /
22aa0 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f  * Update the glo
22ab0 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61  bal lock state a
22ac0 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63  nd do debug trac
22ad0 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ing */.#ifdef SQ
22ae0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75  LITE_DEBUG.  { u
22af0 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41  16 mask;.  OSTRA
22b00 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29  CE(("SHM-LOCK ")
22b10 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  );.  mask = (1<<
22b20 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
22b30 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  ofst);.  if( rc=
22b40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22b50 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
22b60 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
22b70 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
22b80 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
22b90 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
22ba0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
22bb0 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
22bc0 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
22bd0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65  &= ~mask;.    }e
22be0 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
22bf0 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
22c00 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
22c10 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  d-lock %d ok", o
22c20 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
22c30 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
22c40 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
22c50 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
22c60 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
22c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
22c80 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
22c90 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
22ca0 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
22cb0 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  e-lock %d ok", o
22cc0 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
22cd0 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
22ce0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
22cf0 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
22d00 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
22d10 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
22d20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
22d30 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
22d40 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b  OSTRACE(("unlock
22d50 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
22d60 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t));.    }else i
22d70 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
22d80 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
22d90 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
22da0 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20  k failed"));.   
22db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
22dc0 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  sert( lockType==
22dd0 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20  F_WRLCK );.     
22de0 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65   OSTRACE(("write
22df0 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  -lock %d failed"
22e00 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a  , ofst));.    }.
22e10 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
22e20 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25 30   - afterwards %0
22e30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
22e40 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
22e50 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68  >sharedMask, pSh
22e60 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29  mNode->exclMask)
22e70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
22e80 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20   return rc;     
22e90 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75     .}.../*.** Pu
22ea0 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  rge the unixShmN
22eb0 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
22ec0 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
22ed0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
22ee0 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
22ef0 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
22f00 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
22f10 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
22f20 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
22f30 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
22f40 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
22f50 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
22f60 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65  oid unixShmPurge
22f70 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
22f80 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
22f90 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d  p = pFd->pInode-
22fa0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
22fb0 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
22fc0 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20  ld() );.  if( p 
22fd0 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  && p->nRef==0 ){
22fe0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
22ff0 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64  assert( p->pInod
23000 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29  e==pFd->pInode )
23010 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74  ;.    if( p->mut
23020 65 78 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex ) sqlite3_mut
23030 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78  ex_free(p->mutex
23040 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
23050 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b  i<p->nRegion; i+
23060 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
23070 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >h>=0 ){.       
23080 20 6d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67   munmap(p->apReg
23090 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67  ion[i], p->szReg
230a0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ion);.      }els
230b0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
230c0 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67  e3_free(p->apReg
230d0 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  ion[i]);.      }
230e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
230f0 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67  e3_free(p->apReg
23100 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ion);.    if( p-
23110 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  >h>=0 ){.      r
23120 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c  obust_close(pFd,
23130 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29   p->h, __LINE__)
23140 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d  ;.      p->h = -
23150 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  1;.    }.    p->
23160 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
23170 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
23180 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
23190 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
231a0 68 61 72 20 2a 70 72 6f 78 79 53 68 61 72 65 64  har *proxyShared
231b0 4d 65 6d 6f 72 79 42 61 73 65 50 61 74 68 28 75  MemoryBasePath(u
231c0 6e 69 78 46 69 6c 65 20 2a 29 3b 0a 0a 2f 2a 0a  nixFile *);../*.
231d0 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64  ** Open a shared
231e0 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73  -memory area ass
231f0 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70 65  ociated with ope
23200 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
23210 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73  pDbFd.  .** This
23220 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c   particular impl
23230 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
23240 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a  mmapped files..*
23250 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73  *.** The file us
23260 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
23270 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73  shared-memory is
23280 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
23290 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65  ectory.** as the
232a0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
232b0 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65 20  ile and has the 
232c0 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
232d0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a   open database.*
232e0 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  * file with the 
232f0 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61 64  "-shm" suffix ad
23300 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ded.  For exampl
23310 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  e, if the databa
23320 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f  se file.** is "/
23330 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
23340 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20 66  g.db" then the f
23350 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65 61  ile that is crea
23360 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a  ted and mmapped.
23370 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65  ** for shared me
23380 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c  mory will be cal
23390 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31  led "/home/user1
233a0 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e  /config.db-shm".
233b0 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72    .**.** Another
233c0 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20   approach to is 
233d0 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20  to use files in 
233e0 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76  /dev/shm or /dev
233f0 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f  /tmp or an.** so
23400 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d  me other tmpfs m
23410 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66  ount. But if a f
23420 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72 65  ile in a differe
23430 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  nt directory.** 
23440 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
23450 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20  e file is used, 
23460 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61  then differing a
23470 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
23480 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74  s.** or a chroot
23490 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20 74  () might cause t
234a0 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f  wo different pro
234b0 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61  cesses on the sa
234c0 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  me.** database t
234d0 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64  o end up using d
234e0 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66  ifferent files f
234f0 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  or shared memory
23500 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74   - .** meaning t
23510 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  hat their memory
23520 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c   would not reall
23530 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72 65  y be shared - re
23540 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61  sulting.** in da
23550 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
23560 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  n.  Nevertheless
23570 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c  , this tmpfs fil
23580 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62  e usage.** can b
23590 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  e enabled at com
235a0 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20  pile-time using 
235b0 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  -DSQLITE_SHM_DIR
235c0 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d  ECTORY="/dev/shm
235d0 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69  ".** or the equi
235e0 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65  valent.  The use
235f0 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   of the SQLITE_S
23600 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d  HM_DIRECTORY com
23610 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74  pile-time.** opt
23620 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61  ion results in a
23630 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62  n incompatible b
23640 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20  uild of SQLite; 
23650 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74   builds of SQLit
23660 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64  e.** that with d
23670 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f  iffering SQLITE_
23680 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65  SHM_DIRECTORY se
23690 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74  ttings attempt t
236a0 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d  o use the.** sam
236b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
236c0 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
236d0 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  , database corru
236e0 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c  ption will likel
236f0 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65  y.** result. The
23700 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
23710 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69  CTORY compile-ti
23720 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e  me option is con
23730 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75  sidered.** "unsu
23740 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79  pported" and may
23750 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75   go away in a fu
23760 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65  ture SQLite rele
23770 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ase..**.** When 
23780 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68  opening a new sh
23790 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
237a0 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e  , if no other in
237b0 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a  stances of that.
237c0 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72  ** file are curr
237d0 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74  ently open, in t
237e0 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69  his process or i
237f0 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  n other processe
23800 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66  s, then.** the f
23810 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e  ile must be trun
23820 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65  cated to zero le
23830 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73  ngth or have its
23840 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e   header cleared.
23850 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72  .**.** If the or
23860 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
23870 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73 20  file (pDbFd) is 
23880 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d  using the "unix-
23890 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61  excl" VFS.** tha
238a0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20  t means that an 
238b0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
238c0 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
238d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 0a  tabase file and.
238e0 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ** that no other
238f0 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20 61   processes are a
23900 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ble to read or w
23910 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73  rite the databas
23920 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63  e.  In.** that c
23930 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72  ase, we do not r
23940 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72 65  eally need share
23950 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68  d memory.  No sh
23960 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  ared memory.** f
23970 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ile is created. 
23980 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
23990 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c  ry will be simul
239a0 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20 6d  ated with heap m
239b0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
239c0 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68 61   int unixOpenSha
239d0 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69  redMemory(unixFi
239e0 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74  le *pDbFd){.  st
239f0 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20  ruct unixShm *p 
23a00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
23a10 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
23a20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
23a30 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d    struct unixShm
23a40 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
23a50 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
23a60 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ing mmapped file
23a70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a90 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
23aa0 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  code */.  unixIn
23ab0 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
23ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23ad0 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a   inode of fd */.
23ae0 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65    char *zShmFile
23af0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
23b00 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
23b10 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53   file used for S
23b20 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d  HM */.  int nShm
23b30 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
23b40 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
23b50 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e  of the SHM filen
23b60 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
23b70 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
23b80 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
23b90 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e   unixShm object.
23ba0 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
23bb0 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
23bc0 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
23bd0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
23be0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  TE_NOMEM;.  mems
23bf0 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
23c00 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *p));.  assert( 
23c10 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
23c20 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
23c30 20 73 65 65 20 69 66 20 61 20 75 6e 69 78 53 68   see if a unixSh
23c40 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72  mNode object alr
23c50 65 61 64 79 20 65 78 69 73 74 73 2e 20 52 65 75  eady exists. Reu
23c60 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  se an existing. 
23c70 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65   ** one if prese
23c80 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77  nt. Create a new
23c90 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
23ca0 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  y..  */.  unixEn
23cb0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
23cc0 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49  node = pDbFd->pI
23cd0 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  node;.  pShmNode
23ce0 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e   = pInode->pShmN
23cf0 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  ode;.  if( pShmN
23d00 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ode==0 ){.    st
23d10 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
23d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d30 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f   /* fstat() info
23d40 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69   for database fi
23d50 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 61  le */..    /* Ca
23d60 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66 69  ll fstat() to fi
23d70 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65 72  gure out the per
23d80 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
23d90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
23da0 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a  f.    ** a new *
23db0 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65  -shm file is cre
23dc0 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74  ated, an attempt
23dd0 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
23de0 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a   create it.    *
23df0 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
23e00 70 65 72 6d 69 73 73 69 6f 6e 73 2e 20 54 68 65  permissions. The
23e10 20 61 63 74 75 61 6c 20 70 65 72 6d 69 73 73 69   actual permissi
23e20 6f 6e 73 20 74 68 65 20 66 69 6c 65 20 69 73 20  ons the file is 
23e30 63 72 65 61 74 65 64 0a 20 20 20 20 2a 2a 20 77  created.    ** w
23e40 69 74 68 20 61 72 65 20 73 75 62 6a 65 63 74 20  ith are subject 
23e50 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 75  to the current u
23e60 6d 61 73 6b 20 73 65 74 74 69 6e 67 2e 0a 20 20  mask setting..  
23e70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46    */.    if( osF
23e80 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26  stat(pDbFd->h, &
23e90 73 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64 65  sStat) && pInode
23ea0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
23eb0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
23ec0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
23ed0 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
23ee0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
23ef0 20 7d 0a 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   }..    const ch
23f00 61 72 20 2a 7a 42 61 73 65 50 61 74 68 20 3d 20  ar *zBasePath = 
23f10 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a 23 69  pDbFd->zPath;.#i
23f20 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
23f30 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
23f40 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
23f50 59 4c 45 0a 20 20 20 20 2f 2a 20 49 66 20 70 44  YLE.    /* If pD
23f60 62 46 64 20 69 73 20 63 6f 6e 66 69 67 75 72 65  bFd is configure
23f70 64 20 77 69 74 68 20 70 72 6f 78 79 20 6c 6f 63  d with proxy loc
23f80 6b 69 6e 67 20 6d 6f 64 65 2c 20 75 73 65 20 74  king mode, use t
23f90 68 65 20 6c 6f 63 61 6c 20 0a 20 20 20 20 20 2a  he local .     *
23fa0 2a 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  * lock file path
23fb0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
23fc0 65 20 2d 73 68 6d 20 66 69 6c 65 20 70 61 74 68  e -shm file path
23fd0 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  .     */.    if(
23fe0 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d   isProxyLockingM
23ff0 6f 64 65 28 70 44 62 46 64 29 20 29 7b 0a 20 20  ode(pDbFd) ){.  
24000 20 20 20 20 7a 42 61 73 65 50 61 74 68 20 3d 20      zBasePath = 
24010 70 72 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f 72  proxySharedMemor
24020 79 42 61 73 65 50 61 74 68 28 70 44 62 46 64 29  yBasePath(pDbFd)
24030 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 42 61  ;.      if( !zBa
24040 73 65 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  sePath ){.      
24050 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
24060 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
24070 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
24080 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  en_err;.      }.
24090 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
240a0 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
240b0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20  SHM_DIRECTORY.  
240c0 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    nShmFilename =
240d0 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53   sizeof(SQLITE_S
240e0 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20  HM_DIRECTORY) + 
240f0 33 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53  30;.#else.    nS
24100 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 35 20 2b  hmFilename = 5 +
24110 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 61   (int)strlen(zBa
24120 73 65 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a  sePath);.#endif.
24130 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73      pShmNode = s
24140 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
24150 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
24160 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20   + nShmFilename 
24170 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
24180 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
24190 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
241a0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
241b0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
241c0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68  }.    memset(pSh
241d0 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mNode, 0, sizeof
241e0 28 2a 70 53 68 6d 4e 6f 64 65 29 29 3b 0a 20 20  (*pShmNode));.  
241f0 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    zShmFilename =
24200 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
24210 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
24220 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64  ShmNode[1];.#ifd
24230 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
24240 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69  RECTORY.    sqli
24250 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
24260 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46  mFilename, zShmF
24270 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ilename, .      
24280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
24290 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
242a0 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d  ORY "/sqlite-shm
242b0 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20  -%x-%x",.       
242c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
242d0 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c  32)sStat.st_ino,
242e0 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64   (u32)sStat.st_d
242f0 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73  ev);.#else.    s
24300 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
24310 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
24320 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  hmFilename, "%s-
24330 73 68 6d 22 2c 20 7a 42 61 73 65 50 61 74 68 29  shm", zBasePath)
24340 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
24350 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e  eSuffix3(pDbFd->
24360 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e  zPath, zShmFilen
24370 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ame);.#endif.   
24380 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d   pShmNode->h = -
24390 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49  1;.    pDbFd->pI
243a0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
243b0 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70   pShmNode;.    p
243c0 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20  ShmNode->pInode 
243d0 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
243e0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d  .    pShmNode->m
243f0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
24400 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
24410 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
24420 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
24430 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
24440 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
24450 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
24460 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
24470 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
24480 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
24490 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ck==0 ){.      c
244a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 4f 3b 0a  onst char *zRO;.
244b0 20 20 20 20 20 20 7a 52 4f 20 3d 20 73 71 6c 69        zRO = sqli
244c0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
244d0 72 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20  r(pDbFd->zPath, 
244e0 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 29 3b  "readonly_shm");
244f0 0a 20 20 20 20 20 20 69 66 28 20 7a 52 4f 20 26  .      if( zRO &
24500 26 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  & sqlite3GetBool
24510 65 61 6e 28 7a 52 4f 29 20 29 7b 0a 20 20 20 20  ean(zRO) ){.    
24520 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
24530 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53  = robust_open(zS
24540 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44  hmFilename, O_RD
24550 4f 4e 4c 59 2c 0a 20 20 20 20 20 20 20 20 20 20  ONLY,.          
24560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24570 20 20 20 20 20 20 20 20 28 73 53 74 61 74 2e 73          (sStat.s
24580 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 29 29 3b  t_mode & 0777));
24590 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
245a0 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20  e->isReadonly = 
245b0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
245c0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
245d0 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65  ->h = robust_ope
245e0 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  n(zShmFilename, 
245f0 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 0a  O_RDWR|O_CREAT,.
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
24620 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20  sStat.st_mode & 
24630 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 7d 0a  0777));.      }.
24640 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
24650 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
24660 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
24670 52 4f 3b 0a 20 20 20 20 20 20 20 20 7a 52 4f 20  RO;.        zRO 
24680 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  = sqlite3_uri_pa
24690 72 61 6d 65 74 65 72 28 70 44 62 46 64 2d 3e 7a  rameter(pDbFd->z
246a0 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f  Path, "readonly_
246b0 73 68 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 69  shm");.        i
246c0 66 28 20 7a 52 4f 20 26 26 20 73 71 6c 69 74 65  f( zRO && sqlite
246d0 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 4f 29  3GetBoolean(zRO)
246e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53   ){.          pS
246f0 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75  hmNode->h = robu
24700 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65  st_open(zShmFile
24710 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 0a  name, O_RDONLY,.
24720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24740 20 20 20 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f      (sStat.st_mo
24750 64 65 20 26 20 30 37 37 37 29 29 3b 0a 20 20 20  de & 0777));.   
24760 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
24770 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b  >isReadonly = 1;
24780 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24790 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
247a0 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >h<0 ){.        
247b0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
247c0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
247d0 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
247e0 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
247f0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
24800 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
24810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
24820 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63    .      /* Chec
24830 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  k to see if anot
24840 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
24850 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d  olding the dead-
24860 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20  man switch..    
24870 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75    ** If not, tru
24880 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
24890 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a  o zero length. .
248a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
248b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
248c0 20 20 20 20 20 69 66 28 20 75 6e 69 78 53 68 6d       if( unixShm
248d0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
248e0 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e  ode, F_WRLCK, UN
248f0 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d  IX_SHM_DMS, 1)==
24900 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24910 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f       if( robust_
24920 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f  ftruncate(pShmNo
24930 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20  de->h, 0) ){.   
24940 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
24950 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
24960 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22  IOERR_SHMOPEN, "
24970 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d  ftruncate", zShm
24980 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
24990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
249a0 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e      /* If runnin
249b0 67 20 61 73 20 72 6f 6f 74 20 73 65 74 20 74 68  g as root set th
249c0 65 20 75 69 64 2f 67 69 64 20 6f 66 20 74 68 65  e uid/gid of the
249d0 20 73 68 6d 20 66 69 6c 65 20 74 6f 20 6d 61 74   shm file to mat
249e0 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ch the database 
249f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 69 64  */.          uid
24a00 5f 74 20 65 75 69 64 20 3d 20 67 65 74 65 75 69  _t euid = geteui
24a10 64 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  d();.          i
24a20 66 28 20 65 75 69 64 3d 3d 30 20 26 26 20 28 65  f( euid==0 && (e
24a30 75 69 64 21 3d 73 53 74 61 74 2e 73 74 5f 75 69  uid!=sStat.st_ui
24a40 64 20 7c 7c 20 67 65 74 65 67 69 64 28 29 21 3d  d || getegid()!=
24a50 73 53 74 61 74 2e 73 74 5f 67 69 64 29 20 29 7b  sStat.st_gid) ){
24a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
24a70 20 66 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65   fchown(pShmNode
24a80 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f 75 69  ->h, sStat.st_ui
24a90 64 2c 20 73 53 74 61 74 2e 73 74 5f 67 69 64 29  d, sStat.st_gid)
24aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24ab0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
24ac0 45 52 52 5f 53 48 4d 4f 50 45 4e 3b 0a 20 20 20  ERR_SHMOPEN;.   
24ad0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
24af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24b00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24b10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
24b20 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
24b30 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52  ck(pShmNode, F_R
24b40 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  DLCK, UNIX_SHM_D
24b50 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  MS, 1);.      }.
24b60 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
24b70 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
24b80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
24b90 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63  * Make the new c
24ba0 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c  onnection a chil
24bb0 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d  d of the unixShm
24bc0 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68  Node */.  p->pSh
24bd0 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
24be0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
24bf0 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20  DEBUG.  p->id = 
24c00 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68  pShmNode->nextSh
24c10 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  mId++;.#endif.  
24c20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b  pShmNode->nRef++
24c30 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
24c40 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  = p;.  unixLeave
24c50 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54  Mutex();..  /* T
24c60 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
24c70 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68  nt on pShmNode h
24c80 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
24c90 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65  incremented unde
24ca0 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72  r.  ** the cover
24cb0 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65   of the unixEnte
24cc0 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61  rMutex() mutex a
24cd0 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66  nd the pointer f
24ce0 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77  rom the.  ** new
24cf0 20 28 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d   (struct unixShm
24d00 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  ) object to the 
24d10 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65  pShmNode has bee
24d20 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20  n set. All that 
24d30 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20  is.  ** left to 
24d40 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68  do is to link th
24d50 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74  e new object int
24d60 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
24d70 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  t starting.  ** 
24d80 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  at pShmNode->pFi
24d90 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62  rst. This must b
24da0 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c  e done while hol
24db0 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64  ding the pShmNod
24dc0 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d  e->mutex .  ** m
24dd0 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  utex..  */.  sql
24de0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
24df0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
24e00 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  );.  p->pNext = 
24e10 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
24e20 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  ;.  pShmNode->pF
24e30 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  irst = p;.  sqli
24e40 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
24e50 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
24e60 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
24e70 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
24e80 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72   here on any err
24e90 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65  or */.shm_open_e
24ea0 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72  rr:.  unixShmPur
24eb0 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20  ge(pDbFd);      
24ec0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
24ed0 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
24ee0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
24ef0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
24f00 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
24f10 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
24f20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
24f30 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
24f40 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
24f50 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
24f60 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a  Region of the .*
24f70 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
24f80 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
24f90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24fa0 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d  e fd. Shared-mem
24fb0 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20  ory regions .** 
24fc0 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
24fd0 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
24fe0 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
24ff0 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
25000 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73  Region .** bytes
25010 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
25020 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
25030 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
25040 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
25050 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
25060 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
25070 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62 45  rwise, if the bE
25080 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20  xtend parameter 
25090 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
250a0 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
250b0 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
250c0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
250d0 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
250e0 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
250f0 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
25100 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
25110 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
25120 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
25130 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
25140 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45  urned. If .** bE
25150 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  xtend is non-zer
25160 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  o and the reques
25170 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
25180 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  y region has not
25190 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c   yet .** been al
251a0 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61  located, it is a
251b0 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
251c0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
251d0 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
251e0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
251f0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
25200 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c  located or is al
25210 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
25220 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72  is call as descr
25230 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ibed above, then
25240 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e   it is mapped in
25250 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
25260 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
25270 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
25280 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
25290 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
252a0 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a  to the mapped .*
252b0 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
252c0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
252d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
252e0 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  nixShmMap(.  sql
252f0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
25300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25310 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
25320 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
25330 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
25340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25350 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
25360 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
25370 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
25380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25390 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
253a0 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64  */.  int bExtend
253b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
253c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
253d0 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
253e0 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
253f0 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25410 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
25420 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ory */.){.  unix
25430 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
25440 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75  nixFile*)fd;.  u
25450 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69  nixShm *p;.  uni
25460 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
25470 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
25480 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
25490 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
254a0 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f  mory file has no
254b0 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
254c0 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
254d0 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e  */.  if( pDbFd->
254e0 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pShm==0 ){.    r
254f0 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72  c = unixOpenShar
25500 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b  edMemory(pDbFd);
25510 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
25520 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
25530 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70  rc;.  }..  p = p
25540 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53  DbFd->pShm;.  pS
25550 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
25560 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Node;.  sqlite3_
25570 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
25580 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
25590 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e  assert( szRegion
255a0 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65  ==pShmNode->szRe
255b0 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  gion || pShmNode
255c0 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a  ->nRegion==0 );.
255d0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
255e0 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
255f0 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61  d->pInode );.  a
25600 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
25610 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e  >h>=0 || pDbFd->
25620 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
25630 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73  Lock==1 );.  ass
25640 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
25650 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  <0 || pDbFd->pIn
25660 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
25670 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  k==0 );..  if( p
25680 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
25690 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
256a0 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20   char **apNew;  
256b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256c0 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67      /* New apReg
256d0 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  ion[] array */. 
256e0 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
256f0 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67  iRegion+1)*szReg
25700 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  ion;  /* Minimum
25710 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73   required file s
25720 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ize */.    struc
25730 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
25740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25750 20 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29   Used by fstat()
25760 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64   */..    pShmNod
25770 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a  e->szRegion = sz
25780 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28  Region;..    if(
25790 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
257a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
257b0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
257c0 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
257d0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
257e0 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
257f0 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b  ..      ** Check
25800 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61   to see if it ha
25810 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
25820 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61   (i.e. if the wa
25830 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a  l-index file is.
25840 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65        ** large e
25850 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e  nough to contain
25860 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
25870 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f  egion)..      */
25880 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
25890 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  at(pShmNode->h, 
258a0 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
258b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
258c0 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20  OERR_SHMSIZE;.  
258d0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
258e0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
258f0 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74    .      if( sSt
25900 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65  at.st_size<nByte
25910 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
25920 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
25930 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
25940 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45  not exist. If bE
25950 78 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a  xtend is set to.
25960 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65          ** false
25970 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
25980 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
25990 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
259a0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
259b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
259c0 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c   ** Alternativel
259d0 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73  y, if bExtend is
259e0 20 74 72 75 65 2c 20 75 73 65 20 66 74 72 75 6e   true, use ftrun
259f0 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61  cate() to alloca
25a00 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  te.        ** th
25a10 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
25a20 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20  ry region..     
25a30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
25a40 28 20 21 62 45 78 74 65 6e 64 20 29 20 67 6f 74  ( !bExtend ) got
25a50 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
25a60 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73         if( robus
25a70 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d  t_ftruncate(pShm
25a80 4e 6f 64 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20  Node->h, nByte) 
25a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
25aa0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
25ab0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
25ac0 49 5a 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  IZE, "ftruncate"
25ad0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
25af0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
25b00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
25b10 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
25b20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25b30 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
25b40 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65  Map the requeste
25b50 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
25b60 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
25b70 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
25b80 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20  e. */.    apNew 
25b90 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74  = (char **)sqlit
25ba0 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
25bb0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
25bc0 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e  Region, (iRegion
25bd0 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72 20  +1)*sizeof(char 
25be0 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  *).    );.    if
25bf0 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
25c00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
25c10 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
25c20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
25c30 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68  t;.    }.    pSh
25c40 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20  mNode->apRegion 
25c50 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69  = apNew;.    whi
25c60 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  le(pShmNode->nRe
25c70 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a  gion<=iRegion){.
25c80 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d        void *pMem
25c90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d  ;.      if( pShm
25ca0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
25cb0 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6d 6d 61        pMem = mma
25cc0 70 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a 20  p(0, szRegion,. 
25cd0 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
25ce0 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
25cf0 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52  ? PROT_READ : PR
25d00 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49  OT_READ|PROT_WRI
25d10 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  TE, .           
25d20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68   MAP_SHARED, pSh
25d30 6d 4e 6f 64 65 2d 3e 68 2c 20 70 53 68 6d 4e 6f  mNode->h, pShmNo
25d40 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65  de->nRegion*szRe
25d50 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a  gion.        );.
25d60 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d          if( pMem
25d70 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  ==MAP_FAILED ){.
25d80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
25d90 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
25da0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c  TE_IOERR_SHMMAP,
25db0 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64   "mmap", pShmNod
25dc0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
25dd0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
25de0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
25df0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
25e00 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d  {.        pMem =
25e10 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
25e20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
25e30 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29     if( pMem==0 )
25e40 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
25e50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
25e60 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
25e70 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
25e80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
25e90 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52  set(pMem, 0, szR
25ea0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  egion);.      }.
25eb0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
25ec0 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  apRegion[pShmNod
25ed0 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20 70 4d  e->nRegion] = pM
25ee0 65 6d 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  em;.      pShmNo
25ef0 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20  de->nRegion++;. 
25f00 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67     }.  }..shmpag
25f10 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68  e_out:.  if( pSh
25f20 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69  mNode->nRegion>i
25f30 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70  Region ){.    *p
25f40 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70  p = pShmNode->ap
25f50 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b  Region[iRegion];
25f60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
25f70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  p = 0;.  }.  if(
25f80 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
25f90 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c  donly && rc==SQL
25fa0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51  ITE_OK ) rc = SQ
25fb0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
25fc0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
25fd0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
25fe0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
25ff0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
26000 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
26010 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
26020 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
26030 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
26040 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  the relationship
26050 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20   between SHAREd 
26060 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  and EXCLUSIVE lo
26070 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a  cks is a little.
26080 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72  ** different her
26090 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e  e than in posix.
260a0 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c    In xShmLock(),
260b0 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d   one can go from
260c0 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20   unlocked.** to 
260d0 73 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20  shared and back 
260e0 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  or from unlocked
260f0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e   to exclusive an
26100 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65  d back.  But one
26110 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66   may.** not go f
26120 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78  rom shared to ex
26130 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20  clusive or from 
26140 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61  exclusive to sha
26150 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
26160 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a  nt unixShmLock(.
26170 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
26180 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
26190 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
261a0 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
261b0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
261c0 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
261d0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
261e0 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65   lock to acquire
261f0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
26200 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
26210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26220 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74  umber of locks t
26230 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
26240 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ease */.  int fl
26250 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
26260 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
26270 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  do with the lock
26280 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
26290 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
262a0 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f  File*)fd;      /
262b0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c  * Connection hol
262c0 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
262d0 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ry */.  unixShm 
262e0 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
262f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
26300 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
26310 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20  ry being locked 
26320 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58  */.  unixShm *pX
26330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
26350 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61  r looping over a
26360 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  ll siblings */. 
26370 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
26380 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
26390 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e  Node;  /* The un
263a0 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e  derlying file iN
263b0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ode */.  int rc 
263c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
263e0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
263f0 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20  .  u16 mask;    
26400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26410 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
26420 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b   of locks to tak
26430 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
26440 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
26450 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
26460 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a  de->pShmNode );.
26470 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
26480 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
26490 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61  d->pInode );.  a
264a0 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26  ssert( ofst>=0 &
264b0 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45  & ofst+n<=SQLITE
264c0 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20  _SHM_NLOCK );.  
264d0 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a  assert( n>=1 );.
264e0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
264f0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
26500 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
26510 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
26520 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
26530 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
26540 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
26550 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
26560 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
26570 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
26580 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
26590 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
265a0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
265b0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
265c0 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72  SIVE) );.  asser
265d0 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67  t( n==1 || (flag
265e0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
265f0 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a  XCLUSIVE)!=0 );.
26600 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
26610 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46  de->h>=0 || pDbF
26620 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
26630 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20  essLock==1 );.  
26640 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
26650 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e  ->h<0 || pDbFd->
26660 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
26670 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61  Lock==0 );..  ma
26680 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e  sk = (1<<(ofst+n
26690 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a  )) - (1<<ofst);.
266a0 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c    assert( n>1 ||
266b0 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29   mask==(1<<ofst)
266c0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
266d0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
266e0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  de->mutex);.  if
266f0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
26700 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  _SHM_UNLOCK ){. 
26710 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d     u16 allMask =
26720 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c   0; /* Mask of l
26730 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62  ocks held by sib
26740 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  lings */..    /*
26750 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c   See if any sibl
26760 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73  ings hold this s
26770 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ame lock */.    
26780 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
26790 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
267a0 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
267b0 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
267c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
267d0 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d  sert( (pX->exclM
267e0 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61  ask & (p->exclMa
267f0 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  sk|p->sharedMask
26800 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))==0 );.      a
26810 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68  llMask |= pX->sh
26820 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
26830 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74  .    /* Unlock t
26840 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
26850 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
26860 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b   (mask & allMask
26870 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  )==0 ){.      rc
26880 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
26890 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
268a0 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _UNLCK, ofst+UNI
268b0 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
268c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
268d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
268e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
268f0 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ndo the local lo
26900 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
26910 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26920 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
26930 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
26940 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
26950 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20  &= ~mask;.    } 
26960 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
26970 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
26980 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31  SHARED ){.    u1
26990 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b  6 allShared = 0;
269a0 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f    /* Union of lo
269b0 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e  cks held by conn
269c0 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68  ections other th
269d0 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f  an "p" */..    /
269e0 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68  * Find out which
269f0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72   shared locks ar
26a00 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62  e already held b
26a10 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  y sibling connec
26a20 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66  tions..    ** If
26a30 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72   any sibling alr
26a40 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78  eady holds an ex
26a50 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f  clusive lock, go
26a60 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72   ahead and retur
26a70 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  n.    ** SQLITE_
26a80 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  BUSY..    */.   
26a90 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
26aa0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
26ab0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
26ac0 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
26ad0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
26ae0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
26af0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
26b00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26b10 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61    }.      allSha
26b20 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  red |= pX->share
26b30 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
26b40 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20    /* Get shared 
26b50 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
26b60 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65  tem level, if ne
26b70 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69  cessary */.    i
26b80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26b90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61   ){.      if( (a
26ba0 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29  llShared & mask)
26bb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
26bc0 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
26bd0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
26be0 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_RDLCK, ofst+UN
26bf0 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
26c00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26c10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26c20 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
26c30 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
26c40 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64  the local shared
26c50 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
26c60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26c70 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  ){.      p->shar
26c80 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
26c90 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
26ca0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
26cb0 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  no sibling conne
26cc0 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b  ctions hold lock
26cd0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63  s that will bloc
26ce0 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f  k this.    ** lo
26cf0 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20  ck.  If any do, 
26d00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
26d10 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  SY right away.. 
26d20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58     */.    for(pX
26d30 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
26d40 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
26d50 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
26d60 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
26d70 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d  mask)!=0 || (pX-
26d80 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
26d90 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
26da0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
26db0 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
26dc0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
26dd0 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74  .  .    /* Get t
26de0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
26df0 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
26e00 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66   level.  Then if
26e10 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20   successful.    
26e20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65  ** also mark the
26e30 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
26e40 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65  n as being locke
26e50 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
26e60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26e70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
26e80 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
26e90 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43  pShmNode, F_WRLC
26ea0 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
26eb0 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
26ec0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26ed0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
26ee0 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64  sert( (p->shared
26ef0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
26f00 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78  );.        p->ex
26f10 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
26f20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26f30 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
26f40 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
26f50 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ->mutex);.  OSTR
26f60 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73  ACE(("SHM-LOCK s
26f70 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20  hmid-%d, pid-%d 
26f80 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  got %03x,%03x\n"
26f90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
26fa0 69 64 2c 20 67 65 74 70 69 64 28 29 2c 20 70 2d  id, getpid(), p-
26fb0 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
26fc0 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65  exclMask));.  re
26fd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26fe0 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65  * Implement a me
26ff0 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20  mory barrier or 
27000 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20  memory fence on 
27010 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
27020 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73  .**.** All loads
27030 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75   and stores begu
27040 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72  n before the bar
27050 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65  rier must comple
27060 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  te before.** any
27070 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62   load or store b
27080 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62  egun after the b
27090 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  arrier..*/.stati
270a0 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61  c void unixShmBa
270b0 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
270c0 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
270d0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
270e0 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
270f0 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
27100 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
27110 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
27120 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
27130 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  ex();.  unixLeav
27140 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a  eMutex();.}../*.
27150 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65  ** Close a conne
27160 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d  ction to shared-
27170 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20  memory.  Delete 
27180 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a  the underlying .
27190 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65  ** storage if de
271a0 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65  leteFlag is true
271b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
271c0 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65   is no shared me
271d0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
271e0 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74  with the connect
271f0 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ion then this.**
27200 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61   routine is a ha
27210 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f  rmless no-op..*/
27220 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
27230 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69  ShmUnmap(.  sqli
27240 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
27250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27260 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
27270 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
27280 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20   int deleteFlag 
27290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272a0 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65   /* Delete share
272b0 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65  d-memory if true
272c0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d   */.){.  unixShm
272d0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
272e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
272f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
27300 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69   closed */.  uni
27310 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
27320 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
27330 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
27340 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
27350 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  e */.  unixShm *
27360 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pp;            
27370 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
27380 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69  oping over sibli
27390 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
273a0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  /.  unixFile *pD
273b0 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  bFd;            
273c0 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
273d0 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
273e0 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20  ile */..  pDbFd 
273f0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
27400 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
27410 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  hm;.  if( p==0 )
27420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27430 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  K;.  pShmNode = 
27440 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
27450 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
27460 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  ==pDbFd->pInode-
27470 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61  >pShmNode );.  a
27480 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
27490 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
274a0 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20  pInode );..  /* 
274b0 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f  Remove connectio
274c0 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74  n p from the set
274d0 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   of connections 
274e0 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
274f0 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f  with pShmNode */
27500 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
27510 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
27520 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
27530 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  p=&pShmNode->pFi
27540 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70  rst; (*pp)!=p; p
27550 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78  p = &(*pp)->pNex
27560 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e  t){}.  *pp = p->
27570 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65  pNext;..  /* Fre
27580 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
27590 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   p */.  sqlite3_
275a0 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64  free(p);.  pDbFd
275b0 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71  ->pShm = 0;.  sq
275c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
275d0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
275e0 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68  x);..  /* If pSh
275f0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20  mNode->nRef has 
27600 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20  reached 0, then 
27610 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c  close the underl
27620 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64  ying.  ** shared
27630 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f  -memory file, to
27640 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72  o */.  unixEnter
27650 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
27660 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
27670 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
27680 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
27690 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
276a0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65  =0 ){.    if( de
276b0 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d  leteFlag && pShm
276c0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 75 6e 6c  Node->h>=0 ) unl
276d0 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  ink(pShmNode->zF
276e0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 75 6e  ilename);.    un
276f0 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
27700 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
27710 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
27720 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27730 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }...#else.# defi
27740 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20  ne unixShmMap   
27750 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
27760 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20  xShmLock    0.# 
27770 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61  define unixShmBa
27780 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65  rrier 0.# define
27790 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20   unixShmUnmap   
277a0 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  0.#endif /* #ifn
277b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
277c0 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 28 53 51 4c  WAL */..#if (SQL
277d0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45  ITE_ENABLE_APPLE
277e0 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e  _SPI>0) && defin
277f0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 73 74  ed(__APPLE__).st
27800 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
27810 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72  *unixTempFileDir
27820 28 76 6f 69 64 29 3b 0a 0a 73 74 61 74 69 63 20  (void);..static 
27830 69 6e 74 20 75 6e 69 78 49 6e 76 61 6c 69 64 61  int unixInvalida
27840 74 65 53 75 70 70 6f 72 74 46 69 6c 65 73 28 75  teSupportFiles(u
27850 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
27860 69 6e 74 20 73 6b 69 70 57 41 4c 29 20 7b 0a 20  int skipWAL) {. 
27870 20 63 68 61 72 20 6a 50 61 74 68 5b 4d 41 58 50   char jPath[MAXP
27880 41 54 48 4c 45 4e 2b 39 5d 3b 0a 20 20 69 6e 74  ATHLEN+9];.  int
27890 20 7a 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28   zLen = strlcpy(
278a0 6a 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50  jPath, pFile->zP
278b0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b  ath, MAXPATHLEN+
278c0 39 29 3b 0a 20 20 69 66 28 20 7a 4c 65 6e 3c 4d  9);.  if( zLen<M
278d0 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20  AXPATHLEN ){.   
278e0 20 73 69 7a 65 5f 74 20 6a 4c 65 6e 3b 0a 20 20   size_t jLen;.  
278f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 65 78 74    const char ext
27900 65 6e 73 69 6f 6e 73 5b 33 5d 5b 39 5d 20 3d 20  ensions[3][9] = 
27910 7b 20 22 2d 77 61 6c 22 2c 20 22 2d 6a 6f 75 72  { "-wal", "-jour
27920 6e 61 6c 22 2c 20 22 2d 73 68 6d 22 20 7d 3b 0a  nal", "-shm" };.
27930 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 73 6b 69      int j = (ski
27940 70 57 41 4c 20 3f 20 31 20 3a 20 30 29 3b 0a 20  pWAL ? 1 : 0);. 
27950 20 20 20 66 6f 72 28 20 3b 20 6a 3c 33 3b 20 6a     for( ; j<3; j
27960 2b 2b 20 29 7b 0a 20 20 20 20 20 20 0a 20 20 20  ++ ){.      .   
27970 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
27980 65 65 20 69 66 20 74 68 65 20 73 68 6d 20 66 69  ee if the shm fi
27990 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
279a0 65 6e 65 64 20 66 6f 72 20 74 68 69 73 20 70 46  ened for this pF
279b0 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ile */.      if(
279c0 20 6a 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20   j==2 ){.       
279d0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
279e0 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
279f0 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
27a00 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
27a10 65 61 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eads */.        
27a20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
27a30 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  mNode = pFile->p
27a40 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
27a50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 68  .        if( pSh
27a60 6d 4e 6f 64 65 20 26 26 20 21 70 53 68 6d 4e 6f  mNode && !pShmNo
27a70 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 29  de->isReadonly )
27a80 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
27a90 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 0a 20  ct stat sStat;. 
27aa0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27ab0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
27ac0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
27ad0 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
27ae0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
27af0 2d 3e 68 3e 3d 30 20 26 26 20 21 6f 73 46 73 74  ->h>=0 && !osFst
27b00 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  at(pShmNode->h, 
27b10 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
27b20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
27b30 6c 6f 6e 67 20 73 69 7a 65 20 3d 20 28 73 53 74  long size = (sSt
27b40 61 74 2e 73 74 5f 73 69 7a 65 3c 34 29 20 3f 20  at.st_size<4) ? 
27b50 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 20 3a 20  sStat.st_size : 
27b60 34 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  4;.            i
27b70 66 28 20 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20  f( size>0 ){.   
27b80 20 20 20 20 20 20 20 20 20 20 20 62 7a 65 72 6f             bzero
27b90 28 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67  (pShmNode->apReg
27ba0 69 6f 6e 5b 30 5d 2c 20 73 69 7a 65 29 3b 0a 20  ion[0], size);. 
27bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
27bc0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
27bd0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
27be0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
27bf0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
27c00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
27c10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
27c20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27c30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
27c40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
27c50 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
27c60 65 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ex);.        }. 
27c70 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65         unixLeave
27c80 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 7d  Mutex();.      }
27c90 0a 20 20 20 20 20 20 6a 4c 65 6e 20 3d 20 73 74  .      jLen = st
27ca0 72 6c 63 70 79 28 26 6a 50 61 74 68 5b 7a 4c 65  rlcpy(&jPath[zLe
27cb0 6e 5d 2c 20 65 78 74 65 6e 73 69 6f 6e 73 5b 6a  n], extensions[j
27cc0 5d 2c 20 39 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 9);.      if(
27cd0 20 6a 4c 65 6e 20 3c 20 39 20 29 7b 0a 20 20 20   jLen < 9 ){.   
27ce0 20 20 20 20 20 69 6e 74 20 6a 66 6c 61 67 73 20       int jflags 
27cf0 3d 20 28 6a 3c 32 29 20 3f 20 4f 5f 54 52 55 4e  = (j<2) ? O_TRUN
27d00 43 20 3a 20 4f 5f 52 44 57 52 3b 0a 20 20 20 20  C : O_RDWR;.    
27d10 20 20 20 20 69 6e 74 20 6a 66 64 20 3d 20 6f 70      int jfd = op
27d20 65 6e 28 6a 50 61 74 68 2c 20 6a 66 6c 61 67 73  en(jPath, jflags
27d30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
27d40 66 64 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  fd==(-1) ){.    
27d50 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 21        if( errno!
27d60 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
27d70 20 20 20 20 20 20 20 70 65 72 72 6f 72 28 6a 50         perror(jP
27d80 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ath);.          
27d90 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  }.        } else
27da0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   {.          if(
27db0 20 6a 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20   j==2 ){.       
27dc0 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
27dd0 20 73 53 74 61 74 3b 0a 20 20 20 20 20 20 20 20   sStat;.        
27de0 20 20 20 20 69 66 28 20 21 6f 73 46 73 74 61 74      if( !osFstat
27df0 28 6a 66 64 2c 20 26 73 53 74 61 74 29 20 29 7b  (jfd, &sStat) ){
27e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75  .              u
27e10 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 7a  nsigned long siz
27e20 65 20 3d 20 28 73 53 74 61 74 2e 73 74 5f 73 69  e = (sStat.st_si
27e30 7a 65 3c 34 29 20 3f 20 73 53 74 61 74 2e 73 74  ze<4) ? sStat.st
27e40 5f 73 69 7a 65 20 3a 20 34 3b 0a 20 20 20 20 20  _size : 4;.     
27e50 20 20 20 20 20 20 20 20 20 69 66 28 20 73 69 7a           if( siz
27e60 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
27e70 20 20 20 20 20 20 20 75 69 6e 74 33 32 5f 74 20         uint32_t 
27e80 7a 65 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  zero = 0;.      
27e90 20 20 20 20 20 20 20 20 20 20 70 77 72 69 74 65            pwrite
27ea0 28 6a 66 64 2c 20 26 7a 65 72 6f 2c 20 28 73 69  (jfd, &zero, (si
27eb0 7a 65 5f 74 29 73 69 7a 65 2c 20 30 29 3b 0a 20  ze_t)size, 0);. 
27ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
27ed0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27ee0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27ef0 20 20 20 66 73 79 6e 63 28 6a 66 64 29 3b 0a 20     fsync(jfd);. 
27f00 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6a           close(j
27f10 66 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fd);.        }. 
27f20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
27f30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27f40 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
27f50 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 44  nt unixTruncateD
27f60 61 74 61 62 61 73 65 28 75 6e 69 78 46 69 6c 65  atabase(unixFile
27f70 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 62 46 6c   *pFile, int bFl
27f80 61 67 73 29 20 7b 0a 20 20 73 71 6c 69 74 65 33  ags) {.  sqlite3
27f90 5f 66 69 6c 65 20 2a 69 64 20 3d 20 28 73 71 6c  _file *id = (sql
27fa0 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 46 69 6c  ite3_file *)pFil
27fb0 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
27fc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69 64 20  LITE_OK;.  void 
27fd0 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20  *pLock = NULL;. 
27fe0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a   int flags = 0;.
27ff0 20 20 69 6e 74 20 63 6f 72 72 75 70 74 46 69 6c    int corruptFil
28000 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74  eLock = 0;.  int
28010 20 69 73 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a   isCorrupt = 0;.
28020 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f      .#if SQLITE_
28030 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54  ENABLE_DATA_PROT
28040 45 43 54 49 4f 4e 0a 20 20 66 6c 61 67 73 20 7c  ECTION.  flags |
28050 3d 20 70 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61  = pFile->protFla
28060 67 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  gs;.#endif.#if S
28070 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
28080 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28  KING_STYLE.  if(
28090 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d   isProxyLockingM
280a0 6f 64 65 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  ode(pFile) ){.  
280b0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
280c0 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59  E_OPEN_AUTOPROXY
280d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
280e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65    rc = sqlite3de
280f0 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 70 46 69  mo_superlock(pFi
28100 6c 65 2d 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c  le->zPath, 0, fl
28110 61 67 73 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63  ags, 0, 0, &pLoc
28120 6b 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  k);.  if( rc ){.
28130 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28140 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63  TE_CORRUPT || rc
28150 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20  ==SQLITE_NOTADB 
28160 29 7b 0a 20 20 20 20 20 20 69 73 43 6f 72 72 75  ){.      isCorru
28170 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63  pt = 1;.      rc
28180 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73   = sqlite3demo_s
28190 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74  uperlock_corrupt
281a0 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  (id, SQLITE_LOCK
281b0 5f 45 58 43 4c 55 53 49 56 45 2c 20 26 63 6f 72  _EXCLUSIVE, &cor
281c0 72 75 70 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  ruptFileLock);. 
281d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
281e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
281f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
28200 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  rc = pFile->pMet
28210 68 6f 64 2d 3e 78 54 72 75 6e 63 61 74 65 28 69  hod->xTruncate(i
28220 64 2c 20 28 28 70 46 69 6c 65 2d 3e 66 73 46 6c  d, ((pFile->fsFl
28230 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46  ags & SQLITE_FSF
28240 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 20 21  LAGS_IS_MSDOS) !
28250 3d 20 30 29 20 3f 20 31 4c 20 3a 20 30 4c 29 3b  = 0) ? 1L : 0L);
28260 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28270 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 69 78  E_OK ){.    unix
28280 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72  InvalidateSuppor
28290 74 46 69 6c 65 73 28 70 46 69 6c 65 2c 20 30 29  tFiles(pFile, 0)
282a0 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 70  ;.  }.  pFile->p
282b0 4d 65 74 68 6f 64 2d 3e 78 53 79 6e 63 28 69 64  Method->xSync(id
282c0 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  , SQLITE_SYNC_FU
282d0 4c 4c 29 3b 0a 0a 0a 20 20 69 66 28 20 69 73 43  LL);...  if( isC
282e0 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20 73 71  orrupt ){.    sq
282f0 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75  lite3demo_superu
28300 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64  nlock_corrupt(id
28310 2c 20 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63  , corruptFileLoc
28320 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  k);.  }else{.   
28330 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
28340 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b  erunlock(pLock);
28350 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28360 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 4c 6f 63 6b  ;.}../*. ** Lock
28370 20 6c 6f 63 61 74 69 6f 6e 73 20 66 6f 72 20 73   locations for s
28380 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6c 6f 63  hared-memory loc
28390 6b 73 20 75 73 65 64 20 62 79 20 57 41 4c 20 6d  ks used by WAL m
283a0 6f 64 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ode.. */.#ifndef
283b0 20 53 48 4d 5f 42 41 53 45 0a 23 20 64 65 66 69   SHM_BASE.# defi
283c0 6e 65 20 53 48 4d 5f 42 41 53 45 20 20 20 20 20  ne SHM_BASE     
283d0 20 20 20 20 20 31 32 30 0a 23 20 64 65 66 69 6e       120.# defin
283e0 65 20 53 48 4d 5f 57 52 49 54 45 20 20 20 20 20  e SHM_WRITE     
283f0 20 20 20 20 53 48 4d 5f 42 41 53 45 0a 23 20 64      SHM_BASE.# d
28400 65 66 69 6e 65 20 53 48 4d 5f 43 48 45 43 4b 50  efine SHM_CHECKP
28410 4f 49 4e 54 20 20 20 20 28 53 48 4d 5f 42 41 53  OINT    (SHM_BAS
28420 45 2b 31 29 0a 23 20 64 65 66 69 6e 65 20 53 48  E+1).# define SH
28430 4d 5f 52 45 43 4f 56 45 52 20 20 20 20 20 20 20  M_RECOVER       
28440 28 53 48 4d 5f 42 41 53 45 2b 32 29 0a 23 20 64  (SHM_BASE+2).# d
28450 65 66 69 6e 65 20 53 48 4d 5f 52 45 41 44 5f 46  efine SHM_READ_F
28460 49 52 53 54 20 20 20 20 28 53 48 4d 5f 42 41 53  IRST    (SHM_BAS
28470 45 2b 33 29 0a 23 20 64 65 66 69 6e 65 20 53 48  E+3).# define SH
28480 4d 5f 52 45 41 44 5f 53 49 5a 45 20 20 20 20 20  M_READ_SIZE     
28490 35 0a 23 65 6e 64 69 66 20 2f 2a 20 53 48 4d 5f  5.#endif /* SHM_
284a0 42 41 53 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  BASE */../*.** T
284b0 68 69 73 20 74 65 73 74 20 6f 6e 6c 79 20 77 6f  his test only wo
284c0 72 6b 73 20 66 6f 72 20 6c 6f 63 6b 20 74 65 73  rks for lock tes
284d0 74 69 6e 67 20 6f 6e 20 75 6e 69 78 2f 70 6f 73  ting on unix/pos
284e0 69 78 20 56 46 53 2e 0a 2a 2a 20 41 64 61 70 74  ix VFS..** Adapt
284f0 65 64 20 66 72 6f 6d 20 74 6f 6f 6c 2f 67 65 74  ed from tool/get
28500 6c 6f 63 6b 2e 63 20 66 34 63 33 39 62 36 35 31  lock.c f4c39b651
28510 33 37 30 31 35 36 63 61 65 39 37 39 35 30 31 61  370156cae979501a
28520 37 62 31 35 36 62 64 62 61 35 30 65 37 63 65 0a  7b156bdba50e7ce.
28530 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
28540 69 78 4c 6f 63 6b 73 74 61 74 65 50 69 64 28 75  ixLockstatePid(u
28550 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
28560 70 69 64 5f 74 20 70 69 64 2c 20 69 6e 74 20 2a  pid_t pid, int *
28570 70 4c 6f 63 6b 73 74 61 74 65 29 7b 0a 20 20 69  pLockstate){.  i
28580 6e 74 20 68 44 62 3b 20 20 20 20 20 20 20 20 2f  nt hDb;        /
28590 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
285a0 72 20 66 6f 72 20 74 68 65 20 6f 70 65 6e 20 64  r for the open d
285b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
285c0 20 20 69 6e 74 20 68 53 68 6d 20 3d 20 2d 31 3b    int hShm = -1;
285d0 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
285e0 70 74 6f 72 20 66 6f 72 20 57 41 4c 20 73 68 61  ptor for WAL sha
285f0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
28600 2a 2f 0a 20 20 73 73 69 7a 65 5f 74 20 67 6f 74  */.  ssize_t got
28610 3b 20 20 20 20 2f 2a 20 42 79 74 65 73 20 72 65  ;    /* Bytes re
28620 61 64 20 66 72 6f 6d 20 68 65 61 64 65 72 20 2a  ad from header *
28630 2f 0a 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20  /.  int isWal;  
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28650 2a 20 54 72 75 65 20 69 66 20 69 6e 20 57 41 4c  * True if in WAL
28660 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   mode */.  int n
28670 4c 6f 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  Lock = 0;       
28680 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28690 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  of locks held */
286a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
286b0 20 61 48 64 72 5b 31 30 30 5d 3b 20 20 20 2f 2a   aHdr[100];   /*
286c0 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72   Database header
286d0 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
286e0 70 4c 6f 63 6b 73 74 61 74 65 29 3b 0a 20 20 0a  pLockstate);.  .
286f0 20 20 2f 2a 20 6d 61 6b 65 20 73 75 72 65 20 77    /* make sure w
28700 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
28710 74 68 20 61 20 64 61 74 61 62 61 73 65 20 66 69  th a database fi
28720 6c 65 20 2a 2f 0a 20 20 68 44 62 20 3d 20 70 46  le */.  hDb = pF
28730 69 6c 65 2d 3e 68 3b 0a 20 20 69 66 28 20 68 44  ile->h;.  if( hD
28740 62 3c 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63  b<0 ){.    *pLoc
28750 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  kstate = SQLITE_
28760 4c 4f 43 4b 53 54 41 54 45 5f 45 52 52 4f 52 3b  LOCKSTATE_ERROR;
28770 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28780 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
28790 61 73 73 65 72 74 28 20 28 73 74 72 6c 65 6e 28  assert( (strlen(
287a0 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44  SQLITE_FILE_HEAD
287b0 45 52 29 2b 31 29 3d 3d 53 51 4c 49 54 45 5f 46  ER)+1)==SQLITE_F
287c0 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20 29  ILE_HEADER_LEN )
287d0 3b 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28  ;.  got = pread(
287e0 68 44 62 2c 20 61 48 64 72 2c 20 31 30 30 2c 20  hDb, aHdr, 100, 
287f0 30 29 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20  0);.  if( got<0 
28800 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61  ){.    *pLocksta
28810 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  te = SQLITE_LOCK
28820 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  STATE_ERROR;.   
28830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
28840 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
28850 67 6f 74 21 3d 31 30 30 20 7c 7c 20 6d 65 6d 63  got!=100 || memc
28860 6d 70 28 61 48 64 72 2c 20 53 51 4c 49 54 45 5f  mp(aHdr, SQLITE_
28870 46 49 4c 45 5f 48 45 41 44 45 52 2c 20 53 51 4c  FILE_HEADER, SQL
28880 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f  ITE_FILE_HEADER_
28890 4c 45 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 2a  LEN)!=0 ){.    *
288a0 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c  pLockstate = SQL
288b0 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4e 4f  ITE_LOCKSTATE_NO
288c0 54 41 44 42 3b 0a 20 20 20 20 72 65 74 75 72 6e  TADB;.    return
288d0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
288e0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 72 73    }.  .  /* Firs
288f0 74 20 63 68 65 63 6b 20 66 6f 72 20 61 6e 20 65  t check for an e
28900 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
28910 0a 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78  .  nLock += unix
28920 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 44  IsLocked(pid, hD
28930 62 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 41 52  b, F_RDLCK, SHAR
28940 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44  ED_FIRST, SHARED
28950 5f 53 49 5a 45 2c 20 22 45 58 43 4c 55 53 49 56  _SIZE, "EXCLUSIV
28960 45 22 29 3b 0a 20 20 69 73 57 61 6c 20 3d 20 61  E");.  isWal = a
28970 48 64 72 5b 31 38 5d 3d 3d 32 3b 0a 20 20 69 66  Hdr[18]==2;.  if
28980 28 20 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 69 73  ( nLock==0 && is
28990 57 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Wal==0 ){.    /*
289a0 20 52 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 2a   Rollback mode *
289b0 2f 0a 20 20 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75  /.    nLock += u
289c0 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c  nixIsLocked(pid,
289d0 20 68 44 62 2c 20 46 5f 57 52 4c 43 4b 2c 20 50   hDb, F_WRLCK, P
289e0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 53 48 41  ENDING_BYTE, SHA
289f0 52 45 44 5f 53 49 5a 45 2b 32 2c 20 22 50 45 4e  RED_SIZE+2, "PEN
28a00 44 49 4e 47 7c 52 45 53 45 52 56 45 44 7c 53 48  DING|RESERVED|SH
28a10 41 52 45 44 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ARED");.  }.  if
28a20 28 20 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 69 73  ( nLock==0 && is
28a30 57 61 6c 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Wal!=0 ){.    /*
28a40 20 6c 6f 6f 6b 75 70 20 74 68 65 20 66 69 6c 65   lookup the file
28a50 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
28a60 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
28a70 79 20 66 69 6c 65 20 69 66 20 77 65 20 68 61 76  y file if we hav
28a80 65 20 69 74 20 6f 70 65 6e 20 69 6e 20 74 68 69  e it open in thi
28a90 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20  s process */.   
28aa0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
28ab0 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
28ac0 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
28ad0 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
28ae0 65 61 64 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78  eads */.    unix
28af0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
28b00 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
28b10 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20  e->pShmNode;.   
28b20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b   if( pShmNode ){
28b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
28b40 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
28b50 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  ode->mutex);.   
28b60 20 20 20 0a 20 20 20 20 20 20 68 53 68 6d 20 3d     .      hShm =
28b70 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3b 0a 20 20   pShmNode->h;.  
28b80 20 20 20 20 69 66 28 20 68 53 68 6d 20 3e 3d 20      if( hShm >= 
28b90 30 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0){.        if( 
28ba0 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64  unixIsLocked(pid
28bb0 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c  , hShm, F_RDLCK,
28bc0 20 53 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31 2c   SHM_RECOVER, 1,
28bd0 20 22 57 41 4c 2d 52 45 43 4f 56 45 52 59 22 29   "WAL-RECOVERY")
28be0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 75   ||.           u
28bf0 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c  nixIsLocked(pid,
28c00 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20   hShm, F_RDLCK, 
28c10 53 48 4d 5f 57 52 49 54 45 2c 20 31 2c 20 22 57  SHM_WRITE, 1, "W
28c20 41 4c 2d 57 52 49 54 45 22 29 20 29 7b 0a 20 20  AL-WRITE") ){.  
28c30 20 20 20 20 20 20 20 20 6e 4c 6f 63 6b 20 3d 20          nLock = 
28c40 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
28c50 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
28c60 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
28c70 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
28c80 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 20 0a 20  mutex);.    } . 
28c90 20 20 20 0a 20 20 20 20 69 66 28 20 68 53 68 6d     .    if( hShm
28ca0 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74  <0 ){.      /* t
28cb0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
28cc0 20 66 69 6c 65 20 69 73 6e 27 74 20 6f 70 65 6e   file isn't open
28cd0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
28ce0 20 73 70 61 63 65 2c 20 6f 70 65 6e 20 6f 75 72   space, open our
28cf0 20 6f 77 6e 20 46 44 20 2a 2f 0a 20 20 20 20 20   own FD */.     
28d00 20 63 68 61 72 20 7a 53 68 6d 5b 4d 41 58 50 41   char zShm[MAXPA
28d10 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 0a 20  THLEN];.      . 
28d20 20 20 20 20 20 2f 2a 20 57 41 4c 20 6d 6f 64 65       /* WAL mode
28d30 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 6c 63 70   */.      strlcp
28d40 79 28 7a 53 68 6d 2c 20 70 46 69 6c 65 2d 3e 7a  y(zShm, pFile->z
28d50 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
28d60 29 3b 0a 20 20 20 20 20 20 73 74 72 6c 63 61 74  );.      strlcat
28d70 28 7a 53 68 6d 2c 20 22 2d 73 68 6d 22 2c 20 4d  (zShm, "-shm", M
28d80 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20  AXPATHLEN);.    
28d90 20 20 68 53 68 6d 20 3d 20 6f 70 65 6e 28 7a 53    hShm = open(zS
28da0 68 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29  hm, O_RDONLY, 0)
28db0 3b 0a 20 20 20 20 20 20 69 66 28 20 68 53 68 6d  ;.      if( hShm
28dc0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  <0 ){.        *p
28dd0 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49  Lockstate = SQLI
28de0 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 46 46  TE_LOCKSTATE_OFF
28df0 3b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 4c 65  ;.        unixLe
28e00 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
28e10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28e20 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
28e30 20 20 20 20 69 66 28 20 75 6e 69 78 49 73 4c 6f      if( unixIsLo
28e40 63 6b 65 64 28 70 69 64 2c 20 68 53 68 6d 2c 20  cked(pid, hShm, 
28e50 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 52 45 43  F_RDLCK, SHM_REC
28e60 4f 56 45 52 2c 20 31 2c 20 22 57 41 4c 2d 52 45  OVER, 1, "WAL-RE
28e70 43 4f 56 45 52 59 22 29 20 7c 7c 0a 20 20 20 20  COVERY") ||.    
28e80 20 20 20 20 20 75 6e 69 78 49 73 4c 6f 63 6b 65       unixIsLocke
28e90 64 28 70 69 64 2c 20 68 53 68 6d 2c 20 46 5f 52  d(pid, hShm, F_R
28ea0 44 4c 43 4b 2c 20 53 48 4d 5f 57 52 49 54 45 2c  DLCK, SHM_WRITE,
28eb0 20 31 2c 20 22 57 41 4c 2d 57 52 49 54 45 22 29   1, "WAL-WRITE")
28ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4c 6f 63   ){.        nLoc
28ed0 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  k = 1;.      }. 
28ee0 20 20 20 20 20 63 6c 6f 73 65 28 68 53 68 6d 29       close(hShm)
28ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  ;.    }.    unix
28f00 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
28f10 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 6b 3e 30 20  }.  if( nLock>0 
28f20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61  ){.    *pLocksta
28f30 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  te = SQLITE_LOCK
28f40 53 54 41 54 45 5f 4f 4e 3b 0a 20 20 7d 20 65 6c  STATE_ON;.  } el
28f50 73 65 20 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73  se {.    *pLocks
28f60 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f  tate = SQLITE_LO
28f70 43 4b 53 54 41 54 45 5f 4f 46 46 3b 0a 20 20 7d  CKSTATE_OFF;.  }
28f80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
28f90 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
28fa0 2a 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  * (SQLITE_ENABLE
28fb0 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26  _APPLE_SPI>0) &&
28fc0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
28fd0 5f 5f 29 20 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  __) */..../*.** 
28fe0 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
28ff0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
29000 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
29010 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
29020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29030 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
29040 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
29050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
29070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
290a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
290b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
290c0 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
290d0 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  n contains defin
290e0 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65  itions of sqlite
290f0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
29100 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70  ects that.** imp
29110 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66  lement various f
29120 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  ile locking stra
29130 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f  tegies.  It also
29140 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
29150 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e  tions.** of "fin
29160 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20  der" functions. 
29170 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69   A finder-functi
29180 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f  on is used to lo
29190 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  cate the appropr
291a0 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  iate.** sqlite3_
291b0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
291c0 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  t for a particul
291d0 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ar database file
291e0 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a  .  The pAppData.
291f0 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
29200 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20  sqlite3_vfs VFS 
29210 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74  objects are init
29220 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f  ialized to be po
29230 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  inters to.** the
29240 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d   correct finder-
29250 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61  function for tha
29260 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  t VFS..**.** Mos
29270 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  t finder functio
29280 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ns return a poin
29290 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
292a0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
292b0 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68  s.** object.  Th
292c0 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69  e only interesti
292d0 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ng finder-functi
292e0 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f  on is autolockIo
292f0 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a  Finder, which.**
29300 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69   looks at the fi
29310 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e  lesystem type an
29320 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73  d tries to guess
29330 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
29340 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72  g.** strategy fr
29350 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46  om that..**.** F
29360 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f  or finder-funtio
29370 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73  n F, two objects
29380 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a   are created:.**
29390 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72  .**    (1) The r
293a0 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  eal finder-funct
293b0 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74  ion named "FImpt
293c0 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ()"..**.**    (2
293d0 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69  ) A constant poi
293e0 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e  nter to this fun
293f0 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74  ction named just
29400 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41   "F"..**.**.** A
29410 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
29420 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65  F pointer is use
29430 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74  d as the pAppDat
29440 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a  a value for VFS.
29450 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20  ** objects.  We 
29460 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
29470 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69  instead of letti
29480 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e  ng pAppData poin
29490 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74  t.** directly at
294a0 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   the finder-func
294b0 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72  tion since C90 r
294c0 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76  ules prevent a v
294d0 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20  oid*.** from be 
294e0 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63  cast into a func
294f0 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  tion pointer..**
29500 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  .**.** Each inst
29510 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63  ance of this mac
29520 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ro generates two
29530 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20   objects:.**.** 
29540 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20    *  A constant 
29550 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29560 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d  ds object call M
29570 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c  ETHOD that has l
29580 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d  ocking.**      m
29590 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f  ethods CLOSE, LO
295a0 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45  CK, UNLOCK, CKRE
295b0 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  SLOCK..**.**   *
295c0 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20    An I/O method 
295d0 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  finder function 
295e0 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68  called FINDER th
295f0 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  at returns a poi
29600 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20  nter.**      to 
29610 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63  the METHOD objec
29620 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
29630 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65  s bullet..*/.#de
29640 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46  fine IOMETHODS(F
29650 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56  INDER, METHOD, V
29660 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c  ERSION, CLOSE, L
29670 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c  OCK, UNLOCK, CKL
29680 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61 74  OCK)      \.stat
29690 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
296a0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48  _io_methods METH
296b0 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20  OD = {          
296c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296d0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45           \.   VE
296e0 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
296f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
29700 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20  rsion */        
29710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29720 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f          \.   CLO
29730 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SE,             
29740 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
29750 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
29760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29770 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
29780 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
29790 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
297a0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
297b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297c0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57        \.   unixW
297d0 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
297e0 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
297f0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
29800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29810 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72       \.   unixTr
29820 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
29830 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
29840 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
29850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29860 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e      \.   unixSyn
29870 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
29880 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298b0 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
298c0 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
298d0 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
298e0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
298f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29900 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20    \.   LOCK,    
29910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29920 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20     /* xLock */  
29930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29950 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20   \.   UNLOCK,   
29960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29970 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20    /* xUnlock */ 
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299a0 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20  \.   CKLOCK,    
299b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299c0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
299d0 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  edLock */       
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
299f0 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  .   unixFileCont
29a00 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
29a10 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
29a20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
29a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29a40 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
29a50 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
29a60 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
29a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a80 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
29a90 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
29aa0 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a  acteristics,  /*
29ab0 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69   xDeviceCapabili
29ac0 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ties */         
29ad0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
29ae0 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20 20   unixShmMap,    
29af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b00 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20  xShmMap */      
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
29b30 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20  unixShmLock,    
29b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29b50 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  ShmLock */      
29b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b70 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
29b80 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20  nixShmBarrier,  
29b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
29ba0 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20  hmBarrier */    
29bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bc0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
29bd0 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20  ixShmUnmap      
29be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
29bf0 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20  mUnmap */       
29c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c10 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20          \.};    
29c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c60 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20         \.static 
29c70 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
29c80 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52  _methods *FINDER
29c90 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61  ##Impl(const cha
29ca0 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a  r *z, unixFile *
29cb0 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44  p){   \.  UNUSED
29cc0 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55  _PARAMETER(z); U
29cd0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29ce0 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p);             
29cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d00 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20       \.  return 
29d10 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20  &METHOD;        
29d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d50 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20      \.}         
29d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29da0 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
29db0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
29dc0 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49  hods *(*const FI
29dd0 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72  NDER)(const char
29de0 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20  *,unixFile *p)  
29df0 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52    \.    = FINDER
29e00 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48  ##Impl;../*.** H
29e10 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74  ere are all of t
29e20 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
29e30 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f  thods objects fo
29e40 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  r each of the.**
29e50 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
29e60 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20  ies.  Functions 
29e70 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e  that return poin
29e80 74 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65  ters to these me
29e90 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73  thods.** are als
29ea0 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f  o created..*/.IO
29eb0 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78  METHODS(.  posix
29ec0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
29ed0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
29ee0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
29ef0 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73    posixIoMethods
29f00 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
29f10 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29f20 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
29f30 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20  .  2,           
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29f50 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
29f60 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e   enabled */.  un
29f70 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ixClose,        
29f80 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
29f90 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  e method */.  un
29fa0 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ixLock,         
29fb0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
29fc0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
29fd0 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  xUnlock,        
29fe0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
29ff0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
2a000 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
2a010 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ock     /* xChec
2a020 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
2a030 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
2a040 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46  ODS(.  nolockIoF
2a050 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
2a060 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2a070 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f  ion name */.  no
2a080 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
2a090 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2a0a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2a0b0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
2a0c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a0d0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2a0e0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2a0f0 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  abled */.  noloc
2a100 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
2a110 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2a120 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
2a130 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
2a140 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2a150 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
2a160 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
2a170 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2a180 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
2a190 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
2a1a0 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ck   /* xCheckRe
2a1b0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2a1c0 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53  d */.).IOMETHODS
2a1d0 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e  (.  dotlockIoFin
2a1e0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  der,          /*
2a1f0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2a200 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f   name */.  dotlo
2a210 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
2a220 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2a230 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2a240 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
2a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a260 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2a270 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
2a280 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  ed */.  dotlockC
2a290 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2a2a0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2a2b0 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c  od */.  dotlockL
2a2c0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2a2d0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2a2e0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  d */.  dotlockUn
2a2f0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
2a300 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2a310 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  od */.  dotlockC
2a320 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2a330 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2a340 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2a350 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.)..#if SQLITE_
2a360 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2a370 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
2a380 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  RKS.IOMETHODS(. 
2a390 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20   flockIoFinder, 
2a3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2a3b0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
2a3c0 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d  me */.  flockIoM
2a3d0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2a3e0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
2a3f0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
2a400 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
2a410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a420 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
2a430 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
2a440 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c  */.  flockClose,
2a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a460 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
2a470 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20  */.  flockLock, 
2a480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a490 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
2a4a0 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  /.  flockUnlock,
2a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a4c0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
2a4d0 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52  */.  flockCheckR
2a4e0 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f  eservedLock    /
2a4f0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
2a500 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
2a510 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f  .#endif..#if OS_
2a520 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44  VXWORKS.IOMETHOD
2a530 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72  S(.  semIoFinder
2a540 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2a550 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2a560 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49  n name */.  semI
2a570 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
2a580 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2a590 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2a5a0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
2a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5c0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2a5d0 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2a5e0 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73  led */.  semClos
2a5f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2a600 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2a610 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b  hod */.  semLock
2a620 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a630 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2a640 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63  od */.  semUnloc
2a650 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2a660 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2a670 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63  hod */.  semChec
2a680 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
2a690 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
2a6a0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2a6b0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
2a6c0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2a6d0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2a6e0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2a6f0 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
2a700 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  afpIoFinder,    
2a710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2a720 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2a730 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68  e */.  afpIoMeth
2a740 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
2a750 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2a760 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2a770 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
2a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a790 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2a7a0 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2a7b0 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20  /.  afpClose,   
2a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a7d0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2a7e0 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20  /.  afpLock,    
2a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a800 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2a810 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20  .  afpUnlock,   
2a820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a830 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2a840 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65  /.  afpCheckRese
2a850 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
2a860 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2a870 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
2a880 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
2a890 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
2a8a0 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70  method is a "sup
2a8b0 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  er-method" in th
2a8c0 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a  e sense that it.
2a8d0 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61  ** opens seconda
2a8e0 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
2a8f0 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ors for the conc
2a900 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73  h and lock files
2a910 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20   and.** it uses 
2a920 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c  proxy, dot-file,
2a930 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28   AFP, and flock(
2a940 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  ) locking method
2a950 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65  s on those.** se
2a960 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20  condary files.  
2a970 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
2a980 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
2a990 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  at implements.**
2a9a0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
2a9b0 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66  s located much f
2a9c0 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74  urther down in t
2a9d0 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65  he file.  But we
2a9e0 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61   need.** to go a
2a9f0 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20  head and define 
2aa00 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
2aa10 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65  ethods and finde
2aa20 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  r function.** fo
2aa30 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  r proxy locking 
2aa40 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72  here.  So we for
2aa50 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65  ward declare the
2aa60 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f   I/O methods..*/
2aa70 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2aa80 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2aa90 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2aaa0 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e  _STYLE.static in
2aab0 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
2aac0 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
2aad0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
2aae0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
2aaf0 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
2ab00 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71  t proxyUnlock(sq
2ab10 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
2ab20 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
2ab30 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
2ab40 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
2ab50 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54  e*, int*);.IOMET
2ab60 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46  HODS(.  proxyIoF
2ab70 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
2ab80 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
2ab90 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
2aba0 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20  roxyIoMethods,  
2abb0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2abc0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2abd0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
2abe0 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
2abf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
2ac00 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e  red memory is en
2ac10 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79  abled */.  proxy
2ac20 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2ac30 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2ac40 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
2ac50 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2ac60 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2ac70 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55  thod */.  proxyU
2ac80 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2ac90 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2aca0 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
2acb0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2acc0 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k    /* xCheckRe
2acd0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2ace0 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f  d */.).#endif../
2acf0 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f  * nfs lockd on O
2ad00 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74  SX 10.3+ doesn't
2ad10 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63   clear write loc
2ad20 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  ks when a read l
2ad30 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69  ock is set */.#i
2ad40 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2ad50 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2ad60 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2ad70 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
2ad80 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20   nfsIoFinder,   
2ad90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2ada0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2adb0 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65  ame */.  nfsIoMe
2adc0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
2add0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
2ade0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2adf0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
2ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae10 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2ae20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
2ae30 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73  ed */.  unixClos
2ae40 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2ae50 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2ae60 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
2ae70 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2ae80 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
2ae90 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f  hod */.  nfsUnlo
2aea0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2aeb0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2aec0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
2aed0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2aee0 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
2aef0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
2af00 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
2af10 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2af20 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2af30 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2af40 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69  STYLE./* .** Thi
2af50 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  s "finder" funct
2af60 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
2af70 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65  determine the be
2af80 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  st locking strat
2af90 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20  egy .** for the 
2afa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66  database file "f
2afb0 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68  ilePath".  It th
2afc0 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  en returns the s
2afd0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2afe0 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  s.** object that
2aff0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74   implements that
2b000 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a   strategy..**.**
2b010 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63   This is for Mac
2b020 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  OSX only..*/.sta
2b030 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2b040 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75  3_io_methods *au
2b050 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
2b060 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pl(.  const char
2b070 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f   *filePath,    /
2b080 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
2b090 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2b0a0 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
2b0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65            /* ope
2b0c0 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f  n file object fo
2b0d0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
2b0e0 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  ile */.){.  stat
2b0f0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
2b100 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f  Mapping {.    co
2b110 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73  nst char *zFiles
2b120 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20  ystem;          
2b130 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65      /* Filesyste
2b140 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20  m type name */. 
2b150 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
2b160 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65  _io_methods *pMe
2b170 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72  thods;   /* Appr
2b180 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
2b190 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d  method */.  } aM
2b1a0 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ap[] = {.    { "
2b1b0 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49  hfs",    &posixI
2b1c0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
2b1d0 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73  { "ufs",    &pos
2b1e0 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
2b1f0 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26     { "afpfs",  &
2b200 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  afpIoMethods },.
2b210 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20      { "smbfs",  
2b220 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
2b230 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c  .    { "webdav",
2b240 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2b250 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20  s },.    { 0, 0 
2b260 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
2b270 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
2b280 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  fsInfo;.  struct
2b290 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b   flock lockInfo;
2b2a0 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74  ..  if( !filePat
2b2b0 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66  h ){.    /* If f
2b2c0 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68  ilePath==NULL th
2b2d0 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  at means we are 
2b2e0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74  dealing with a t
2b2f0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20  ransient file.  
2b300 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
2b310 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
2b320 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74  cked. */.    ret
2b330 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
2b340 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  hods;.  }.  if( 
2b350 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c  statfs(filePath,
2b360 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20   &fsInfo) != -1 
2b370 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66  ){.    if( fsInf
2b380 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f  o.f_flags & MNT_
2b390 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  RDONLY ){.      
2b3a0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
2b3b0 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
2b3c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70     for(i=0; aMap
2b3d0 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b  [i].zFilesystem;
2b3e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
2b3f0 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
2b400 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61  _fstypename, aMa
2b410 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
2b420 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2b430 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70  return aMap[i].p
2b440 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d  Methods;.      }
2b450 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2b460 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48   Default case. H
2b470 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20  andles, amongst 
2b480 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20  others, "nfs".. 
2b490 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61   ** Test byte-ra
2b4a0 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66  nge lock using f
2b4b0 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63  cntl(). If the c
2b4c0 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20  all succeeds, . 
2b4d0 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
2b4e0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2b4f0 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73  supports POSIX s
2b500 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a  tyle locks. .  *
2b510 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
2b520 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
2b530 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
2b540 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
2b550 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
2b560 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
2b570 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
2b580 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d  f( osFcntl(pNew-
2b590 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
2b5a0 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a  ckInfo)!=-1 ) {.
2b5b0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
2b5c0 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
2b5d0 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b  me, "nfs")==0 ){
2b5e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
2b5f0 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  fsIoMethods;.   
2b600 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
2b610 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
2b620 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20  ethods;.    }.  
2b630 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2b640 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  n &dotlockIoMeth
2b650 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  ods;.  }.}.stati
2b660 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2b670 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28  io_methods .  *(
2b680 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49  *const autolockI
2b690 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
2b6a0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
2b6b0 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  = autolockIoFind
2b6c0 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
2b6d0 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
2b6e0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2b6f0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2b700 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f  TYLE */..#if OS_
2b710 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54  VXWORKS && SQLIT
2b720 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2b730 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
2b740 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
2b750 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
2b760 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
2b770 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
2b780 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
2b790 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
2b7a0 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
2b7b0 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
2b7c0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2b7d0 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
2b7e0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
2b7f0 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
2b800 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 56 58  * This is for VX
2b810 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  Works only..*/.s
2b820 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2b830 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2b840 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2b850 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
2b860 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
2b870 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
2b880 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2b890 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
2b8a0 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  w           /* t
2b8b0 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  he open file obj
2b8c0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ect */.){.  stru
2b8d0 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
2b8e0 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
2b8f0 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
2b900 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
2b910 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
2b920 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
2b930 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
2b940 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
2b950 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2b960 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
2b970 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
2b980 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f  ethods;.  }..  /
2b990 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28  * Test if fcntl(
2b9a0 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61  ) is supported a
2b9b0 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79  nd use POSIX sty
2b9c0 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f  le locks..  ** O
2b9d0 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61  therwise fall ba
2b9e0 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20  ck to the named 
2b9f0 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64  semaphore method
2ba00 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66  ..  */.  lockInf
2ba10 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
2ba20 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
2ba30 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
2ba40 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
2ba50 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
2ba60 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
2ba70 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
2ba80 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
2ba90 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
2baa0 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
2bab0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
2bac0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2bad0 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f  turn &semIoMetho
2bae0 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
2baf0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2bb00 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
2bb10 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f  const autolockIo
2bb20 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
2bb30 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
2bb40 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
2bb50 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
2bb60 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  * OS_VXWORKS && 
2bb70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2bb80 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
2bb90 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63  /*.** An abstrac
2bba0 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69  t type for a poi
2bbb0 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65 74  nter to a IO met
2bbc0 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
2bbd0 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion:.*/.typedef 
2bbe0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2bbf0 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64  _methods *(*find
2bc00 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63  er_type)(const c
2bc10 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b  har*,unixFile*);
2bc20 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
2bc30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bc40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bc50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bc60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bc70 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2bc80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
2bc90 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
2bca0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
2bcb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2bcc0 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
2bcd0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
2bce0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2bcf0 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
2bd00 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
2bd10 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  object..*/../*.*
2bd20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2bd30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2bd40 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
2bd50 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
2bd60 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  y pId..*/.static
2bd70 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
2bd80 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ile(.  sqlite3_v
2bd90 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
2bda0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
2bdb0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
2bdc0 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
2bdd0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
2bde0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20  e descriptor of 
2bdf0 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
2be00 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  d */.  int dirfd
2be10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2be20 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65  * Directory file
2be30 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
2be40 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
2be50 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74  Id,      /* Writ
2be60 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c  e to the unixFil
2be70 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  e structure here
2be80 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2be90 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
2bea0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
2beb0 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
2bec0 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20  /.  int noLock, 
2bed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2bee0 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74  mit locking if t
2bef0 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  rue */.  int isD
2bf00 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
2bf10 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
2bf20 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
2bf30 20 69 6e 74 20 69 73 52 65 61 64 4f 6e 6c 79 20   int isReadOnly 
2bf40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2bf50 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
2bf60 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79  opened read-only
2bf70 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73   */.){.  const s
2bf80 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2bf90 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  s *pLockingStyle
2bfa0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
2bfb0 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
2bfc0 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  )pId;.  int rc =
2bfd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2bfe0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e  ssert( pNew->pIn
2bff0 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20  ode==NULL );..  
2c000 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 69 73 44  /* Parameter isD
2c010 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20 75 73  elete is only us
2c020 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45  ed on vxworks. E
2c030 78 70 72 65 73 73 20 74 68 69 73 20 65 78 70 6c  xpress this expl
2c040 69 63 69 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72  icitly .  ** her
2c050 65 20 74 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d  e to prevent com
2c060 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
2c070 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61  bout unused para
2c080 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55  meters..  */.  U
2c090 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2c0a0 69 73 44 65 6c 65 74 65 29 3b 0a 0a 20 20 2f 2a  isDelete);..  /*
2c0b0 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70 61 74   Usually the pat
2c0c0 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75  h zFilename shou
2c0d0 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65 6c 61  ld not be a rela
2c0e0 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 54  tive pathname. T
2c0f0 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74 69 6f  he.  ** exceptio
2c100 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e  n is when openin
2c110 67 20 74 68 65 20 70 72 6f 78 79 20 22 63 6f 6e  g the proxy "con
2c120 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75 69 6c  ch" file in buil
2c130 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63  ds that.  ** inc
2c140 6c 75 64 65 20 74 68 65 20 73 70 65 63 69 61 6c  lude the special
2c150 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73   Apple locking s
2c160 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20  tyles..  */.#if 
2c170 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2c180 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2c190 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2c1a0 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  E.  assert( zFil
2c1b0 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
2c1c0 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20  ename[0]=='/' . 
2c1d0 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70     || pVfs->pApp
2c1e0 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75  Data==(void*)&au
2c1f0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  tolockIoFinder )
2c200 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74  ;.#else.  assert
2c210 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
2c220 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
2c230 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  '/' );.#endif.. 
2c240 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
2c250 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68     %-3d %s\n", h
2c260 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
2c270 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20   pNew->h = h;.  
2c280 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20 64 69  pNew->dirfd = di
2c290 72 66 64 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61  rfd;.  pNew->zPa
2c2a0 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
2c2b0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 56 66    if( memcmp(pVf
2c2c0 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65  s->zName,"unix-e
2c2d0 78 63 6c 22 2c 31 30 29 3d 3d 30 20 29 7b 0a 20  xcl",10)==0 ){. 
2c2e0 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2c2f0 67 73 20 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58  gs = UNIXFILE_EX
2c300 43 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  CL;.  }else{.   
2c310 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2c320 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
2c330 69 73 52 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  isReadOnly ){.  
2c340 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2c350 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44  s |= UNIXFILE_RD
2c360 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f  ONLY;.  }..#if O
2c370 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77  S_VXWORKS.  pNew
2c380 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46  ->pId = vxworksF
2c390 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e  indFileId(zFilen
2c3a0 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ame);.  if( pNew
2c3b0 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pId==0 ){.    
2c3c0 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  noLock = 1;.    
2c3d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2c3e0 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  M;.  }.#endif.. 
2c3f0 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20   if( noLock ){. 
2c400 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
2c410 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68   = &nolockIoMeth
2c420 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
2c430 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
2c440 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70  = (**(finder_typ
2c450 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74  e*)pVfs->pAppDat
2c460 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e  a)(zFilename, pN
2c470 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ew);.#if SQLITE_
2c480 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2c490 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68  TYLE.    /* Cach
2c4a0 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74  e zFilename in t
2c4b0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
2c4c0 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c  xt (AFP and dotl
2c4d0 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f  ock override) fo
2c4e0 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f  r.    ** proxyLo
2c4f0 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73  ck activation is
2c500 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74   possible (remot
2c510 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64  e proxy is based
2c520 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20   on db name).   
2c530 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65   ** zFilename re
2c540 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
2c550 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
2c560 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a  , to support */.
2c570 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
2c580 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64  gContext = (void
2c590 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e  *)zFilename;.#en
2c5a0 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
2c5b0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2c5c0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a  &posixIoMethods.
2c5d0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2c5e0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2c5f0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2c600 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f  STYLE.    || pLo
2c610 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e  ckingStyle == &n
2c620 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64  fsIoMethods.#end
2c630 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78  if.  ){.    unix
2c640 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2c650 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
2c660 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
2c670 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
2c680 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c690 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
2c6a0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
2c6b0 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   in findInodeInf
2c6c0 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66  o(), close the f
2c6d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20  ile descriptor. 
2c6e0 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74       ** immediat
2c6f0 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65  ely, before rele
2c700 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e  asing the mutex.
2c710 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
2c720 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20   may fail.      
2c730 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ** in two scenar
2c740 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ios:.      **.  
2c750 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63      **   (a) A c
2c760 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66  all to fstat() f
2c770 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  ailed..      ** 
2c780 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66    (b) A malloc f
2c790 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ailed..      **.
2c7a0 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69        ** Scenari
2c7b0 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f  o (b) may only o
2c7c0 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63  ccur if the proc
2c7d0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e  ess is holding n
2c7e0 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  o other.      **
2c7f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2c800 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  s open on the sa
2c810 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  me file. If ther
2c820 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c  e were other fil
2c830 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
2c840 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66  iptors on this f
2c850 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c  ile, then no mal
2c860 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71  loc would be req
2c870 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
2c880 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  * findInodeInfo(
2c890 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ). If this is th
2c8a0 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75  e case, it is qu
2c8b0 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73  ite safe to clos
2c8c0 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c  e.      ** handl
2c8d0 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67  e h - as it is g
2c8e0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e  uaranteed that n
2c8f0 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69  o posix locks wi
2c900 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20  ll be released. 
2c910 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67       ** by doing
2c920 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20   so..      **.  
2c930 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72      ** If scenar
2c940 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68  io (a) caused th
2c950 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69  e error then thi
2c960 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73  ngs are not so s
2c970 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  afe. The.      *
2c980 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d  * implicit assum
2c990 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68  ption here is th
2c9a0 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61  at if fstat() fa
2c9b0 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20  ils, things are 
2c9c0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68  in.      ** such
2c9d0 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20   bad shape that 
2c9e0 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20  dropping a lock 
2c9f0 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d  or two doesn't m
2ca00 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20  atter much..    
2ca10 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73    */.      robus
2ca20 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
2ca30 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2ca40 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    h = -1;.    }.
2ca50 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2ca60 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  ex();.  }..#if S
2ca70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2ca80 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
2ca90 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2caa0 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
2cab0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66  kingStyle == &af
2cac0 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
2cad0 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67    /* AFP locking
2cae0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
2caf0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
2cb00 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
2cb10 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70  n.    ** the afp
2cb20 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a  LockingContext..
2cb30 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f      */.    afpLo
2cb40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
2cb50 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f  tx;.    pNew->lo
2cb60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
2cb70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ctx = sqlite3_ma
2cb80 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
2cb90 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  tx) );.    if( p
2cba0 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ctx==0 ){.      
2cbb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2cbc0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
2cbd0 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65      /* NB: zFile
2cbe0 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20  name exists and 
2cbf0 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
2cc00 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20  til the file is 
2cc10 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  closed.      ** 
2cc20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71  according to req
2cc30 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e  uirement F11141.
2cc40 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e    So we do not n
2cc50 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20  eed to make a.  
2cc60 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
2cc70 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  he filename. */.
2cc80 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61        pCtx->dbPa
2cc90 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
2cca0 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65        pCtx->rese
2ccb0 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rved = 0;.      
2ccc0 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20  srandomdev();.  
2ccd0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2cce0 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ex();.      rc =
2ccf0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
2cd00 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
2cd10 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  de);.      if( r
2cd20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2cd30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2cd40 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69  free(pNew->locki
2cd50 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
2cd60 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
2cd70 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
2cd80 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d  __);.        h =
2cd90 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
2cda0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2cdb0 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20  x();        .   
2cdc0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2cdd0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2cde0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c  ngStyle == &dotl
2cdf0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
2ce00 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c      /* Dotfile l
2ce10 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
2ce20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
2ce30 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
2ce40 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
2ce50 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  he dotlockLockin
2ce60 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f  gContext .    */
2ce70 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  .    char *zLock
2ce80 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46  File;.    int nF
2ce90 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 6e 46 69  ilename;.    nFi
2cea0 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74  lename = (int)st
2ceb0 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20  rlen(zFilename) 
2cec0 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69  + 6;.    zLockFi
2ced0 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  le = (char *)sql
2cee0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c  ite3_malloc(nFil
2cef0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
2cf00 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a  zLockFile==0 ){.
2cf10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2cf20 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
2cf30 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2cf40 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65  3_snprintf(nFile
2cf50 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c  name, zLockFile,
2cf60 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55   "%s" DOTLOCK_SU
2cf70 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  FFIX, zFilename)
2cf80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
2cf90 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2cfa0 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20   = zLockFile;.  
2cfb0 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  }..#if OS_VXWORK
2cfc0 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  S.  else if( pLo
2cfd0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73  ckingStyle == &s
2cfe0 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  emIoMethods ){. 
2cff0 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61     /* Named sema
2d000 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73  phore locking us
2d010 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
2d020 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
2d030 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64  be.    ** includ
2d040 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63  ed in the semLoc
2d050 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20  kingContext.    
2d060 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  */.    unixEnter
2d070 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
2d080 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
2d090 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
2d0a0 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72  ode);.    if( (r
2d0b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
2d0c0 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e   (pNew->pInode->
2d0d0 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20  pSem==NULL) ){. 
2d0e0 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e       char *zSemN
2d0f0 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f  ame = pNew->pIno
2d100 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20  de->aSemName;.  
2d110 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
2d120 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2d130 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
2d140 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73  zSemName, "/%s.s
2d150 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  em",.           
2d160 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
2d170 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
2d180 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f  lName);.      fo
2d190 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65  r( n=1; zSemName
2d1a0 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20  [n]; n++ ).     
2d1b0 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b     if( zSemName[
2d1c0 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61  n]=='/' ) zSemNa
2d1d0 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20  me[n] = '_';.   
2d1e0 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
2d1f0 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e  >pSem = sem_open
2d200 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45  (zSemName, O_CRE
2d210 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20  AT, 0666, 1);.  
2d220 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49      if( pNew->pI
2d230 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45  node->pSem == SE
2d240 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  M_FAILED ){.    
2d250 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2d260 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
2d270 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65  New->pInode->aSe
2d280 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b  mName[0] = '\0';
2d290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2d2a0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2d2b0 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  x();.  }.#endif.
2d2c0 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45    .  pNew->lastE
2d2d0 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53  rrno = 0;.#if OS
2d2e0 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
2d2f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d300 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72      if( h>=0 ) r
2d310 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2d320 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
2d330 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
2d340 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  unlink(zFilename
2d350 29 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20  );.    isDelete 
2d360 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  = 0;.  }.  pNew-
2d370 3e 69 73 44 65 6c 65 74 65 20 3d 20 69 73 44 65  >isDelete = isDe
2d380 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69  lete;.#endif.  i
2d390 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d3a0 20 29 7b 0a 20 20 20 20 69 66 28 20 64 69 72 66   ){.    if( dirf
2d3b0 64 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c  d>=0 ) robust_cl
2d3c0 6f 73 65 28 70 4e 65 77 2c 20 64 69 72 66 64 2c  ose(pNew, dirfd,
2d3d0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2d3e0 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73  if( h>=0 ) robus
2d3f0 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
2d400 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65   __LINE__);.  }e
2d410 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  lse{.    pNew->p
2d420 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e  Method = pLockin
2d430 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e  gStyle;.    Open
2d440 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d  Counter(+1);.  }
2d450 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d460 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69  ./*.** Open a fi
2d470 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
2d480 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
2d490 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a  ontaining file z
2d4a0 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20  Filename..** If 
2d4b0 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64  successful, *pFd
2d4c0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
2d4d0 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72  pened file descr
2d4e0 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c  iptor and.** SQL
2d4f0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2d500 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
2d510 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72 20 53  occurs, either S
2d520 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f  QLITE_NOMEM.** o
2d530 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r SQLITE_CANTOPE
2d540 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  N is returned an
2d550 64 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  d *pFd is set to
2d560 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a   an undefined.**
2d570 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   value..**.** If
2d580 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2d590 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c  turned, the call
2d5a0 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
2d5b0 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a  e for closing.**
2d5c0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
2d5d0 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20  ptor *pFd using 
2d5e0 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  close()..*/.stat
2d5f0 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63  ic int openDirec
2d600 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20  tory(const char 
2d610 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20  *zFilename, int 
2d620 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b  *pFd){.  int ii;
2d630 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
2d640 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b    char zDirname[
2d650 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
2d660 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
2d670 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
2d680 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73  E, zDirname, "%s
2d690 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
2d6a0 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72   for(ii=(int)str
2d6b0 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69  len(zDirname); i
2d6c0 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b  i>1 && zDirname[
2d6d0 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b  ii]!='/'; ii--);
2d6e0 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20  .  if( ii>0 ){. 
2d6f0 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20     zDirname[ii] 
2d700 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d  = '\0';.    fd =
2d710 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69   robust_open(zDi
2d720 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
2d730 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
2d740 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23    if( fd>=0 ){.#
2d750 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43  ifdef FD_CLOEXEC
2d760 0a 20 20 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  .      osFcntl(f
2d770 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63  d, F_SETFD, osFc
2d780 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
2d790 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
2d7a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
2d7b0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49  OSTRACE(("OPENDI
2d7c0 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64  R %-3d %s\n", fd
2d7d0 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20  , zDirname));.  
2d7e0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d    }.  }.  *pFd =
2d7f0 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66   fd;.  return (f
2d800 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75  d>=0?SQLITE_OK:u
2d810 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
2d820 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2d830 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61  , "open", zDirna
2d840 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  me));.}../*.** R
2d850 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
2d860 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e  f a directory in
2d870 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65   which to put te
2d880 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a  mporary files..*
2d890 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
2d8a0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2d8b0 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65  directory can be
2d8c0 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e   found, return N
2d8d0 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ULL..*/.static c
2d8e0 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54  onst char *unixT
2d8f0 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29  empFileDir(void)
2d900 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
2d910 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
2d920 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  = {.     0,.    
2d930 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74   0,.     "/var/t
2d940 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f  mp",.     "/usr/
2d950 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70  tmp",.     "/tmp
2d960 22 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20 20  ",.     0       
2d970 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61   /* List termina
2d980 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e  tor */.  };.  un
2d990 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
2d9a0 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
2d9b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2d9c0 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69  Dir = 0;..  azDi
2d9d0 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f  rs[0] = sqlite3_
2d9e0 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
2d9f0 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d    if( !azDirs[1]
2da00 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67   ) azDirs[1] = g
2da10 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b  etenv("TMPDIR");
2da20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
2da30 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
2da40 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
2da50 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d  zDir=azDirs[i++]
2da60 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d  ){.    if( zDir=
2da70 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2da80 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44     if( osStat(zD
2da90 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74  ir, &buf) ) cont
2daa0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53  inue;.    if( !S
2dab0 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f  _ISDIR(buf.st_mo
2dac0 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  de) ) continue;.
2dad0 20 20 20 20 69 66 28 20 6f 73 41 63 63 65 73 73      if( osAccess
2dae0 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e  (zDir, 07) ) con
2daf0 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b  tinue;.    break
2db00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
2db10 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  Dir;.}../*.** Cr
2db20 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
2db30 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
2db40 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
2db50 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  e allocated.** b
2db60 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  y the calling pr
2db70 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62  ocess and must b
2db80 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  e big enough to 
2db90 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a  hold at least.**
2dba0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2dbb0 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  e bytes..*/.stat
2dbc0 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65  ic int unixGetTe
2dbd0 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
2dbe0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
2dbf0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
2dc00 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72  igned char zChar
2dc10 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
2dc20 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
2dc30 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
2dc40 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
2dc50 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
2dc60 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69  3456789";.  unsi
2dc70 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  gned int i, j;. 
2dc80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
2dc90 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  r;..  /* It's od
2dca0 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
2dcb0 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
2dcc0 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
2dcd0 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
2dce0 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
2dcf0 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
2dd00 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
2dd10 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
2dd20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
2dd30 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53  iling. .  */.  S
2dd40 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
2dd50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2dd60 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d  ERR );..  zDir =
2dd70 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72   unixTempFileDir
2dd80 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d  ();.  if( zDir==
2dd90 30 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a  0 ) zDir = ".";.
2dda0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
2ddb0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
2ddc0 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
2ddd0 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
2dde0 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
2ddf0 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e  name. If it is n
2de00 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
2de10 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20  E_ERROR..  */.  
2de20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72  if( (strlen(zDir
2de30 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54  ) + strlen(SQLIT
2de40 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
2de50 49 58 29 20 2b 20 31 37 29 20 3e 3d 20 28 73 69  IX) + 17) >= (si
2de60 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20  ze_t)nBuf ){.   
2de70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2de80 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b  RROR;.  }..  do{
2de90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2dea0 72 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a  rintf(nBuf-17, z
2deb0 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45  Buf, "%s/"SQLITE
2dec0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
2ded0 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20  X, zDir);.    j 
2dee0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42  = (int)strlen(zB
2def0 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  uf);.    sqlite3
2df00 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
2df10 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66  &zBuf[j]);.    f
2df20 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
2df30 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  +, j++){.      z
2df40 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
2df50 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
2df60 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
2df70 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
2df80 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1) ];.    }.    
2df90 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d  zBuf[j] = 0;.  }
2dfa0 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28  while( osAccess(
2dfb0 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20  zBuf,0)==0 );.  
2dfc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2dfd0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
2dfe0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2dff0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
2e000 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
2e010 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e   Routine to tran
2e020 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65  sform a unixFile
2e030 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f   into a proxy-lo
2e040 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a  cking unixFile..
2e050 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
2e060 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c  n in the proxy-l
2e070 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75  ock division, bu
2e080 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70  t used by unixOp
2e090 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54  en().** if SQLIT
2e0a0 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
2e0b0 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65  OCKING is define
2e0c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2e0d0 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
2e0e0 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
2e0f0 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  *, const char*);
2e100 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
2e110 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
2e120 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
2e130 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65  tor that was ope
2e140 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ned on the datab
2e150 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f  ase .** file (no
2e160 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d  t a journal or m
2e170 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
2e180 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20 62  le) identified b
2e190 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50  y pathname.** zP
2e1a0 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ath with SQLITE_
2e1b0 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d  OPEN_XXX flags m
2e1c0 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61  atching those pa
2e1d0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2e1e0 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  nd.** argument t
2e1f0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
2e200 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69  .**.** Such a fi
2e210 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61  le descriptor ma
2e220 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61 74  y exist if a dat
2e230 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2e240 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62   was closed.** b
2e250 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  ut the associate
2e260 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
2e270 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63  r could not be c
2e280 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73 6f  losed because so
2e290 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65  me.** other file
2e2a0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e   descriptor open
2e2b0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
2e2c0 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66  e is holding a f
2e2d0 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66  ile-lock..** Ref
2e2e0 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69  er to comments i
2e2f0 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28  n the unixClose(
2e300 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74  ) function and t
2e310 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65  he lengthy comme
2e320 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67  nt.** describing
2e330 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79   "Posix Advisory
2e340 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65   Locking" at the
2e350 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 66   start of this f
2e360 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74  ile for .** furt
2e370 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73  her details. Als
2e380 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e  o, ticket #4018.
2e390 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74  .**.** If a suit
2e3a0 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  able file descri
2e3b0 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  ptor is found, t
2e3c0 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e  hen it is return
2e3d0 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63  ed. If no.** suc
2e3e0 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  h file descripto
2e3f0 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31  r is located, -1
2e400 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2e410 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73  .static UnixUnus
2e420 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62  edFd *findReusab
2e430 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20  leFd(const char 
2e440 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67  *zPath, int flag
2e450 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  s){.  UnixUnused
2e460 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b  Fd *pUnused = 0;
2e470 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65  ..  /* Do not se
2e480 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73  arch for an unus
2e490 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
2e4a0 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e  or on vxworks. N
2e4b0 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20  ot because.  ** 
2e4c0 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f  vxworks would no
2e4d0 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74  t benefit from t
2e4e0 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69  he change (it mi
2e4f0 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73  ght, we're not s
2e500 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62  ure),.  ** but b
2e510 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f  ecause no way to
2e520 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72 72   test it is curr
2e530 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e  ently available.
2e540 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a 20   It is better . 
2e550 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20   ** not to risk 
2e560 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73  breaking vxworks
2e570 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65   support for the
2e580 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e   sake of such an
2e590 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66   obscure .  ** f
2e5a0 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20  eature.  */.#if 
2e5b0 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74  !OS_VXWORKS.  st
2e5c0 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
2e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5e0 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66     /* Results of
2e5f0 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a   stat() call */.
2e600 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63  .  /* A stat() c
2e610 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72  all may fail for
2e620 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73   various reasons
2e630 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
2e640 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c  s, it is.  ** al
2e650 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61  most certain tha
2e660 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c  t an open() call
2e670 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74   on the same pat
2e680 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c  h will also fail
2e690 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20  ..  ** For this 
2e6a0 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72  reason, if an er
2e6b0 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68  ror occurs in th
2e6c0 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65  e stat() call he
2e6d0 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69  re, it is.  ** i
2e6e0 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73  gnored and -1 is
2e6f0 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63   returned. The c
2e700 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74  aller will try t
2e710 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  o open a new fil
2e720 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f  e.  ** descripto
2e730 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  r on the same pa
2e740 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65  th, fail, and re
2e750 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f  turn an error to
2e760 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20   SQLite..  **.  
2e770 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75 62  ** Even if a sub
2e780 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63  sequent open() c
2e790 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64  all does succeed
2e7a0 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63  , the consequenc
2e7b0 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73  es of.  ** not s
2e7c0 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72  earching for a r
2e7d0 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65  esusable file de
2e7e0 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74  scriptor are not
2e7f0 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28   dire.  */.  if(
2e800 20 30 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c 20   0==stat(zPath, 
2e810 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75  &sStat) ){.    u
2e820 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
2e830 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45  node;..    unixE
2e840 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
2e850 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
2e860 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ist;.    while( 
2e870 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64  pInode && (pInod
2e880 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73  e->fileId.dev!=s
2e890 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20  Stat.st_dev.    
2e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8b0 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65   || pInode->file
2e8c0 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74  Id.ino!=sStat.st
2e8d0 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  _ino) ){.       
2e8e0 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
2e8f0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
2e900 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a    if( pInode ){.
2e910 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64        UnixUnused
2e920 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66  Fd **pp;.      f
2e930 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70  or(pp=&pInode->p
2e940 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28  Unused; *pp && (
2e950 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61  *pp)->flags!=fla
2e960 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e  gs; pp=&((*pp)->
2e970 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70  pNext));.      p
2e980 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20  Unused = *pp;.  
2e990 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
2e9a0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d  ){.        *pp =
2e9b0 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b   pUnused->pNext;
2e9c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e9d0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2e9e0 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  x();.  }.#endif 
2e9f0 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57     /* if !OS_VXW
2ea00 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ORKS */.  return
2ea10 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a   pUnused;.}../*.
2ea20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2ea30 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e   is called by un
2ea40 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65  ixOpen() to dete
2ea50 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70  rmine the unix p
2ea60 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f  ermissions.** to
2ea70 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65   create new file
2ea80 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72  s with. If no er
2ea90 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
2eaa0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2eab0 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20  turned.** and a 
2eac0 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66  value suitable f
2ead0 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74 68  or passing as th
2eae0 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
2eaf0 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a   to open(2) is.*
2eb00 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d  * written to *pM
2eb10 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ode. If an IO er
2eb20 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
2eb30 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
2eb40 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
2eb50 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
2eb60 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20  f *pMode is not 
2eb70 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
2eb80 49 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  If the file bein
2eb90 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 74 65  g opened is a te
2eba0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 69 74  mporary file, it
2ebb0 20 69 73 20 61 6c 77 61 79 73 20 63 72 65 61 74   is always creat
2ebc0 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6f  ed with.** the o
2ebd0 63 74 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73  ctal permissions
2ebe0 20 30 36 30 30 20 28 72 65 61 64 2f 77 72 69 74   0600 (read/writ
2ebf0 61 62 6c 65 20 62 79 20 6f 77 6e 65 72 20 6f 6e  able by owner on
2ec00 6c 79 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65  ly). If the file
2ec10 0a 2a 2a 20 69 73 20 61 20 64 61 74 61 62 61 73  .** is a databas
2ec20 65 20 6f 72 20 6d 61 73 74 65 72 20 6a 6f 75 72  e or master jour
2ec30 6e 61 6c 20 66 69 6c 65 2c 20 69 74 20 69 73 20  nal file, it is 
2ec40 63 72 65 61 74 65 64 20 77 69 74 68 20 74 68 65  created with the
2ec50 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a   permissions .**
2ec60 20 6d 61 73 6b 20 53 51 4c 49 54 45 5f 44 45 46   mask SQLITE_DEF
2ec70 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
2ec80 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e  SIONS..**.** Fin
2ec90 61 6c 6c 79 2c 20 69 66 20 74 68 65 20 66 69 6c  ally, if the fil
2eca0 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69  e being opened i
2ecb0 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c  s a WAL or regul
2ecc0 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ar journal file,
2ecd0 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66   then .** this f
2ece0 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20  unction queries 
2ecf0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2ed00 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69  for the permissi
2ed10 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63  ons on the .** c
2ed20 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74  orresponding dat
2ed30 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73  abase file and s
2ed40 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68  ets *pMode to th
2ed50 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76  is value. Whenev
2ed60 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c  er .** possible,
2ed70 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c   WAL and journal
2ed80 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
2ed90 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
2eda0 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a  e permissions .*
2edb0 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61  * as the associa
2edc0 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
2edd0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
2ede0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
2edf0 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69  3_NAMES option i
2ee00 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
2ee10 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
2ee20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76  filename is unav
2ee30 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f  ailable.  But 8_
2ee40 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20  3_NAMES is only 
2ee50 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20  used for.** FAT 
2ee60 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20  filesystems and 
2ee70 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e  permissions do n
2ee80 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c  ot matter there,
2ee90 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20   so just use.** 
2eea0 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d  the default perm
2eeb0 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  issions..*/.stat
2eec0 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74  ic int findCreat
2eed0 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e  eFileMode(.  con
2eee0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2eef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ef00 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f  Path of file (po
2ef10 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72  ssibly) being cr
2ef20 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66  eated */.  int f
2ef30 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2ef40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
2ef50 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74  ags passed as 4t
2ef60 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f  h argument to xO
2ef70 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f  pen() */.  mode_
2ef80 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20  t *pMode,       
2ef90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2efa0 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  T: Permissions t
2efb0 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68  o open file with
2efc0 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69   */.  uid_t *pUi
2efd0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
2efe0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69        /* OUT: ui
2eff0 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20  d to set on the 
2f000 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20  file */.  gid_t 
2f010 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20  *pGid           
2f020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2f030 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20  : gid to set on 
2f040 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  the file */.){. 
2f050 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2f060 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2f070 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
2f080 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 53 51  */.  *pMode = SQ
2f090 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2f0a0 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20  E_PERMISSIONS;. 
2f0b0 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51   if( flags & (SQ
2f0c0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51  LITE_OPEN_WAL|SQ
2f0d0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
2f0e0 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63  OURNAL) ){.    c
2f0f0 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48  har zDb[MAX_PATH
2f100 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20  NAME+1];     /* 
2f110 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  Database file pa
2f120 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44  th */.    int nD
2f130 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2f140 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2f150 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73  r of valid bytes
2f160 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73   in zDb */.    s
2f170 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
2f180 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2f190 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74 28 29  Output of stat()
2f1a0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
2f1b0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61  e */..    /* zPa
2f1c0 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f 20  th is a path to 
2f1d0 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c  a WAL or journal
2f1e0 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f   file. The follo
2f1f0 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76  wing block deriv
2f200 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  es.    ** the pa
2f210 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69  th to the associ
2f220 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
2f230 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54  le from zPath. T
2f240 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65  his block handle
2f250 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c  s.    ** the fol
2f260 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f  lowing naming co
2f270 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a  nventions:.    *
2f280 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  *.    **   "<pat
2f290 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c  h to db>-journal
2f2a0 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
2f2b0 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20  h to db>-wal".  
2f2c0 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
2f2d0 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a   db>-journalNN".
2f2e0 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2f2f0 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20  to db>-walNN".  
2f300 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72    **.    ** wher
2f310 65 20 4e 4e 20 69 73 20 61 20 34 20 64 69 67 69  e NN is a 4 digi
2f320 74 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72  t decimal number
2f330 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20  . The NN naming 
2f340 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20  schemes are .   
2f350 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20   ** used by the 
2f360 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63  test_multiplex.c
2f370 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a   module..    */.
2f380 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65      nDb = sqlite
2f390 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29  3Strlen30(zPath)
2f3a0 20 2d 20 31 3b 20 0a 20 20 20 20 77 68 69 6c 65   - 1; .    while
2f3b0 28 20 6e 44 62 3e 30 20 26 26 20 7a 50 61 74 68  ( nDb>0 && zPath
2f3c0 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 20 6e 44 62  [nDb]!='-' ) nDb
2f3d0 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d  --;.    if( nDb=
2f3e0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2f3f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 6d 65 6d 63 70  TE_OK;.    memcp
2f400 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44  y(zDb, zPath, nD
2f410 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d  b);.    zDb[nDb]
2f420 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66   = '\0';..    if
2f430 28 20 30 3d 3d 73 74 61 74 28 7a 44 62 2c 20 26  ( 0==stat(zDb, &
2f440 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
2f450 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73  *pMode = sStat.s
2f460 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20  t_mode & 0777;. 
2f470 20 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74       *pUid = sSt
2f480 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 20  at.st_uid;.     
2f490 20 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73   *pGid = sStat.s
2f4a0 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65  t_gid;.    }else
2f4b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2f4c0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
2f4d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
2f4e0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
2f4f0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
2f500 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f  LOSE ){.    *pMo
2f510 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20  de = 0600;.  }. 
2f520 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2f530 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69  *.** Open the fi
2f540 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a  le zPath..** .**
2f550 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65   Previously, the
2f560 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72   SQLite OS layer
2f570 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63   used three func
2f580 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f  tions in place o
2f590 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a  f this.** one:.*
2f5a0 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
2f5b0 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
2f5c0 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
2f5d0 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
2f5e0 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
2f5f0 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
2f600 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ();.**.** These 
2f610 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64  calls correspond
2f620 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2f630 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  g combinations o
2f640 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
2f650 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d     ReadWrite() -
2f660 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45  >     (READWRITE
2f670 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20   | CREATE).**   
2f680 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e    ReadOnly()  ->
2f690 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20       (READONLY) 
2f6a0 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c  .**     OpenExcl
2f6b0 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44  usive() -> (READ
2f6c0 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c  WRITE | CREATE |
2f6d0 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a   EXCLUSIVE).**.*
2f6e0 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78  * The old OpenEx
2f6f0 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74  clusive() accept
2f700 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67  ed a boolean arg
2f710 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67  ument - "delFlag
2f720 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74  ". If.** true, t
2f730 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66  he file was conf
2f740 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74  igured to be aut
2f750 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
2f760 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66  ed when the.** f
2f770 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65  ile handle close
2f780 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68  d. To achieve th
2f790 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73  e same effect us
2f7a0 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a  ing this new .**
2f7b0 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20   interface, add 
2f7c0 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  the DELETEONCLOS
2f7d0 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20  E flag to those 
2f7e0 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20  specified above 
2f7f0 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c  for .** OpenExcl
2f800 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  usive()..*/.stat
2f810 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28  ic int unixOpen(
2f820 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2f830 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
2f840 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77  /* The VFS for w
2f850 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65  hich this is the
2f860 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f   xOpen method */
2f870 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2f880 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
2f890 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66  /* Pathname of f
2f8a0 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ile to be opened
2f8b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
2f8c0 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
2f8d0 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
2f8e0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20  escriptor to be 
2f8f0 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69  filled in */.  i
2f900 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2f910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f920 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f  nput flags to co
2f930 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e  ntrol the openin
2f940 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  g */.  int *pOut
2f950 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
2f960 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c      /* Output fl
2f970 61 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ags returned to 
2f980 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29  SQLite core */.)
2f990 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20  {.  unixFile *p 
2f9a0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46  = (unixFile *)pF
2f9b0 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20  ile;.  int fd = 
2f9c0 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
2f9d0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
2f9e0 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65  scriptor returne
2f9f0 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  d by open() */. 
2fa00 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b   int dirfd = -1;
2fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c  /* Directory fil
2fa30 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
2fa40 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
2fa50 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2fa60 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73   /* Flags to pas
2fa70 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  s to open() */.#
2fa80 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2fa90 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e  _DATA_PROTECTION
2faa0 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
2fab0 6c 61 67 73 26 30 78 46 46 30 46 46 46 30 30 3b  lags&0xFF0FFF00;
2fac0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
2fad0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6c  e to open */.#el
2fae0 73 65 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  se.  int eType =
2faf0 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30   flags&0xFFFFFF0
2fb00 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
2fb10 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23  ile to open */.#
2fb20 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 6f 4c 6f  endif.  int noLo
2fb30 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
2fb40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2fb50 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70  o omit locking p
2fb60 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69  rimitives */.  i
2fb70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2fb80 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
2fb90 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
2fba0 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e 74 20   Code */..  int 
2fbb0 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
2fbc0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2fbd0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
2fbe0 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
2fbf0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
2fc00 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
2fc10 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
2fc20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
2fc30 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2fc40 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69  PEN_CREATE);.  i
2fc50 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
2fc60 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2fc70 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2fc80 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72  ;.  int isReadWr
2fc90 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ite  = (flags & 
2fca0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2fcb0 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49  WRITE);.#if SQLI
2fcc0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2fcd0 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73  G_STYLE.  int is
2fce0 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c  AutoProxy  = (fl
2fcf0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2fd00 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65  N_AUTOPROXY);.#e
2fd10 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72  ndif..  /* If cr
2fd20 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  eating a master 
2fd30 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75  or main-file jou
2fd40 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74  rnal, this funct
2fd50 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20  ion will open.  
2fd60 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69  ** a file-descri
2fd70 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65  ptor on the dire
2fd80 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66  ctory too. The f
2fd90 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79  irst time unixSy
2fda0 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c  nc().  ** is cal
2fdb0 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72  led the director
2fdc0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
2fdd0 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28  r will be fsync(
2fde0 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64  )ed and close()d
2fdf0 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ..  */.  int isO
2fe00 70 65 6e 44 69 72 65 63 74 6f 72 79 20 3d 20 28  penDirectory = (
2fe10 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20  isCreate && (.  
2fe20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c        eType==SQL
2fe30 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
2fe40 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
2fe50 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2fe60 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2fe70 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
2fe80 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2fe90 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  .  ));..  /* If 
2fea0 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
2feb0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
2fec0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2fed0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
2fee0 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
2fef0 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
2ff00 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
2ff10 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
2ff20 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
2ff30 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50  r zTmpname[MAX_P
2ff40 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f  ATHNAME+1];.  co
2ff50 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
2ff60 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43  = zPath;..  /* C
2ff70 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69  heck the followi
2ff80 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ng statements ar
2ff90 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20  e true: .  **.  
2ffa0 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79  **   (a) Exactly
2ffb0 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44   one of the READ
2ffc0 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e  WRITE and READON
2ffd0 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  LY flags must be
2ffe0 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20   set, and .  ** 
2fff0 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
30000 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
30010 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
30020 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
30030 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
30040 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
30050 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
30060 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
30070 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
30080 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
30090 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
300a0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
300b0 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
300c0 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
300d0 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
300e0 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
300f0 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
30100 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
30110 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
30120 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
30130 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
30140 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
30150 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
30160 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
30170 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
30180 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41  main journal, WA
30190 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65  L file and maste
301a0 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
301b0 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  ver .  ** automa
301c0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e  tically deleted.
301d0 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76   Nor are they ev
301e0 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  er temporary fil
301f0 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  es.  */.  assert
30200 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
30210 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
30220 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
30230 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  N_DB );.  assert
30240 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
30250 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
30260 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
30270 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  N_JOURNAL );.  a
30280 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
30290 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
302a0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
302b0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
302c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
302d0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
302e0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
302f0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a  ITE_OPEN_WAL );.
30300 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
30310 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
30320 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
30330 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
30340 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
30350 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
30360 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
30370 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
30380 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
30390 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  DB .       || eT
303a0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
303b0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
303c0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
303d0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
303e0 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
303f0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  e==SQLITE_OPEN_S
30400 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65  UBJOURNAL   || e
30410 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
30420 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
30430 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
30440 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
30450 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65  RANSIENT_DB || e
30460 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
30470 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 6d 65  N_WAL.  );..  me
30480 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
30490 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20  f(unixFile));.. 
304a0 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
304b0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
304c0 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65  ){.    UnixUnuse
304d0 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20  dFd *pUnused;.  
304e0 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
304f0 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65  ReusableFd(zName
30500 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
30510 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
30520 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
30530 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >fd;.    }else{.
30540 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
30550 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
30560 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
30570 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 55 6e  ;.      if( !pUn
30580 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
30590 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
305a0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
305b0 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65   }.    p->pUnuse
305c0 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 7d  d = pUnused;.  }
305d0 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20  else if( !zName 
305e0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  ){.    /* If zNa
305f0 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  me is NULL, the 
30600 75 70 70 65 72 20 6c 61 79 65 72 20 69 73 20 72  upper layer is r
30610 65 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70  equesting a temp
30620 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73   file. */.    as
30630 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26  sert(isDelete &&
30640 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72   !isOpenDirector
30650 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69  y);.    rc = uni
30660 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58  xGetTempname(MAX
30670 5f 50 41 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d  _PATHNAME+1, zTm
30680 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
30690 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
306a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
306b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
306c0 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20  e = zTmpname;.  
306d0 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  }..  /* Determin
306e0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
306f0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
30700 65 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53  er passed to POS
30710 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  IX function.  **
30720 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d   open(). These m
30730 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65  ust be calculate
30740 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29  d even if open()
30750 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20   is not called, 
30760 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79  as.  ** they may
30770 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61   be stored as pa
30780 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  rt of the file h
30790 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62  andle and used b
307a0 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e  y the .  ** 'con
307b0 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67  ch file' locking
307c0 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72   functions later
307d0 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69   on.  */.  if( i
307e0 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65  sReadonly )  ope
307f0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  nFlags |= O_RDON
30800 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64  LY;.  if( isRead
30810 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67  Write ) openFlag
30820 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69  s |= O_RDWR;.  i
30830 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20  f( isCreate )   
30840 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
30850 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45  CREAT;.  if( isE
30860 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46  xclusive ) openF
30870 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c  lags |= (O_EXCL|
30880 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f  O_NOFOLLOW);.  o
30890 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c  penFlags |= (O_L
308a0 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
308b0 59 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  Y);..#if SQLITE_
308c0 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54  ENABLE_DATA_PROT
308d0 45 43 54 49 4f 4e 0a 20 20 70 2d 3e 70 72 6f 74  ECTION.  p->prot
308e0 46 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26  Flags = (flags &
308f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c   SQLITE_OPEN_FIL
30900 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b  EPROTECTION_MASK
30910 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  );.#endif.    . 
30920 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
30930 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65   mode_t openMode
30940 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
30950 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f  * Permissions to
30960 20 63 72 65 61 74 65 20 66 69 6c 65 20 77 69 74   create file wit
30970 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20 75  h */.    uid_t u
30980 69 64 3b 0a 20 20 20 20 67 69 64 5f 74 20 67 69  id;.    gid_t gi
30990 64 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  d;.    rc = find
309a0 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a  CreateFileMode(z
309b0 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70  Name, flags, &op
309c0 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67  enMode, &uid, &g
309d0 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  id);.    if( rc!
309e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
309f0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
30a00 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20  pUnused );.     
30a10 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
30a20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
30a30 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
30a40 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
30a50 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  AL );.      retu
30a60 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
30a70 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
30a80 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
30a90 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
30aa0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
30ab0 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f  NX   %-3d %s 0%o
30ac0 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20  \n", fd, zName, 
30ad0 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20  openFlags));.   
30ae0 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72   if( fd<0 && err
30af0 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73  no!=EISDIR && is
30b00 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73  ReadWrite && !is
30b10 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
30b20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20     /* Failed to 
30b30 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f  open the file fo
30b40 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
30b50 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e  ess. Try read-on
30b60 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61  ly. */.      fla
30b70 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f  gs &= ~(SQLITE_O
30b80 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
30b90 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
30ba0 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  );.      openFla
30bb0 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f  gs &= ~(O_RDWR|O
30bc0 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66  _CREAT);.      f
30bd0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
30be0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
30bf0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
30c00 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20   O_RDONLY;.     
30c10 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b   isReadonly = 1;
30c20 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75  .      fd = robu
30c30 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
30c40 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
30c50 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  de);.    }.    i
30c60 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
30c70 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
30c80 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
30c90 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c  EN_BKPT, "open",
30ca0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67   zName);.      g
30cb0 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
30cc0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
30cd0 69 66 20 77 65 27 72 65 20 6f 70 65 6e 69 6e 67  if we're opening
30ce0 20 74 68 65 20 77 61 6c 20 6f 72 20 6a 6f 75 72   the wal or jour
30cf0 6e 61 6c 20 61 6e 64 20 72 75 6e 6e 69 6e 67 20  nal and running 
30d00 61 73 20 72 6f 6f 74 2c 20 73 65 74 20 74 68 65  as root, set the
30d10 20 6a 6f 75 72 6e 61 6c 20 75 69 64 2f 67 69 64   journal uid/gid
30d20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 52   */.    if( !isR
30d30 65 61 64 6f 6e 6c 79 20 26 26 20 28 66 6c 61 67  eadonly && (flag
30d40 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
30d50 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  _WAL|SQLITE_OPEN
30d60 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 29 20  _MAIN_JOURNAL)) 
30d70 29 7b 0a 20 20 20 20 20 20 75 69 64 5f 74 20 65  ){.      uid_t e
30d80 75 69 64 20 3d 20 67 65 74 65 75 69 64 28 29 3b  uid = geteuid();
30d90 0a 20 20 20 20 20 20 69 66 28 20 65 75 69 64 3d  .      if( euid=
30da0 3d 30 20 26 26 20 28 65 75 69 64 21 3d 75 69 64  =0 && (euid!=uid
30db0 20 7c 7c 20 67 65 74 65 67 69 64 28 29 21 3d 67   || getegid()!=g
30dc0 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  id) ){.        i
30dd0 66 28 20 66 63 68 6f 77 6e 28 66 64 2c 20 75 69  f( fchown(fd, ui
30de0 64 2c 20 67 69 64 29 20 29 7b 0a 20 20 20 20 20  d, gid) ){.     
30df0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30e00 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
30e10 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f            goto o
30e20 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
30e30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
30e40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
30e50 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69  rt( fd>=0 );.  i
30e60 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
30e70 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
30e80 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
30e90 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b  f( p->pUnused ){
30ea0 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d  .    p->pUnused-
30eb0 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d  >fd = fd;.    p-
30ec0 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20  >pUnused->flags 
30ed0 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
30ee0 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
30ef0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
30f00 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65     zPath = zName
30f10 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 6e 6c 69  ;.#else.    unli
30f20 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69  nk(zName);.#endi
30f30 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  f.  }.#if SQLITE
30f40 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
30f50 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20  STYLE.  else{.  
30f60 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d    p->openFlags =
30f70 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a   openFlags;.  }.
30f80 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73  #endif..  if( is
30f90 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 29 7b  OpenDirectory ){
30fa0 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69  .    rc = openDi
30fb0 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26  rectory(zPath, &
30fc0 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20  dirfd);.    if( 
30fd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30fe0 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
30ff0 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 20 66 64  safe to close fd
31000 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
31010 62 65 63 61 75 73 65 20 69 74 20 69 73 20 67 75  because it is gu
31020 61 72 61 6e 74 65 65 64 20 6e 6f 74 0a 20 20 20  aranteed not.   
31030 20 20 20 2a 2a 20 74 6f 20 62 65 20 6f 70 65 6e     ** to be open
31040 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 66   on a database f
31050 69 6c 65 2e 20 49 66 20 69 74 20 77 65 72 65 20  ile. If it were 
31060 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74 61 62 61  open on a databa
31070 73 65 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 2a  se file,.      *
31080 2a 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62  * it would not b
31090 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 20  e safe to close 
310a0 61 73 20 74 68 69 73 20 77 6f 75 6c 64 20 72 65  as this would re
310b0 6c 65 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20  lease any locks 
310c0 68 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  held.      ** on
310d0 20 74 68 65 20 66 69 6c 65 20 62 79 20 74 68 69   the file by thi
310e0 73 20 70 72 6f 63 65 73 73 2e 20 20 2a 2f 0a 20  s process.  */. 
310f0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
31100 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
31110 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 20 20 20  MAIN_DB );.     
31120 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
31130 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
31140 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
31150 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
31160 20 20 7d 0a 0a 23 69 66 64 65 66 20 46 44 5f 43    }..#ifdef FD_C
31170 4c 4f 45 58 45 43 0a 20 20 6f 73 46 63 6e 74 6c  LOEXEC.  osFcntl
31180 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73  (fd, F_SETFD, os
31190 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  Fcntl(fd, F_GETF
311a0 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
311b0 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e  EC);.#endif..  n
311c0 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53  oLock = eType!=S
311d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
311e0 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66 69  DB;..  .#if defi
311f0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
31200 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
31210 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
31220 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
31230 49 6e 66 6f 3b 0a 20 20 69 66 28 20 66 73 74 61  Info;.  if( fsta
31240 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29  tfs(fd, &fsInfo)
31250 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28   == -1 ){.    ((
31260 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
31270 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
31280 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 64 69 72  rno;.    if( dir
31290 66 64 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63  fd>=0 ) robust_c
312a0 6c 6f 73 65 28 70 2c 20 64 69 72 66 64 2c 20 5f  lose(p, dirfd, _
312b0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 6f  _LINE__);.    ro
312c0 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
312d0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
312e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
312f0 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d  OERR_ACCESS;.  }
31300 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e  .  if (0 == strn
31310 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49  cmp("msdos", fsI
31320 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
31330 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e  , 5)) {.    ((un
31340 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
31350 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
31360 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
31370 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20  OS;.  }.  if (0 
31380 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65 78 66 61  == strncmp("exfa
31390 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74  t", fsInfo.f_fst
313a0 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20  ypename, 5)) {. 
313b0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
313c0 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c  File)->fsFlags |
313d0 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  = SQLITE_FSFLAGS
313e0 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23  _IS_MSDOS;.  }.#
313f0 65 6e 64 69 66 0a 20 20 0a 23 69 66 20 53 51 4c  endif.  .#if SQL
31400 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
31410 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c  NG_STYLE.#if SQL
31420 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
31430 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74  _LOCKING.  isAut
31440 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64  oProxy = 1;.#end
31450 69 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50  if.  if( isAutoP
31460 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d  roxy && (zPath!=
31470 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63  NULL) && (!noLoc
31480 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65  k) && pVfs->xOpe
31490 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65  n ){.    char *e
314a0 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76  nvforce = getenv
314b0 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  ("SQLITE_FORCE_P
314c0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a  ROXY_LOCKING");.
314d0 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79      int useProxy
314e0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51   = 0;..    /* SQ
314f0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
31500 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e  _LOCKING==1 mean
31510 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75  s force always u
31520 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e  se proxy, 0 mean
31530 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20  s .    ** never 
31540 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20  use proxy, NULL 
31550 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20  means use proxy 
31560 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69  for non-local fi
31570 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20  les only.  */.  
31580 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d    if( envforce!=
31590 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73  NULL ){.      us
315a0 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e  eProxy = atoi(en
315b0 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d  vforce)>0;.    }
315c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 73 65 50  else{.      useP
315d0 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e  roxy = !(fsInfo.
315e0 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41  f_flags&MNT_LOCA
315f0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  L);.    }.    if
31600 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20  ( useProxy ){.  
31610 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55      rc = fillInU
31620 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64  nixFile(pVfs, fd
31630 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20  , dirfd, pFile, 
31640 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20  zPath, noLock,. 
31650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31660 20 20 20 20 20 20 20 20 20 69 73 44 65 6c 65 74           isDelet
31670 65 2c 20 69 73 52 65 61 64 6f 6e 6c 79 29 3b 0a  e, isReadonly);.
31680 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31690 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
316a0 20 20 20 2f 2a 20 63 61 63 68 65 20 74 68 65 20     /* cache the 
316b0 70 4d 65 74 68 6f 64 20 69 6e 20 63 61 73 65 20  pMethod in case 
316c0 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 20 66 61  the transform fa
316d0 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  ils */.        c
316e0 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69  onst struct sqli
316f0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
31700 70 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c 65 2d  pMethod = pFile-
31710 3e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20  >pMethods;.     
31720 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61     rc = proxyTra
31730 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28  nsformUnixFile((
31740 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c  unixFile*)pFile,
31750 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20   ":auto:");.    
31760 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31780 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c     /* Use unixCl
31790 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  ose to clean up 
317a0 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61 64  the resources ad
317b0 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69  ded in fillInUni
317c0 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20  xFile .         
317d0 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c   ** and clear al
317e0 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65 27  l the structure'
317f0 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53  s references.  S
31800 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20  pecifically, .  
31810 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65          ** pFile
31820 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20  ->pMethods will 
31830 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74  be NULL so sqlit
31840 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62  e3OsClose will b
31850 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20  e a no-op .     
31860 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31870 20 20 69 66 28 20 70 4d 65 74 68 6f 64 21 3d 4e    if( pMethod!=N
31880 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
31890 20 20 20 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f     pMethod->xClo
318a0 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  se(pFile);.     
318b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
318c0 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73          unixClos
318d0 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  e(pFile);.      
318e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
318f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
31900 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
31910 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
31920 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ished;.    }.  }
31930 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20  .#endif.  .  rc 
31940 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
31950 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64  (pVfs, fd, dirfd
31960 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20  , pFile, zPath, 
31970 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  noLock,.        
31980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
31990 44 65 6c 65 74 65 2c 20 69 73 52 65 61 64 6f 6e  Delete, isReadon
319a0 6c 79 29 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68  ly);.open_finish
319b0 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
319c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
319d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70  qlite3_free(p->p
319e0 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72  Unused);.  }.  r
319f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
31a00 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
31a10 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ile at zPath. If
31a20 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
31a30 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66  ument is true, f
31a40 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69  sync().** the di
31a50 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
31a60 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
31a70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
31a80 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  nixDelete(.  sql
31a90 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
31aa0 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f  d,     /* VFS co
31ab0 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73  ntaining this as
31ac0 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74   the xDelete met
31ad0 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
31ae0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
31af0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
31b00 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
31b10 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e   */.  int dirSyn
31b20 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
31b30 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e  /* If true, fsyn
31b40 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66  c() directory af
31b50 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c  ter deleting fil
31b60 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
31b70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
31b80 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31b90 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
31ba0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
31bb0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
31bc0 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20  _DELETE);.  if( 
31bd0 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28  unlink(zPath)==(
31be0 2d 31 29 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e  -1) && errno!=EN
31bf0 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 65 74 75  OENT ){.    retu
31c00 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
31c10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
31c20 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a  ETE, "unlink", z
31c30 50 61 74 68 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Path);.  }.#ifnd
31c40 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
31c50 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20  E_DIRSYNC.  if( 
31c60 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  dirSync ){.    i
31c70 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20  nt fd;.    rc = 
31c80 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50  openDirectory(zP
31c90 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69  ath, &fd);.    i
31ca0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31cb0 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
31cc0 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66 73 79  KS.      if( fsy
31cd0 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c  nc(fd)==-1 ).#el
31ce0 73 65 0a 20 20 20 20 20 20 69 66 28 20 66 73 79  se.      if( fsy
31cf0 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66 0a  nc(fd) ).#endif.
31d00 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
31d10 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
31d20 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
31d30 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63  IR_FSYNC, "fsync
31d40 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  ", zPath);.     
31d50 20 7d 0a 23 69 66 20 4f 53 43 4c 4f 53 45 5f 43   }.#if OSCLOSE_C
31d60 48 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52 52  HECK_CLOSE_IOERR
31d70 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65  .      if( close
31d80 28 66 64 29 26 26 21 72 63 20 29 7b 0a 20 20 20  (fd)&&!rc ){.   
31d90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31da0 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45  _IOERR_DIR_CLOSE
31db0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ;.      }.#else.
31dc0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
31dd0 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(0, fd, __LINE
31de0 5f 5f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  __);.#endif.    
31df0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
31e00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
31e10 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73  ** Test the exis
31e20 74 61 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65  tance of or acce
31e30 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  ss permissions o
31e40 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68  f file zPath. Th
31e50 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72  e.** test perfor
31e60 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  med depends on t
31e70 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67  he value of flag
31e80 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  s:.**.**     SQL
31e90 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
31ea0 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  S: Return 1 if t
31eb0 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a  he file exists.*
31ec0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
31ed0 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52  ESS_READWRITE: R
31ee0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
31ef0 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20  ile is read and 
31f00 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  writable..**    
31f10 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
31f20 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20  EADONLY: Return 
31f30 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
31f40 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a   readable..**.**
31f50 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
31f60 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
31f70 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20  nt unixAccess(. 
31f80 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f   sqlite3_vfs *No
31f90 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20  tUsed,   /* The 
31fa0 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  VFS containing t
31fb0 68 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68  his xAccess meth
31fc0 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
31fd0 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
31fe0 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66  /* Path of the f
31ff0 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a  ile to examine *
32000 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
32010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
32020 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74  hat do we want t
32030 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68  o learn about th
32040 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f  e zPath file? */
32050 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20  .  int *pResOut 
32060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
32070 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65  ite result boole
32080 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  an here */.){.  
32090 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20  int amode = 0;. 
320a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
320b0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69  R(NotUsed);.  Si
320c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
320d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
320e0 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20  RR_ACCESS; );.  
320f0 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b  switch( flags ){
32100 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
32110 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a  _ACCESS_EXISTS:.
32120 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f        amode = F_
32130 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
32140 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
32150 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
32160 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  E:.      amode =
32170 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20   W_OK|R_OK;.    
32180 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
32190 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
321a0 52 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64  READ:.      amod
321b0 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  e = R_OK;.      
321c0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
321d0 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
321e0 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67  t(!"Invalid flag
321f0 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20  s argument");.  
32200 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28  }.  *pResOut = (
32210 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20  osAccess(zPath, 
32220 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66  amode)==0);.  if
32230 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ( flags==SQLITE_
32240 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 26 26  ACCESS_EXISTS &&
32250 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20   *pResOut ){.   
32260 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
32270 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 61  ;.    if( 0==sta
32280 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26  t(zPath, &buf) &
32290 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  & buf.st_size==0
322a0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 4f   ){.      *pResO
322b0 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ut = 0;.    }.  
322c0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
322d0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
322e0 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
322f0 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
32300 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54  full pathname. T
32310 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
32320 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73  .** is stored as
32330 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
32340 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  d string in the 
32350 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
32360 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a  o by.** zPath. .
32370 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74  **.** zOut point
32380 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  s to a buffer of
32390 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65   at least sqlite
323a0 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
323b0 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74   bytes .** (in t
323c0 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41  his case, MAX_PA
323d0 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54  THNAME bytes). T
323e0 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20  he full-path is 
323f0 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68  written to.** th
32400 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  is buffer before
32410 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
32420 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75  tatic int unixFu
32430 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
32440 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
32450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
32460 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
32470 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
32480 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
32490 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
324a0 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
324b0 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
324c0 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20   nOut,          
324d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
324e0 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
324f0 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
32500 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20    char *zOut    
32510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32520 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
32530 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27   */.){..  /* It'
32540 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
32550 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
32560 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
32570 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
32580 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
32590 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
325a0 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
325b0 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
325c0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
325d0 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20  n failing. This 
325e0 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66  function could f
325f0 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d  ail if, for exam
32600 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75  ple, the.  ** cu
32610 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
32620 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
32630 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a   unlinked..  */.
32640 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
32650 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
32660 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73  _ERROR );..  ass
32670 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74  ert( pVfs->mxPat
32680 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e  hname==MAX_PATHN
32690 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  AME );.  UNUSED_
326a0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
326b0 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d  ..  zOut[nOut-1]
326c0 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a   = '\0';.  if( z
326d0 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[0]=='/' ){.
326e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
326f0 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c  intf(nOut, zOut,
32700 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20   "%s", zPath);. 
32710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
32720 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20 6f 73  nCwd;.    if( os
32730 47 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75  Getcwd(zOut, nOu
32740 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1)==0 ){.     
32750 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
32760 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
32770 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63  OPEN_BKPT, "getc
32780 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  wd", zPath);.   
32790 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69   }.    nCwd = (i
327a0 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b  nt)strlen(zOut);
327b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
327c0 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c  rintf(nOut-nCwd,
327d0 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f   &zOut[nCwd], "/
327e0 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
327f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
32800 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  _OK;.}...#ifndef
32810 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
32820 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a  D_EXTENSION./*.*
32830 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
32840 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
32850 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
32860 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
32870 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
32880 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
32890 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
328a0 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
328b0 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e  .#include <dlfcn
328c0 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .h>.static void 
328d0 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69  *unixDlOpen(sqli
328e0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
328f0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
32900 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53  ilename){.  UNUS
32910 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
32920 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
32930 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  dlopen(zFilename
32940 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c  , RTLD_NOW | RTL
32950 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a  D_GLOBAL);.}../*
32960 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  .** SQLite calls
32970 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
32980 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
32990 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44   a call to unixD
329a0 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69  lSym() or.** uni
329b0 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20  xDlOpen() fails 
329c0 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20  (returns a null 
329d0 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d  pointer). If a m
329e0 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72 72  ore detailed err
329f0 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73  or.** message is
32a00 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69   available, it i
32a10 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75  s written to zBu
32a20 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f  fOut. If no erro
32a30 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20  r message.** is 
32a40 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f  available, zBufO
32a50 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ut is left unmod
32a60 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65  ified and SQLite
32a70 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a   uses a default.
32a80 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
32a90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
32aa0 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c   unixDlError(sql
32ab0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
32ac0 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
32ad0 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63  r *zBufOut){.  c
32ae0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
32af0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
32b00 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
32b10 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
32b20 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72  ;.  zErr = dlerr
32b30 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  or();.  if( zErr
32b40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
32b50 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
32b60 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45  BufOut, "%s", zE
32b70 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  rr);.  }.  unixL
32b80 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73  eaveMutex();.}.s
32b90 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69  tatic void (*uni
32ba0 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  xDlSym(sqlite3_v
32bb0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
32bc0 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  d *p, const char
32bd0 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
32be0 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69   /* .  ** GCC wi
32bf0 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
32c00 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39  ors says that C9
32c10 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  0 does not allow
32c20 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20   a void* to be. 
32c30 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20   ** cast into a 
32c40 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
32c50 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20  ction.  And yet 
32c60 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79  the library dlsy
32c70 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  m() routine.  **
32c80 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a   returns a void*
32c90 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79   which is really
32ca0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
32cb0 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f  function.  So ho
32cc0 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65  w do we.  ** use
32cd0 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70   dlsym() with -p
32ce0 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a  edantic-errors?.
32cf0 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62    **.  ** Variab
32d00 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65  le x below is de
32d10 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  fined to be a po
32d20 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
32d30 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20  ion taking.  ** 
32d40 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a  parameters void*
32d50 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a   and const char*
32d60 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
32d70 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
32d80 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20  nction..  ** We 
32d90 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20  initialize x by 
32da0 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70  assigning it a p
32db0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c  ointer to the dl
32dc0 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sym() function..
32dd0 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67    ** (That assig
32de0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61  nment requires a
32df0 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65   cast.)  Then we
32e00 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69   call the functi
32e10 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70  on that.  ** x p
32e20 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a  oints to.  .  **
32e30 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d  .  ** This work-
32e40 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65  around is unlike
32e50 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65  ly to work corre
32e60 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74  ctly on any syst
32e70 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f  em where.  ** yo
32e80 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20  u really cannot 
32e90 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  cast a function 
32ea0 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69  pointer into voi
32eb0 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f  d*.  But then, o
32ec0 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  n the.  ** other
32ed0 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77   hand, dlsym() w
32ee0 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  ill not work on 
32ef0 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69  such a system ei
32f00 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65  ther, so we have
32f10 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79  .  ** not really
32f20 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a   lost anything..
32f30 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a    */.  void (*(*
32f40 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  x)(void*,const c
32f50 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20  har*))(void);.  
32f60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
32f70 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d  (NotUsed);.  x =
32f80 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64   (void(*(*)(void
32f90 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
32fa0 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72  void))dlsym;.  r
32fb0 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53  eturn (*x)(p, zS
32fc0 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ym);.}.static vo
32fd0 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73  id unixDlClose(s
32fe0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
32ff0 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  sed, void *pHand
33000 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
33010 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
33020 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e  ;.  dlclose(pHan
33030 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
33040 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
33050 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
33060 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
33070 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70  #define unixDlOp
33080 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
33090 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20  unixDlError 0.  
330a0 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79  #define unixDlSy
330b0 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
330c0 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65  unixDlClose 0.#e
330d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
330e0 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  e nBuf bytes of 
330f0 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74  random data to t
33100 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
33110 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
33120 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f  ic int unixRando
33130 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
33140 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
33150 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
33160 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
33170 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
33180 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74    assert((size_t
33190 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74  )nBuf>=(sizeof(t
331a0 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e  ime_t)+sizeof(in
331b0 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68  t)));..  /* We h
331c0 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
331d0 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
331e0 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
331f0 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
33200 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
33210 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
33220 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
33230 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
33240 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
33250 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
33260 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
33270 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
33280 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
33290 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
332a0 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
332b0 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
332c0 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
332d0 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
332e0 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
332f0 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
33300 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
33310 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
33320 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
33330 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
33340 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
33350 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
33360 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
33370 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
33380 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
33390 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
333a0 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
333b0 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
333c0 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
333d0 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
333e0 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
333f0 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
33400 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
33410 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
33420 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
33430 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
33440 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
33450 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
33460 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b      int pid, fd;
33470 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
33480 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e  _open("/dev/uran
33490 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20  dom", O_RDONLY, 
334a0 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  0);.    if( fd<0
334b0 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
334c0 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
334d0 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
334e0 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
334f0 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64  f(t));.      pid
33500 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20   = getpid();.   
33510 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
33520 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64  sizeof(t)], &pid
33530 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
33540 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
33550 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70  zeof(t)+sizeof(p
33560 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75  id)<=(size_t)nBu
33570 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20  f );.      nBuf 
33580 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69  = sizeof(t) + si
33590 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d  zeof(pid);.    }
335a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20  else{.      do{ 
335b0 6e 42 75 66 20 3d 20 6f 73 52 65 61 64 28 66 64  nBuf = osRead(fd
335c0 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d  , zBuf, nBuf); }
335d0 77 68 69 6c 65 28 20 6e 42 75 66 3c 30 20 26 26  while( nBuf<0 &&
335e0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
335f0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
33600 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(0, fd, __LIN
33610 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E__);.    }.  }.
33620 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
33630 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nBuf;.}.../*.** 
33640 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
33650 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
33660 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
33670 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
33680 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
33690 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
336a0 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
336b0 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
336c0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
336d0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
336e0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
336f0 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
33700 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
33710 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
33720 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
33730 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
33740 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
33750 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
33760 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
33770 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
33780 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
33790 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
337a0 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
337b0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
337c0 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73  Used, int micros
337d0 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f  econds){.#if OS_
337e0 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
337f0 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20   timespec sp;.. 
33800 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63   sp.tv_sec = mic
33810 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  roseconds / 1000
33820 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65  000;.  sp.tv_nse
33830 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  c = (microsecond
33840 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31  s % 1000000) * 1
33850 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70  000;.  nanosleep
33860 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55  (&sp, NULL);.  U
33870 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
33880 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
33890 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
338a0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
338b0 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
338c0 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
338d0 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
338e0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
338f0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
33900 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
33910 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
33920 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
33930 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
33940 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
33950 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
33960 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
33970 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
33980 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30  urn seconds*1000
33990 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  000;.#endif.}../
339a0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
339b0 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
339c0 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
339d0 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
339e0 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
339f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
33a00 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
33a10 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
33a20 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
33a30 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
33a40 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
33a50 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
33a60 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
33a70 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
33a80 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
33a90 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
33aa0 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
33ab0 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
33ac0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
33ad0 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
33ae0 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
33af0 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
33b00 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
33b10 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
33b20 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
33b30 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
33b40 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
33b50 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
33b60 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
33b70 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
33b80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
33b90 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
33ba0 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
33bb0 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
33bc0 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
33bd0 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
33be0 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
33bf0 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
33c00 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
33c10 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
33c20 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 30  uccess, return 0
33c30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
33c40 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
33c50 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
33c60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33c70 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49  unixCurrentTimeI
33c80 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
33c90 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74   *NotUsed, sqlit
33ca0 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29  e3_int64 *piNow)
33cb0 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
33cc0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75   sqlite3_int64 u
33cd0 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35  nixEpoch = 24405
33ce0 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  875*(sqlite3_int
33cf0 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66 20  64)8640000;.#if 
33d00 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f  defined(NO_GETTO
33d10 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20  D).  time_t t;. 
33d20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69   time(&t);.  *pi
33d30 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f  Now = ((sqlite3_
33d40 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20  int64)t)*1000 + 
33d50 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66  unixEpoch;.#elif
33d60 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
33d70 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e  ruct timespec sN
33d80 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74  ow;.  clock_gett
33d90 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49  ime(CLOCK_REALTI
33da0 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70  ME, &sNow);.  *p
33db0 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68  iNow = unixEpoch
33dc0 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   + 1000*(sqlite3
33dd0 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73  _int64)sNow.tv_s
33de0 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65  ec + sNow.tv_nse
33df0 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65  c/1000000;.#else
33e00 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  .  struct timeva
33e10 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d  l sNow;.  gettim
33e20 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29  eofday(&sNow, 0)
33e30 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69  ;.  *piNow = uni
33e40 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
33e50 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
33e60 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
33e70 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23 65  tv_usec/1000;.#e
33e80 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
33e90 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
33ea0 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
33eb0 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ime ){.    *piNo
33ec0 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65  w = 1000*(sqlite
33ed0 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f  3_int64)sqlite3_
33ee0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75  current_time + u
33ef0 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65  nixEpoch;.  }.#e
33f00 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41  ndif.  UNUSED_PA
33f10 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
33f20 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
33f30 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
33f40 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
33f50 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
33f60 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
33f70 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
33f80 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
33f90 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
33fa0 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
33fb0 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
33fc0 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
33fd0 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
33fe0 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
33ff0 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
34000 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
34010 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
34020 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65  *NotUsed, double
34030 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69   *prNow){.  sqli
34040 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 55  te3_int64 i;.  U
34050 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
34060 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78  NotUsed);.  unix
34070 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
34080 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f  (0, &i);.  *prNo
34090 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
340a0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
340b0 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20  ./*.** We added 
340c0 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f  the xGetLastErro
340d0 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20  r() method with 
340e0 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66  the intention of
340f0 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65   providing.** be
34100 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65  tter low-level e
34110 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68  rror messages wh
34120 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73  en operating-sys
34130 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d  tem problems com
34140 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53  e up.** during S
34150 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e  QLite operation.
34160 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f    But so far, no
34170 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20 62  ne of that has b
34180 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  een implemented.
34190 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20  ** in the core. 
341a0 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   So this routine
341b0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
341c0 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69  .  For now, it i
341d0 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c  s merely.** a pl
341e0 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73  ace-holder..*/.s
341f0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
34200 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
34210 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
34220 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63   int NotUsed2, c
34230 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a  har *NotUsed3){.
34240 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
34250 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55  ER(NotUsed);.  U
34260 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
34270 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55  NotUsed2);.  UNU
34280 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
34290 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72  tUsed3);.  retur
342a0 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a  n 0;.}.../*.****
342b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
342c0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69  **** End of sqli
342d0 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
342e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
342f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
34300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
34350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
343a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
343b0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72  ******* Begin Pr
343c0 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  oxy Locking ****
343d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
343e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
343f0 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
34400 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b   is a "uber-lock
34410 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  ing-method" in t
34420 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75  his sense:  It u
34430 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72  ses the.** other
34440 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
34450 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f   on secondary lo
34460 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79  ck files.  Proxy
34470 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a   locking is a.**
34480 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72   meta-layer over
34490 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d   top of the prim
344a0 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d  itive locking im
344b0 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e  plemented above.
344c0 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65    For.** this re
344d0 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69  ason, the divisi
344e0 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  on that implemen
344f0 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  ts of proxy lock
34500 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a  ing is deferred.
34510 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e  ** until late in
34520 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29   the file (here)
34530 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68   after all of th
34540 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68  e other I/O meth
34550 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  ods have.** been
34560 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68   defined - so th
34570 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65  at the primitive
34580 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
34590 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   are available.*
345a0 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f  * as services to
345b0 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69   help with the i
345c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
345d0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a   proxy locking..
345e0 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  **.****.**.** Th
345f0 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
34600 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c  g schemes in SQL
34610 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e  ite use byte-ran
34620 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a  ge locks on the.
34630 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
34640 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73   to coordinate s
34650 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  afe, concurrent 
34660 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
34670 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e  le readers.** an
34680 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a  d writers [http:
34690 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63  //sqlite.org/loc
346a0 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54  kingv3.html].  T
346b0 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63  he five file loc
346c0 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28  king.** states (
346d0 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e  UNLOCKED, PENDIN
346e0 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  G, SHARED, RESER
346f0 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20  VED, EXCLUSIVE) 
34700 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  are implemented.
34710 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64  ** as POSIX read
34720 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f   & write locks o
34730 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66  ver fixed set of
34740 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20   locations (via 
34750 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46  fsctl),.** on AF
34760 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65  P and SMB only e
34770 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61  xclusive byte-ra
34780 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76  nge locks are av
34790 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74  ailable via fsct
347a0 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28  l.** with _IOWR(
347b0 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
347c0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
347d0 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73  ) to track the s
347e0 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a  ame 5 states..**
347f0 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46   To simulate a F
34800 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68  _RDLCK on the sh
34810 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41  ared range, on A
34820 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65  FP a randomly se
34830 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73  lected.** addres
34840 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  s in the shared 
34850 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
34860 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  or a SHARED lock
34870 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20  , the entire.** 
34880 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
34890 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43  taken for an EXC
348a0 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a  LUSIVE lock):.**
348b0 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47  .**      PENDING
348c0 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34  _BYTE        0x4
348d0 30 30 30 30 30 30 30 09 09 20 20 20 09 0a 2a 2a  0000000..   ..**
348e0 20 20 20 20 20 20 52 45 53 45 52 56 45 44 5f 42        RESERVED_B
348f0 59 54 45 20 20 20 20 20 20 20 30 78 34 30 30 30  YTE       0x4000
34900 30 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41  0001.**      SHA
34910 52 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20  RED_RANGE       
34920 20 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30   0x40000002 -> 0
34930 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20  x40000200.**.** 
34940 54 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20  This works well 
34950 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
34960 65 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68  e system, but sh
34970 6f 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30  ows a nearly 100
34980 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e  x.** slowdown in
34990 20 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63   read performanc
349a0 65 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65  e on AFP because
349b0 20 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20   the AFP client 
349c0 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20  disables.** the 
349d0 72 65 61 64 20 63 61 63 68 65 20 77 68 65 6e 20  read cache when 
349e0 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
349f0 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45   are present.  E
34a00 6e 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64  nabling the read
34a10 0a 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65  .** cache expose
34a20 73 20 61 20 63 61 63 68 65 20 63 6f 68 65 72 65  s a cache cohere
34a30 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74  ncy problem that
34a40 20 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61   is present on a
34a50 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f  ll OS X.** suppo
34a60 72 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c  rted network fil
34a70 65 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20  e systems.  NFS 
34a80 61 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73  and AFP both obs
34a90 65 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73  erve the.** clos
34aa0 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74  e-to-open semant
34ab0 69 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67  ics for ensuring
34ac0 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
34ad0 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e  .** [http://nfs.
34ae0 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f  sourceforge.net/
34af0 23 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20  #faq_a8], which 
34b00 64 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69  does not effecti
34b10 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20  vely.** address 
34b20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73  the requirements
34b30 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20   for concurrent 
34b40 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
34b50 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72  by multiple.** r
34b60 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65  eaders and write
34b70 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77  rs.** [http://ww
34b80 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c  w.nabble.com/SQL
34b90 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65  ite-on-NFS-cache
34ba0 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36  -coherency-td156
34bb0 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a  55701.html]..**.
34bc0 2a 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74 68  ** To address th
34bd0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e  e performance an
34be0 64 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  d cache coherenc
34bf0 79 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20  y issues, proxy 
34c00 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  file locking.** 
34c10 63 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20  changes the way 
34c20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
34c30 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79  is controlled by
34c40 20 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73   limiting access
34c50 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20   to a.** single 
34c60 68 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20 61  host at a time a
34c70 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c  nd moving file l
34c80 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20  ocks off of the 
34c90 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
34ca0 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78   and onto a prox
34cb0 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  y file on the lo
34cc0 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  cal file system.
34cd0 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e    .**.**.** Usin
34ce0 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a  g proxy locks.**
34cf0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
34d00 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a  --.**.** C APIs.
34d10 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66  **.**  sqlite3_f
34d20 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
34d30 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53  dbname, SQLITE_S
34d40 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
34d50 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
34d60 20 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78             <prox
34d70 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f  y_path> | ":auto
34d80 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33  :");.**  sqlite3
34d90 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
34da0 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45  , dbname, SQLITE
34db0 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
34dc0 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74 68  LE, &<proxy_path
34dd0 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c  >);.**.**.** SQL
34de0 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20   pragmas.**.**  
34df0 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
34e00 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
34e10 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c  e=<proxy_path> |
34e20 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47   :auto:.**  PRAG
34e30 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
34e40 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a  ck_proxy_file.**
34e50 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22  .** Specifying "
34e60 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68  :auto:" means th
34e70 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61  at if there is a
34e80 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68   conch file with
34e90 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68   a matching.** h
34ea0 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68  ost ID in it, th
34eb0 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20  e proxy path in 
34ec0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  the conch file w
34ed0 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68  ill be used, oth
34ee0 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78  erwise.** a prox
34ef0 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20  y path based on 
34f00 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70 20  the user's temp 
34f10 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66  dir.** (via conf
34f20 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55  str(_CS_DARWIN_U
34f30 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e  SER_TEMP_DIR,...
34f40 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  )) will be used 
34f50 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61  and the.** actua
34f60 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d  l proxy file nam
34f70 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
34f80 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64  rom the name and
34f90 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20   path of the.** 
34fa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
34fb0 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
34fc0 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61 74  **       For dat
34fd0 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73 65  abase path "/Use
34fe0 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a  rs/me/foo.db" .*
34ff0 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b  *       The lock
35000 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c   path will be "<
35010 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c  tmpdir>/sqlitepl
35020 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66  ocks/_Users_me_f
35030 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a  oo.db:auto:").**
35040 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20  .** Once a lock 
35050 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75  proxy is configu
35060 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62 61  red for a databa
35070 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69  se connection, i
35080 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20  t can not.** be 
35090 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72  removed, however
350a0 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74 63   it may be switc
350b0 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  hed to a differe
350c0 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76 69  nt proxy path vi
350d0 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41  a.** the above A
350e0 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68  PIs (assuming th
350f0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20  e conch file is 
35100 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62  not being held b
35110 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e  y another.** con
35120 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65  nection or proce
35130 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48  ss). .**.**.** H
35140 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ow proxy locking
35150 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   works.** ------
35160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35170 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69  -.**.** Proxy fi
35180 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65  le locking relie
35190 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74  s primarily on t
351a0 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e  wo new supportin
351b0 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20  g files: .**.** 
351c0 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20    *  conch file 
351d0 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20  to limit access 
351e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
351f0 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65  file to a single
35200 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74   host.**      at
35210 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20   a time.**.**   
35220 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f  *  proxy file to
35230 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79 20   act as a proxy 
35240 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72 79  for the advisory
35250 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a   locks normally.
35260 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e  **      taken on
35270 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
35280 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69  .** The conch fi
35290 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72  le - to use a pr
352a0 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65  oxy file, sqlite
352b0 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c   must first "hol
352c0 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20  d the conch".** 
352d0 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c  by taking an sql
352e0 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64  ite-style shared
352f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e   lock on the con
35300 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67  ch file, reading
35310 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
35320 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74   and comparing t
35330 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65  he host's unique
35340 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62 65   host ID (see be
35350 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a  low) and lock.**
35360 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61 69   proxy path agai
35370 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20 73  nst the values s
35380 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e  tored in the con
35390 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66  ch.  The conch f
353a0 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64  ile is.** stored
353b0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
353c0 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64 61  ectory as the da
353d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
353e0 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a  the file name.**
353f0 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61 66   is patterned af
35400 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ter the database
35410 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e   file name as ".
35420 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63  <databasename>-c
35430 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65  onch"..** If the
35440 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73   conch file does
35450 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69   not exist, or i
35460 74 27 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20  t's contents do 
35470 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a  not match the.**
35480 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20   host ID and/or 
35490 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e  proxy path, then
354a0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63   the lock is esc
354b0 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63  alated to an exc
354c0 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61  lusive.** lock a
354d0 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  nd the conch fil
354e0 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70  e contents is up
354f0 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 68  dated with the h
35500 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79  ost ID and proxy
35510 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65  .** path and the
35520 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61   lock is downgra
35530 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64 20  ded to a shared 
35540 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20  lock again.  If 
35550 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20  the conch.** is 
35560 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20  held by another 
35570 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61 20  process (with a 
35580 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68  shared lock), th
35590 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
355a0 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e  .** will fail an
355b0 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  d SQLITE_BUSY is
355c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
355d0 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
355e0 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20  - a single-byte 
355f0 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c  file used for al
35600 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20  l advisory file 
35610 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  locks.** normall
35620 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64  y taken on the d
35630 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20  atabase file.   
35640 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20  This allows for 
35650 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  safe sharing.** 
35660 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
35670 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c  file for multipl
35680 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  e readers and wr
35690 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  iters on the sam
356a0 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63  e.** host (the c
356b0 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68 61  onch ensures tha
356c0 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74  t they all use t
356d0 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f  he same local lo
356e0 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20  ck file)..**.** 
356f0 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c  Requesting the l
35700 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e  ock proxy does n
35710 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  ot immediately t
35720 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69  ake the conch, i
35730 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b  t is.** only tak
35740 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  en when the firs
35750 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63  t request to loc
35760 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
35770 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68  is made.  .** Th
35780 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 73  is matches the s
35790 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20  emantics of the 
357a0 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b  traditional lock
357b0 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68  ing behavior, wh
357c0 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61  ere.** opening a
357d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61   connection to a
357e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64   database file d
357f0 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c  oes not take a l
35800 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68  ock on it..** Th
35810 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  e shared lock an
35820 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64  d an open file d
35830 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61  escriptor are ma
35840 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a  intained until .
35850 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ** the connectio
35860 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
35870 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a  e is closed. .**
35880 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
35890 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  le and the lock 
358a0 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64  file are never d
358b0 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f  eleted so they o
358c0 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  nly need.** to b
358d0 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69  e created the fi
358e0 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61 72  rst time they ar
358f0 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  e used..**.** Co
35900 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69  nfiguration opti
35910 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ons.** ---------
35920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
35930 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45  **  SQLITE_PREFE
35940 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
35950 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61  **.**       Data
35960 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73  base files acces
35970 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c  sed on non-local
35980 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72   file systems ar
35990 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d  e.**       autom
359a0 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75  atically configu
359b0 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  red for proxy lo
359c0 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65  cking, lock file
359d0 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e  s are.**       n
359e0 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
359f0 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ly using the sam
35a00 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20  e logic as.**   
35a10 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f      PRAGMA lock_
35a20 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74  proxy_file=":aut
35a30 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53  o:".**    .**  S
35a40 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55  QLITE_PROXY_DEBU
35a50 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e  G.**.**       En
35a60 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e  ables the loggin
35a70 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61  g of error messa
35a80 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20  ges during host 
35a90 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20  id file.**      
35aa0 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63   retrieval and c
35ab0 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c  reation.**.**  L
35ac0 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a  OCKPROXYDIR.**.*
35ad0 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65  *       Override
35ae0 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 69  s the default di
35af0 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72  rectory used for
35b00 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
35b10 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  s that.**       
35b20 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61  are named automa
35b30 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20  tically via the 
35b40 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67  ":auto:" setting
35b50 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44  .**.**  SQLITE_D
35b60 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
35b70 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a  PERMISSIONS.**.*
35b80 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73 69  *       Permissi
35b90 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20  ons to use when 
35ba0 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65 63  creating a direc
35bb0 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67  tory for storing
35bc0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f   the.**       lo
35bd0 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20  ck proxy files, 
35be0 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c  only used when L
35bf0 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e  OCKPROXYDIR is n
35c00 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a  ot set..**    .*
35c10 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74  *    .** As ment
35c20 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65  ioned above, whe
35c30 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  n compiled with 
35c40 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
35c50 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20  OXY_LOCKING,.** 
35c60 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69  setting the envi
35c70 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
35c80 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
35c90 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31  OXY_LOCKING to 1
35ca0 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70   will.** force p
35cb0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
35cc0 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65 72  be used for ever
35cd0 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
35ce0 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a  opened, and 0.**
35cf0 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f   will force auto
35d00 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b  matic proxy lock
35d10 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ing to be disabl
35d20 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  ed for all datab
35d30 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78  ase.** files (ex
35d40 70 6c 69 63 69 74 79 20 63 61 6c 6c 69 6e 67 20  plicity calling 
35d50 74 68 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  the SQLITE_SET_L
35d60 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61  OCKPROXYFILE pra
35d70 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65  gma or.** sqlite
35d80 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50  _file_control AP
35d90 49 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65  I is not affecte
35da0 64 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43  d by SQLITE_FORC
35db0 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29  E_PROXY_LOCKING)
35dc0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78  ..*/../*.** Prox
35dd0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  y locking is onl
35de0 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d  y available on M
35df0 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65  acOSX .*/.#if de
35e00 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
35e10 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
35e20 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
35e30 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  ./*.** The proxy
35e40 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68  LockingContext h
35e50 61 73 20 74 68 65 20 70 61 74 68 20 61 6e 64 20  as the path and 
35e60 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 20  file structures 
35e70 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a  for the remote .
35e80 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f  ** and local pro
35e90 78 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a  xy files in it.*
35ea0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
35eb0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
35ec0 74 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  text proxyLockin
35ed0 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  gContext;.struct
35ee0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
35ef0 74 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c  text {.  unixFil
35f00 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20  e *conchFile;   
35f10 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f        /* Open co
35f20 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nch file */.  ch
35f30 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74  ar *conchFilePat
35f40 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  h;         /* Na
35f50 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20  me of the conch 
35f60 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
35f70 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20  le *lockProxy;  
35f80 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
35f90 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a  roxy lock file *
35fa0 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72  /.  char *lockPr
35fb0 6f 78 79 50 61 74 68 3b 20 20 20 20 20 20 20 20  oxyPath;        
35fc0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
35fd0 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
35fe0 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74  */.  char *dbPat
35ff0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
36000 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
36010 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20   open file */.  
36020 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20  int conchHeld;  
36030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36040 31 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  1 if the conch i
36050 73 20 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f  s held, -1 if lo
36060 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ckless */.  int 
36070 6e 46 61 69 6c 73 3b 20 20 20 20 20 20 20 20 20  nFails;         
36080 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
36090 65 72 20 6f 66 20 63 6f 6e 63 68 20 74 61 6b 69  er of conch taki
360a0 6e 67 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  ng failures */. 
360b0 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e   void *oldLockin
360c0 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a  gContext;     /*
360d0 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e   Original lockin
360e0 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74  gcontext to rest
360f0 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a  ore on close */.
36100 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74    sqlite3_io_met
36110 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64  hods const *pOld
36120 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f  Method;     /* O
36130 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68  riginal I/O meth
36140 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f  ods for close */
36150 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20  .};../* .** The 
36160 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
36170 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61 74  path for the dat
36180 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68 20  abase at dbPath 
36190 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
361a0 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68  lPath, .** which
361b0 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76   must point to v
361c0 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d  alid, writable m
361d0 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75  emory large enou
361e0 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20  gh for a maxLen 
361f0 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70  length.** file p
36200 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ath. .*/.static 
36210 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b  int proxyGetLock
36220 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  Path(const char 
36230 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c  *dbPath, char *l
36240 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78  Path, size_t max
36250 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b  Len){.  int len;
36260 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20  .  int dbLen;.  
36270 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c  int i;..#ifdef L
36280 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65  OCKPROXYDIR.  le
36290 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74  n = strlcpy(lPat
362a0 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c  h, LOCKPROXYDIR,
362b0 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a   maxLen);.#else.
362c0 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57  # ifdef _CS_DARW
362d0 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
362e0 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f  .  {.    if( !co
362f0 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e  nfstr(_CS_DARWIN
36300 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20  _USER_TEMP_DIR, 
36310 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29  lPath, maxLen) )
36320 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
36330 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66  ("GETLOCKPATH  f
36340 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25  ailed %s errno=%
36350 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  d pid=%d\n",.   
36360 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61 74              lPat
36370 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64  h, errno, getpid
36380 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ()));.      retu
36390 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
363a0 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LOCK;.    }.    
363b0 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50  len = strlcat(lP
363c0 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63  ath, "sqliteploc
363d0 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20  ks", maxLen);   
363e0 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c   .  }.# else.  l
363f0 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61  en = strlcpy(lPa
36400 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78  th, "/tmp/", max
36410 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65  Len);.# endif.#e
36420 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74  ndif..  if( lPat
36430 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b  h[len-1]!='/' ){
36440 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  .    len = strlc
36450 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d  at(lPath, "/", m
36460 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20  axLen);.  }.  . 
36470 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68   /* transform th
36480 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20 75  e db path to a u
36490 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65  nique cache name
364a0 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69   */.  dbLen = (i
364b0 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68  nt)strlen(dbPath
364c0 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69  );.  for( i=0; i
364d0 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e  <dbLen && (i+len
364e0 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b  +7)<(int)maxLen;
364f0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
36500 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20  c = dbPath[i];. 
36510 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20     lPath[i+len] 
36520 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63  = (c=='/')?'_':c
36530 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b  ;.  }.  lPath[i+
36540 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72  len]='\0';.  str
36550 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75  lcat(lPath, ":au
36560 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20  to:", maxLen);. 
36570 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f   OSTRACE(("GETLO
36580 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f  CKPATH  proxy lo
36590 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
365a0 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74  d\n", lPath, get
365b0 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72  pid()));.  retur
365c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
365d0 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20  /* . ** Creates 
365e0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e  the lock file an
365f0 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69  d any missing di
36600 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63  rectories in loc
36610 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63  kPath. */.static
36620 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
36630 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
36640 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a  har *lockPath){.
36650 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20    int i, len;.  
36660 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48  char buf[MAXPATH
36670 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72  LEN];.  int star
36680 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65  t = 0;.  .  asse
36690 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c  rt(lockPath!=NUL
366a0 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20  L);.  /* try to 
366b0 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69  create all the i
366c0 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65  ntermediate dire
366d0 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e  ctories */.  len
366e0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c   = (int)strlen(l
366f0 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b  ockPath);.  buf[
36700 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d  0] = lockPath[0]
36710 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c  ;.  for( i=1; i<
36720 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  len; i++ ){.    
36730 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20  if( lockPath[i] 
36740 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73  == '/' && (i - s
36750 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20  tart > 0) ){.   
36760 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72     /* only mkdir
36770 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20   if leaf dir != 
36780 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e  "." or "/" or ".
36790 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ." */.      if( 
367a0 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d  i-start>2 || (i-
367b0 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b  start==1 && buf[
367c0 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26  start] != '.' &&
367d0 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
367e0 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  /') .         ||
367f0 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20   (i-start==2 && 
36800 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
36810 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31  ' && buf[start+1
36820 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20  ] != '.') ){.   
36830 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27       buf[i]='\0'
36840 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 6b  ;.        if( mk
36850 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f  dir(buf, SQLITE_
36860 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
36870 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b  _PERMISSIONS) ){
36880 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65  .          int e
36890 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
368a0 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58      if( err!=EEX
368b0 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20  IST ) {.        
368c0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52      OSTRACE(("CR
368d0 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41  EATELOCKPATH  FA
368e0 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73  ILED creating %s
368f0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
36900 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70           "'%s' p
36910 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
36920 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  s pid=%d\n",.   
36930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36940 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28    buf, strerror(
36950 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  err), lockPath, 
36960 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20  getpid()));.    
36970 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65          return e
36980 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rr;.          }.
36990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
369a0 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b  }.      start=i+
369b0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66  1;.    }.    buf
369c0 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69  [i] = lockPath[i
369d0 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  ];.  }.  OSTRACE
369e0 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54  (("CREATELOCKPAT
369f0 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  H  proxy lock pa
36a00 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
36a10 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69   lockPath, getpi
36a20 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d()));.  return 
36a30 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  0;.}..static int
36a40 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d   isProxyLockingM
36a50 6f 64 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ode(unixFile *pF
36a60 69 6c 65 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  ile) {.  return 
36a70 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20  (pFile->pMethod 
36a80 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f  == &proxyIoMetho
36a90 64 73 29 20 3f 20 31 20 3a 20 30 3b 0a 7d 0a 0a  ds) ? 1 : 0;.}..
36aa0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
36ab0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
36ac0 61 73 65 20 70 61 74 68 20 62 61 73 65 64 20 6f  ase path based o
36ad0 6e 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79  n the lock proxy
36ae0 20 66 69 6c 65 20 69 66 20 74 68 65 20 0a 2a 2a   file if the .**
36af0 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
36b00 20 69 73 20 68 6f 73 74 65 64 20 6f 6e 20 61 20   is hosted on a 
36b10 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
36b20 6d 70 61 74 69 62 6c 65 20 46 53 0a 2a 2f 0a 73  mpatible FS.*/.s
36b30 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
36b40 20 2a 70 72 6f 78 79 53 68 61 72 65 64 4d 65 6d   *proxySharedMem
36b50 6f 72 79 42 61 73 65 50 61 74 68 28 75 6e 69 78  oryBasePath(unix
36b60 46 69 6c 65 20 2a 70 46 69 6c 65 29 20 7b 0a 20  File *pFile) {. 
36b70 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
36b80 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 75 6e  text *pCtx;.  un
36b90 69 78 46 69 6c 65 20 2a 70 4c 6f 63 6b 46 69 6c  ixFile *pLockFil
36ba0 65 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 70  e;.  .  assert(p
36bb0 46 69 6c 65 21 3d 4e 55 4c 4c 20 26 26 20 70 46  File!=NULL && pF
36bc0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
36bd0 65 78 74 21 3d 4e 55 4c 4c 29 3b 0a 20 20 61 73  ext!=NULL);.  as
36be0 73 65 72 74 28 70 46 69 6c 65 2d 3e 70 4d 65 74  sert(pFile->pMet
36bf0 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d  hod == &proxyIoM
36c00 65 74 68 6f 64 73 29 3b 0a 20 20 70 43 74 78 20  ethods);.  pCtx 
36c10 3d 20 28 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  = ((proxyLocking
36c20 43 6f 6e 74 65 78 74 20 2a 29 28 70 46 69 6c 65  Context *)(pFile
36c30 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
36c40 29 29 3b 0a 20 20 70 4c 6f 63 6b 46 69 6c 65 20  ));.  pLockFile 
36c50 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
36c60 79 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 46 69  y;.  if( pLockFi
36c70 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 69 56 65  le->pMethod->iVe
36c80 72 73 69 6f 6e 3e 3d 32 20 26 26 20 70 4c 6f 63  rsion>=2 && pLoc
36c90 6b 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  kFile->pMethod->
36ca0 78 53 68 6d 4d 61 70 21 3d 30 20 29 7b 0a 20 20  xShmMap!=0 ){.  
36cb0 20 20 72 65 74 75 72 6e 20 70 43 74 78 2d 3e 6c    return pCtx->l
36cc0 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
36cd0 7d 0a 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  }.  return NULL;
36ce0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
36cf0 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20   a new VFS file 
36d00 64 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72  descriptor (stor
36d10 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ed in memory obt
36d20 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
36d30 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e  lite3_malloc) an
36d40 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  d open the file 
36d50 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20  named "path" in 
36d60 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
36d70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  tor..**.** The c
36d80 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
36d90 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f  ible not only fo
36da0 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69  r closing the fi
36db0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a  le descriptor.**
36dc0 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72   but also for fr
36dd0 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79  eeing the memory
36de0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
36df0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
36e00 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ptor..*/.static 
36e10 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 55  int proxyCreateU
36e20 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e  nixFile(.    con
36e30 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20  st char *path,  
36e40 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f        /* path fo
36e50 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69  r the new unixFi
36e60 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69  le */.    unixFi
36e70 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20  le **ppFile,    
36e80 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63     /* unixFile c
36e90 72 65 61 74 65 64 20 61 6e 64 20 72 65 74 75 72  reated and retur
36ea0 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a 20 20  ned by ref */.  
36eb0 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65    int islockfile
36ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66             /* if
36ed0 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e   non zero missin
36ee0 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65 20 63  g dirs will be c
36ef0 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20  reated */.) {.  
36f00 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69  int fd = -1;.  i
36f10 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  nt dirfd = -1;. 
36f20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b   unixFile *pNew;
36f30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
36f40 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65  TE_OK;.  int ope
36f50 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
36f60 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c  | O_CREAT;.  sql
36f70 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66  ite3_vfs dummyVf
36f80 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20  s;.  int terrno 
36f90 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  = 0;.  UnixUnuse
36fa0 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e  dFd *pUnused = N
36fb0 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69  ULL;..  /* 1. fi
36fc0 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f  rst try to open/
36fd0 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a  create the file.
36fe0 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20    ** 2. if that 
36ff0 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20  fails, and this 
37000 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28  is a lock file (
37010 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20  not-conch), try 
37020 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
37030 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f  e parent directo
37040 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72  ries and then tr
37050 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e  y again..  ** 3.
37060 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
37070 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  try to open the 
37080 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20  file read-only. 
37090 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65   ** otherwise re
370a0 74 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f  turn BUSY (if lo
370b0 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54  ck file) or CANT
370c0 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e  OPEN for the con
370d0 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70  ch file.  */.  p
370e0 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
370f0 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70  sableFd(path, op
37100 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  enFlags);.  if( 
37110 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66  pUnused ){.    f
37120 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
37130 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55  .  }else{.    pU
37140 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  nused = sqlite3_
37150 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
37160 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66  Unused));.    if
37170 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
37180 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37190 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
371a0 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
371b0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
371c0 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
371d0 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45  Flags, SQLITE_DE
371e0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
371f0 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72  SSIONS);.    ter
37200 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
37210 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72   if( fd<0 && err
37220 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73  no==ENOENT && is
37230 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20  lockfile ){.    
37240 20 20 69 66 28 20 70 72 6f 78 79 43 72 65 61 74    if( proxyCreat
37250 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29 20  eLockPath(path) 
37260 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  == SQLITE_OK ){.
37270 20 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62          fd = rob
37280 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f  ust_open(path, o
37290 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45  penFlags, SQLITE
372a0 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
372b0 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20  RMISSIONS);.    
372c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
372d0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
372e0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
372f0 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20 72  ONLY;.    fd = r
37300 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c  obust_open(path,
37310 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49   openFlags, SQLI
37320 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
37330 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
37340 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    terrno = errno
37350 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  ;.  }.  if( fd<0
37360 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
37370 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20  free(pUnused);. 
37380 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c     if( islockfil
37390 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
373a0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
373b0 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20     }.    switch 
373c0 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20  (terrno) {.     
373d0 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20   case EACCES:.  
373e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
373f0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
37400 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20  case EIO: .     
37410 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37420 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20  _IOERR_LOCK; /* 
37430 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
37440 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20  s the conch */. 
37450 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
37460 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
37470 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
37480 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  T;.    }.  }.  .
37490 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69    pNew = (unixFi
374a0 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  le *)sqlite3_mal
374b0 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77  loc(sizeof(*pNew
374c0 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  ));.  if( pNew==
374d0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  NULL ){.    rc =
374e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
374f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61     goto end_crea
37500 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20  te_proxy;.  }.  
37510 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
37520 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
37530 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46  );.  pNew->openF
37540 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
37550 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d  ;.  memset(&dumm
37560 79 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  yVfs, 0, sizeof(
37570 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75  dummyVfs));.  du
37580 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20  mmyVfs.pAppData 
37590 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f  = (void*)&autolo
375a0 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75  ckIoFinder;.  du
375b0 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22  mmyVfs.zName = "
375c0 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65  dummy";.  pUnuse
375d0 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55  d->fd = fd;.  pU
375e0 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f  nused->flags = o
375f0 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  penFlags;.  pNew
37600 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75  ->pUnused = pUnu
37610 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66  sed;.  .  rc = f
37620 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64  illInUnixFile(&d
37630 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 64 69 72  ummyVfs, fd, dir
37640 66 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  fd, (sqlite3_fil
37650 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30  e*)pNew, path, 0
37660 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
37670 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
37680 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e      *ppFile = pN
37690 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ew;.    return S
376a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e  QLITE_OK;.  }.en
376b0 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20  d_create_proxy: 
376c0 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f     .  robust_clo
376d0 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c  se(pNew, fd, __L
376e0 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65  INE__);.  sqlite
376f0 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
37700 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e  sqlite3_free(pUn
37710 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  used);.  return 
37720 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
37730 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d  LITE_TEST./* sim
37740 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
37750 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
37760 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
37770 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74  ile paths */.int
37780 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
37790 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  num = 0;.#endif.
377a0 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48  .#define PROXY_H
377b0 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20  OSTIDLEN    16  
377c0 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f  /* conch file ho
377d0 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a  st id length */.
377e0 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64  ./* Not always d
377f0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65  efined in the he
37800 61 64 65 72 73 20 61 73 20 69 74 20 6f 75 67 68  aders as it ough
37810 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72  t to be */.exter
37820 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75 75 69  n int gethostuui
37830 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e  d(uuid_t id, con
37840 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  st struct timesp
37850 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20 67  ec *wait);../* g
37860 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20 76  et the host ID v
37870 69 61 20 67 65 74 68 6f 73 74 75 75 69 64 28 29  ia gethostuuid()
37880 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70  , pHostID must p
37890 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f  oint to PROXY_HO
378a0 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65  STIDLEN .** byte
378b0 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65  s of writable me
378c0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
378d0 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74  int proxyGetHost
378e0 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ID(unsigned char
378f0 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a   *pHostID, int *
37900 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65 72  pError){.  asser
37910 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  t(PROXY_HOSTIDLE
37920 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64  N == sizeof(uuid
37930 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  _t));.  memset(p
37940 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59  HostID, 0, PROXY
37950 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66  _HOSTIDLEN);.#if
37960 20 48 41 56 45 5f 47 45 54 48 4f 53 54 55 55 49   HAVE_GETHOSTUUI
37970 44 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74  D.  {.    struct
37980 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75   timespec timeou
37990 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31  t = {1, 0}; /* 1
379a0 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a   sec timeout */.
379b0 20 20 20 20 0a 20 20 20 20 69 66 28 20 67 65 74      .    if( get
379c0 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44  hostuuid(pHostID
379d0 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20  , &timeout) ){. 
379e0 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65       int err = e
379f0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
37a00 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  pError ){.      
37a10 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b    *pError = err;
37a20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
37a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
37a40 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
37a50 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
37a60 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d  TE_TEST.  /* sim
37a70 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
37a80 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
37a90 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
37aa0 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69  ile paths */.  i
37ab0 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  f( sqlite3_hosti
37ac0 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20  d_num != 0){.   
37ad0 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63   pHostID[0] = (c
37ae0 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20  har)(pHostID[0] 
37af0 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33  + (char)(sqlite3
37b00 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78  _hostid_num & 0x
37b10 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  FF));.  }.#endif
37b20 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  .  .  return SQL
37b30 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68  ITE_OK;.}../* Th
37b40 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
37b50 74 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72  tains the header
37b60 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f  , host id and lo
37b70 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f  ck file path. */
37b80 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43  .#define PROXY_C
37b90 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20  ONCHVERSION 2   
37ba0 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72  /* 1-byte header
37bb0 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69  , 16-byte host i
37bc0 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69  d, path */.#defi
37bd0 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  ne PROXY_HEADERL
37be0 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e  EN    1   /* con
37bf0 63 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c  ch file header l
37c00 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65  ength */.#define
37c10 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58   PROXY_PATHINDEX
37c20 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45      (PROXY_HEADE
37c30 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49  RLEN+PROXY_HOSTI
37c40 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52  DLEN).#define PR
37c50 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20  OXY_MAXCONCHLEN 
37c60 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45   (PROXY_HEADERLE
37c70 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
37c80 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f  N+MAXPATHLEN)../
37c90 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f  * .** Takes an o
37ca0 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  pen conch file, 
37cb0 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65  copies the conte
37cc0 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74  nts to a new pat
37cd0 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73  h and then moves
37ce0 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54   .** it back.  T
37cf0 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64  he newly created
37d00 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73   file's file des
37d10 63 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67  criptor is assig
37d20 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  ned to the.** co
37d30 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75  nch file structu
37d40 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74  re and finally t
37d50 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63  he original conc
37d60 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  h file descripto
37d70 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e  r is .** closed.
37d80 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69    Returns zero i
37d90 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f  f successful..*/
37da0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
37db0 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28  yBreakConchLock(
37dc0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
37dd0 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
37de0 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
37df0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
37e00 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
37e10 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
37e20 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
37e30 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
37e40 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
37e50 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20  nchFile;.  char 
37e60 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  tPath[MAXPATHLEN
37e70 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52  ];.  char buf[PR
37e80 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
37e90 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20  ;.  char *cPath 
37ea0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
37eb0 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20  ePath;.  size_t 
37ec0 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73  readLen = 0;.  s
37ed0 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20  ize_t pathLen = 
37ee0 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67  0;.  char errmsg
37ef0 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74  [64] = "";.  int
37f00 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20   fd = -1;.  int 
37f10 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45  rc = -1;.  UNUSE
37f20 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f  D_PARAMETER(myHo
37f30 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65  stID);..  /* cre
37f40 61 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62  ate a new path b
37f50 79 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72  y replace the tr
37f60 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20  ailing '-conch' 
37f70 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f  with '-break' */
37f80 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72  .  pathLen = str
37f90 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74  lcpy(tPath, cPat
37fa0 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
37fb0 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41    if( pathLen>MA
37fc0 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68  XPATHLEN || path
37fd0 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28  Len<6 || .     (
37fe0 73 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70  strlcpy(&tPath[p
37ff0 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61  athLen-5], "brea
38000 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a  k", 6) != 5) ){.
38010 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
38020 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
38030 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68  sg),errmsg,"path
38040 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22   error (len %d)"
38050 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a  ,(int)pathLen);.
38060 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
38070 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a  aklock;.  }.  /*
38080 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20   read the conch 
38090 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61  content */.  rea
380a0 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63  dLen = osPread(c
380b0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66  onchFile->h, buf
380c0 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
380d0 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  LEN, 0);.  if( r
380e0 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54  eadLen<PROXY_PAT
380f0 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71  HINDEX ){.    sq
38100 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
38110 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72  izeof(errmsg),er
38120 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72  rmsg,"read error
38130 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29   (len %d)",(int)
38140 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f  readLen);.    go
38150 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
38160 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65  ;.  }.  /* write
38170 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74   it out to the t
38180 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66  emporary break f
38190 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f  ile */.  fd = ro
381a0 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c  bust_open(tPath,
381b0 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54   (O_RDWR|O_CREAT
381c0 7c 4f 5f 45 58 43 4c 29 2c 0a 20 20 20 20 20 20  |O_EXCL),.      
381d0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
381e0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
381f0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
38200 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
38210 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
38220 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
38230 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74  , errmsg, "creat
38240 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
38250 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
38260 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
38270 20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69    }.  if( osPwri
38280 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64  te(fd, buf, read
38290 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a  Len, 0) != (ssiz
382a0 65 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20  e_t)readLen ){. 
382b0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
382c0 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
382d0 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69  g), errmsg, "wri
382e0 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  te failed (%d)",
382f0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
38300 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
38310 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d  .  }.  if( renam
38320 65 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20  e(tPath, cPath) 
38330 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
38340 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
38350 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20  rrmsg), errmsg, 
38360 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28  "rename failed (
38370 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
38380 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
38390 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  lock;.  }.  rc =
383a0 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74   0;.  fprintf(st
383b0 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61  derr, "broke sta
383c0 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22  le lock on %s\n"
383d0 2c 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75  , cPath);.  robu
383e0 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
383f0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f  conchFile->h, __
38400 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68  LINE__);.  conch
38410 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20  File->h = fd;.  
38420 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46  conchFile->openF
38430 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
38440 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72  O_CREAT;..end_br
38450 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72  eaklock:.  if( r
38460 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e  c ){.    if( fd>
38470 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69  =0 ){.      unli
38480 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20  nk(tPath);.     
38490 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
384a0 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  ile, fd, __LINE_
384b0 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  _);.    }.    fp
384c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
384d0 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73  ailed to break s
384e0 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c  tale lock on %s,
384f0 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65   %s\n", cPath, e
38500 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrmsg);.  }.  re
38510 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
38520 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65  ake the requeste
38530 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
38540 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65  nch file and bre
38550 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20  ak a stale lock 
38560 69 66 20 74 68 65 20 0