/ Hex Artifact Content
Login

Artifact b84dfb5c8d7fd5a31cc892225bf8ecac23d3fed2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  .h>.#endif..#if 
1170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1180: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
1190: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
11a0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  .h>.# include <u
11b0: 75 69 64 2f 75 75 69 64 2e 68 3e 0a 23 20 69 66  uid/uuid.h>.# if
11c0: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
11d0: 5f 5f 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f  __) && ((__MAC_O
11e0: 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f  S_X_VERSION_MIN_
11f0: 52 45 51 55 49 52 45 44 20 3e 20 31 30 35 30 29  REQUIRED > 1050)
1200: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 20 28 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56    (__IPHONE_OS_V
1230: 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49  ERSION_MIN_REQUI
1240: 52 45 44 20 3e 20 32 30 30 30 29 29 0a 23 20 20  RED > 2000)).#  
1250: 64 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48  define HAVE_GETH
1260: 4f 53 54 55 55 49 44 20 31 0a 23 20 65 6e 64 69  OSTUUID 1.# endi
1270: 66 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b  f.# if OS_VXWORK
1280: 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 65  S.#  include <se
1290: 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e  maphore.h>.#  in
12a0: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
12b0: 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75  .# else.#  inclu
12c0: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
12d0: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  #  include <sys/
12e0: 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66  param.h>.# endif
12f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1300: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1310: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
1320: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1330: 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41  ) || (SQLITE_ENA
1340: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1350: 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53  E && !OS_VXWORKS
1360: 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  ).# include <sys
1370: 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66  /mount.h>.#endif
1380: 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 54  ..#ifdef HAVE_UT
1390: 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  IME.# include <u
13a0: 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  time.h>.#endif..
13b0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61  /*.** Allowed va
13c0: 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65  lues of unixFile
13d0: 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  .fsFlags.*/.#def
13e0: 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  ine SQLITE_FSFLA
13f0: 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20  GS_IS_MSDOS     
1400: 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  0x1../*.** If we
1410: 20 61 72 65 20 74 6f 20 62 65 20 74 68 72 65 61   are to be threa
1420: 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20  d-safe, include 
1430: 74 68 65 20 70 74 68 72 65 61 64 73 20 68 65 61  the pthreads hea
1440: 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a  der and define.*
1450: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49  * the SQLITE_UNI
1460: 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e  X_THREADS macro.
1470: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
1480: 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c  HREADSAFE.# incl
1490: 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a  ude <pthread.h>.
14a0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
14b0: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23  UNIX_THREADS 1.#
14c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
14d0: 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  ault permissions
14e0: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
14f0: 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66   new file.*/.#if
1500: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  ndef SQLITE_DEFA
1510: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
1520: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
1530: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
1540: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36  E_PERMISSIONS 06
1550: 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  44.#endif../*. *
1560: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
1570: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
1580: 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79 20 64  ing auto proxy d
1590: 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ir. */.#ifndef S
15a0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
15b0: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
15c0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
15d0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
15e0: 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  DIR_PERMISSIONS 
15f0: 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0755.#endif../*.
1600: 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f  ** Maximum suppo
1610: 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68  rted path-length
1620: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58  ..*/.#define MAX
1630: 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f  _PATHNAME 512../
1640: 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68  *.** Only set th
1650: 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20 74  e lastErrno if t
1660: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
1670: 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61 6e   a real error an
1680: 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d  d not .** a norm
1690: 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74 75  al expected retu
16a0: 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54  rn code of SQLIT
16b0: 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45  E_BUSY or SQLITE
16c0: 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  _OK.*/.#define I
16d0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20  S_LOCK_ERROR(x) 
16e0: 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f   ((x != SQLITE_O
16f0: 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c 49  K) && (x != SQLI
1700: 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46 6f  TE_BUSY))../* Fo
1710: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
1720: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1730: 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78 53  ct unixShm unixS
1740: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
1750: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1760: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1770: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1780: 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69 78  unixShmNode unix
1790: 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f  ShmNode;       /
17a0: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
17b0: 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70 65  instance */.type
17c0: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 49  def struct unixI
17d0: 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e 6f  nodeInfo unixIno
17e0: 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e 20  deInfo;   /* An 
17f0: 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64 65  i-node */.typede
1800: 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75  f struct UnixUnu
1810: 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65 64  sedFd UnixUnused
1820: 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e  Fd;     /* An un
1830: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1840: 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ptor */../*.** S
1850: 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72 20  ometimes, after 
1860: 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 73  a file handle is
1870: 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69 74   closed by SQLit
1880: 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  e, the file desc
1890: 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74  riptor.** cannot
18a0: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
18b0: 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73 65  iately. In these
18c0: 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63 65   cases, instance
18d0: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
18e0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  ng.** structure 
18f0: 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  are used to stor
1900: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
1910: 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69 74  iptor while wait
1920: 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70  ing for an.** op
1930: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69 74  portunity to eit
1940: 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65 75  her close or reu
1950: 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  se it..*/.struct
1960: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b 0a   UnixUnusedFd {.
1970: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
1980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1990: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
19a0: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74  o close */.  int
19b0: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
19c0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
19d0: 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69  this file descri
19e0: 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ptor was opened 
19f0: 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  with */.  UnixUn
1a00: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20 20  usedFd *pNext;  
1a10: 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73      /* Next unus
1a20: 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
1a30: 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20  or on same file 
1a40: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
1a50: 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
1a60: 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20  ure is subclass 
1a70: 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  of sqlite3_file 
1a80: 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20  specific to the 
1a90: 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c  unix.** VFS impl
1aa0: 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a  ementations..*/.
1ab0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
1ac0: 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65  nixFile unixFile
1ad0: 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  ;.struct unixFil
1ae0: 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  e {.  sqlite3_io
1af0: 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
1b00: 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77  pMethod;  /* Alw
1b10: 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e  ays the first en
1b20: 74 72 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  try */.  unixIno
1b30: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
1b60: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
1b70: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1ba0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1bb0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1bc0: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1bd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1be0: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1bf0: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1c00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
1c10: 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  trlFlags;       
1c20: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1c30: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
1c40: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
1c50: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
1c80: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
1c90: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1ca0: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1cb0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1cc0: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1cd0: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1ce0: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1cf0: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1d10: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1d20: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1d40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d50: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1d60: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
1d70: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1da0: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1db0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1dc0: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de0: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1df0: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1e00: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1e10: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1e20: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1e30: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e50: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1e60: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1e70: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1e80: 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
1e90: 43 54 49 4f 4e 0a 20 20 69 6e 74 20 70 72 6f 74  CTION.  int prot
1ea0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1ec0: 61 74 61 20 70 72 6f 74 65 63 74 69 6f 6e 20 66  ata protection f
1ed0: 6c 61 67 73 20 66 72 6f 6d 20 75 6e 69 78 4f 70  lags from unixOp
1ee0: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  en */.#endif.#if
1ef0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1f00: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20  OCKING_STYLE || 
1f10: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1f20: 5f 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73  _).  unsigned fs
1f30: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68           /* cach
1f50: 65 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20  ed details from 
1f60: 73 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64  statfs() */.#end
1f70: 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  if.#if OS_VXWORK
1f80: 53 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  S.  int isDelete
1f90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fa0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
1fb0: 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72  e on close if tr
1fc0: 75 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76  ue */.  struct v
1fd0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
1fe0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  d;          /* U
1ff0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f  nique file ID */
2000: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
2010: 4e 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  NDEBUG.  /* The 
2020: 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61  next group of va
2030: 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64  riables are used
2040: 20 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65   to track whethe
2050: 72 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a  r or not the.  *
2060: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
2070: 75 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32  unter in bytes 2
2080: 34 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65  4-27 of database
2090: 20 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74   files are updat
20a0: 65 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72  ed.  ** whenever
20b0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
20c0: 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
20d0: 73 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  s.  An assertion
20e0: 20 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a   fault will.  **
20f0: 20 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65   occur if a file
2100: 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
2110: 6f 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e  out also updatin
2120: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
2130: 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20  n.  ** counter. 
2140: 20 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61   This test is ma
2150: 64 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20  de to avoid new 
2160: 70 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72  problems similar
2170: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65   to the.  ** one
2180: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69   described by ti
2190: 63 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a  cket #3584. .  *
21a0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
21b0: 72 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b  r transCntrChng;
21c0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
21d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
21e0: 75 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f  unter changed */
21f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2200: 20 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20   dbUpdate;      
2210: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
2220: 20 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73   part of databas
2230: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a  e file changed *
2240: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
2250: 72 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b  r inNormalWrite;
2260: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e     /* True if in
2270: 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
2280: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e  operation */.#en
2290: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
22a0: 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74  E_TEST.  /* In t
22b0: 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61  est mode, increa
22c0: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
22d0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20  his structure a 
22e0: 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a  bit so that .  *
22f0: 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74  * it is larger t
2300: 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43  han the struct C
2310: 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64  rashFile defined
2320: 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a   in test6.c..  *
2330: 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e  /.  char aPaddin
2340: 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b  g[32];.#endif.};
2350: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
2360: 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 75  values for the u
2370: 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67  nixFile.ctrlFlag
2380: 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64  s bitmask:.*/.#d
2390: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45  efine UNIXFILE_E
23a0: 58 43 4c 20 20 20 20 20 20 20 20 30 78 30 31 20  XCL        0x01 
23b0: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
23c0: 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63  ns from one proc
23d0: 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66  ess only */.#def
23e0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  ine UNIXFILE_RDO
23f0: 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20 20 20  NLY      0x02   
2400: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
2410: 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a  is read only */.
2420: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
2430: 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78 30  _PERSIST_WAL 0x0
2440: 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73 74  4     /* Persist
2450: 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a  ent WAL mode */.
2460: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
2470: 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 23  ISABLE_DIRSYNC.#
2480: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
2490: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 38  _DIRSYNC    0x08
24a0: 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
24b0: 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a 2f  y sync needed */
24c0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
24d0: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
24e0: 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66 0a      0x00.#endif.
24f0: 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63  ./*.** Include c
2500: 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d  ode that is comm
2510: 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63  on to all os_*.c
2520: 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75   files.*/.#inclu
2530: 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22  de "os_common.h"
2540: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
2550: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
2560: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
2570: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
2580: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
2590: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
25a0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
25b0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
25c0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
25d0: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
25e0: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
25f0: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
2600: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
2610: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
2620: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
2630: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
2640: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
2650: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
2660: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
2670: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
2680: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
2690: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
26a0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
26b0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
26c0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
26d0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
26e0: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
26f0: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
2700: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
2710: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 23  adid 0.#endif..#
2720: 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a  ifdef __APPLE__.
2730: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45  #define SQLITE_E
2740: 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f 43 4b 20  NABLE_SUPERLOCK 
2750: 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  1.#endif..#if SQ
2760: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55 50 45  LITE_ENABLE_SUPE
2770: 52 4c 4f 43 4b 0a 23 69 6e 63 6c 75 64 65 20 22  RLOCK.#include "
2780: 73 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c  sqlite3.h".#incl
2790: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
27a0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
27b0: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75  h>../*.** A stru
27c0: 63 74 75 72 65 20 74 6f 20 63 6f 6c 6c 65 63 74  cture to collect
27d0: 20 61 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20   a busy-handler 
27e0: 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 61 72 67  callback and arg
27f0: 75 6d 65 6e 74 20 61 6e 64 20 61 20 63 6f 75 6e  ument and a coun
2800: 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 75 6d 62  t.** of the numb
2810: 65 72 20 6f 66 20 74 69 6d 65 73 20 69 74 20 68  er of times it h
2820: 61 73 20 62 65 65 6e 20 69 6e 76 6f 6b 65 64 2e  as been invoked.
2830: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 70 65 72  .*/.struct Super
2840: 6c 6f 63 6b 42 75 73 79 20 7b 0a 20 20 69 6e 74  lockBusy {.  int
2850: 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c   (*xBusy)(void*,
2860: 69 6e 74 29 3b 20 20 20 20 20 20 20 20 2f 2a 20  int);        /* 
2870: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d  Pointer to busy-
2880: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
2890: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
28a0: 79 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  yArg;           
28b0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
28c0: 72 67 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  rg to pass to xB
28d0: 75 73 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75  usy */.  int nBu
28e0: 73 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sy;             
28f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2900: 65 72 20 6f 66 20 74 69 6d 65 73 20 78 42 75 73  er of times xBus
2910: 79 20 68 61 73 20 62 65 65 6e 20 69 6e 76 6f 6b  y has been invok
2920: 65 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66  ed */.};.typedef
2930: 20 73 74 72 75 63 74 20 53 75 70 65 72 6c 6f 63   struct Superloc
2940: 6b 42 75 73 79 20 53 75 70 65 72 6c 6f 63 6b 42  kBusy SuperlockB
2950: 75 73 79 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  usy;../*.** An i
2960: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
2970: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2980: 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
2990: 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65 0a  for each active.
29a0: 2a 2a 20 73 75 70 65 72 6c 6f 63 6b 2e 20 54 68  ** superlock. Th
29b0: 65 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 20  e opaque handle 
29c0: 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
29d0: 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
29e0: 6b 28 29 20 69 73 0a 2a 2a 20 61 63 74 75 61 6c  k() is.** actual
29f0: 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
2a00: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
2a10: 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  his structure..*
2a20: 2f 0a 73 74 72 75 63 74 20 53 75 70 65 72 6c 6f  /.struct Superlo
2a30: 63 6b 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ck {.  sqlite3 *
2a40: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
2a50: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
2a60: 73 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20 74  se handle used t
2a70: 6f 20 6c 6f 63 6b 20 64 62 20 2a 2f 0a 20 20 69  o lock db */.  i
2a80: 6e 74 20 62 57 61 6c 3b 20 20 20 20 20 20 20 20  nt bWal;        
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aa0: 2a 20 54 72 75 65 20 69 66 20 64 62 20 69 73 20  * True if db is 
2ab0: 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 20 2a  a WAL database *
2ac0: 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  /.};.typedef str
2ad0: 75 63 74 20 53 75 70 65 72 6c 6f 63 6b 20 53 75  uct Superlock Su
2ae0: 70 65 72 6c 6f 63 6b 3b 0a 0a 2f 2a 0a 2a 2a 20  perlock;../*.** 
2af0: 54 68 65 20 70 43 74 78 20 70 6f 69 6e 74 65 72  The pCtx pointer
2b00: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
2b10: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 63 74 75  function is actu
2b20: 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
2b30: 6f 20 61 0a 2a 2a 20 53 75 70 65 72 6c 6f 63 6b  o a.** Superlock
2b40: 42 75 73 79 20 73 74 72 75 63 74 75 72 65 2e 20  Busy structure. 
2b50: 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 2d  Invoke the busy-
2b60: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
2b70: 20 65 6e 63 61 70 73 75 6c 61 74 65 64 0a 2a 2a   encapsulated.**
2b80: 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72   by the structur
2b90: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
2ba0: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
2bb0: 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63 6b  ic int superlock
2bc0: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
2bd0: 20 2a 70 43 74 78 2c 20 69 6e 74 20 55 4e 55 53   *pCtx, int UNUS
2be0: 45 44 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b  ED){.  Superlock
2bf0: 42 75 73 79 20 2a 70 42 75 73 79 20 3d 20 28 53  Busy *pBusy = (S
2c00: 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 29 70  uperlockBusy *)p
2c10: 43 74 78 3b 0a 20 20 69 66 28 20 70 42 75 73 79  Ctx;.  if( pBusy
2c20: 2d 3e 78 42 75 73 79 3d 3d 30 20 29 20 72 65 74  ->xBusy==0 ) ret
2c30: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
2c40: 70 42 75 73 79 2d 3e 78 42 75 73 79 28 70 42 75  pBusy->xBusy(pBu
2c50: 73 79 2d 3e 70 42 75 73 79 41 72 67 2c 20 70 42  sy->pBusyArg, pB
2c60: 75 73 79 2d 3e 6e 42 75 73 79 2b 2b 29 3b 0a 7d  usy->nBusy++);.}
2c70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2c80: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
2c90: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
2ca0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
2cb0: 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 63 6f 6e  file for .** con
2cc0: 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20 6f 70  nection db is op
2cd0: 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 6f  en in WAL mode o
2ce0: 72 20 6e 6f 74 2e 20 49 66 20 6e 6f 20 65 72 72  r not. If no err
2cf0: 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  or occurs and th
2d00: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
2d10: 6c 65 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64  le is in WAL mod
2d20: 65 2c 20 73 65 74 20 2a 70 62 57 61 6c 20 74 6f  e, set *pbWal to
2d30: 20 74 72 75 65 20 61 6e 64 20 72 65 74 75 72 6e   true and return
2d40: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49   SQLITE_OK..** I
2d50: 66 20 69 74 20 69 73 20 6e 6f 74 20 69 6e 20 57  f it is not in W
2d60: 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20 2a 70 62  AL mode, set *pb
2d70: 57 61 6c 20 74 6f 20 66 61 6c 73 65 2e 0a 2a 2a  Wal to false..**
2d80: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
2d90: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
2da0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
2db0: 6f 64 65 2e 20 54 68 65 20 76 61 6c 75 65 20 6f  ode. The value o
2dc0: 66 20 2a 70 62 57 61 6c 0a 2a 2a 20 69 73 20 75  f *pbWal.** is u
2dd0: 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
2de0: 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
2df0: 20 69 6e 74 20 73 75 70 65 72 6c 6f 63 6b 49 73   int superlockIs
2e00: 57 61 6c 28 53 75 70 65 72 6c 6f 63 6b 20 2a 70  Wal(Superlock *p
2e10: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Lock){.  int rc;
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2e40: 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn Code */.  sql
2e50: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
2e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2e70: 43 6f 6d 70 69 6c 65 64 20 50 52 41 47 4d 41 20  Compiled PRAGMA 
2e80: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 74 61  journal_mode sta
2e90: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 72 63 20  tement */..  rc 
2ea0: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
2eb0: 65 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22 50 52  e(pLock->db, "PR
2ec0: 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61  AGMA main.journa
2ed0: 6c 5f 6d 6f 64 65 22 2c 20 2d 31 2c 20 26 70 53  l_mode", -1, &pS
2ee0: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
2ef0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2f00: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 4c 6f  eturn rc;..  pLo
2f10: 63 6b 2d 3e 62 57 61 6c 20 3d 20 30 3b 0a 20 20  ck->bWal = 0;.  
2f20: 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
2f30: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
2f40: 6d 74 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  mt) ){.    const
2f50: 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 28   char *zMode = (
2f60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
2f70: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2f80: 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
2f90: 69 66 28 20 7a 4d 6f 64 65 20 26 26 20 73 74 72  if( zMode && str
2fa0: 6c 65 6e 28 7a 4d 6f 64 65 29 3d 3d 33 20 26 26  len(zMode)==3 &&
2fb0: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
2fc0: 70 28 22 77 61 6c 22 2c 20 7a 4d 6f 64 65 2c 20  p("wal", zMode, 
2fd0: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  3)==0 ){.      p
2fe0: 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 31 3b 0a  Lock->bWal = 1;.
2ff0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
3000: 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  urn sqlite3_fina
3010: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a  lize(pStmt);.}..
3020: 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 6e 20  /*.** Obtain an 
3030: 65 78 63 6c 75 73 69 76 65 20 73 68 6d 2d 6c 6f  exclusive shm-lo
3040: 63 6b 20 6f 6e 20 6e 42 79 74 65 20 62 79 74 65  ck on nByte byte
3050: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66  s starting at of
3060: 66 73 65 74 20 69 64 78 0a 2a 2a 20 6f 66 20 74  fset idx.** of t
3070: 68 65 20 66 69 6c 65 20 66 64 2e 20 49 66 20 74  he file fd. If t
3080: 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
3090: 65 20 6f 62 74 61 69 6e 65 64 20 69 6d 6d 65 64  e obtained immed
30a0: 69 61 74 65 6c 79 2c 20 69 6e 76 6f 6b 65 0a 2a  iately, invoke.*
30b0: 2a 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  * the busy-handl
30c0: 65 72 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  er until either 
30d0: 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  it is obtained o
30e0: 72 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  r the busy-handl
30f0: 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 72  er.** callback r
3100: 65 74 75 72 6e 73 20 30 2e 0a 2a 2f 0a 73 74 61  eturns 0..*/.sta
3110: 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63  tic int superloc
3120: 6b 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  kShmLock(.  sqli
3130: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
3140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
3160: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  dle */.  int idx
3170: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3180: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
3190: 65 74 20 6f 66 20 73 68 6d 2d 6c 6f 63 6b 20 74  et of shm-lock t
31a0: 6f 20 6f 62 74 61 69 6e 20 2a 2f 0a 20 20 69 6e  o obtain */.  in
31b0: 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31d0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 65   Number of conse
31e0: 63 74 69 76 65 20 62 79 74 65 73 20 74 6f 20 6c  ctive bytes to l
31f0: 6f 63 6b 20 2a 2f 0a 20 20 53 75 70 65 72 6c 6f  ock */.  Superlo
3200: 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 20 20  ckBusy *pBusy   
3210: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73 79           /* Busy
3220: 2d 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65 72  -handler wrapper
3230: 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
3240: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 28 2a  int rc;.  int (*
3250: 78 53 68 6d 4c 6f 63 6b 29 28 73 71 6c 69 74 65  xShmLock)(sqlite
3260: 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2c 20 69 6e  3_file*, int, in
3270: 74 2c 20 69 6e 74 29 20 3d 20 66 64 2d 3e 70 4d  t, int) = fd->pM
3280: 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b  ethods->xShmLock
3290: 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20  ;.  do {.    rc 
32a0: 3d 20 78 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 69  = xShmLock(fd, i
32b0: 64 78 2c 20 6e 42 79 74 65 2c 20 53 51 4c 49 54  dx, nByte, SQLIT
32c0: 45 5f 53 48 4d 5f 4c 4f 43 4b 7c 53 51 4c 49 54  E_SHM_LOCK|SQLIT
32d0: 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
32e0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  ;.  }while( rc==
32f0: 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73  SQLITE_BUSY && s
3300: 75 70 65 72 6c 6f 63 6b 42 75 73 79 48 61 6e 64  uperlockBusyHand
3310: 6c 65 72 28 28 76 6f 69 64 20 2a 29 70 42 75 73  ler((void *)pBus
3320: 79 2c 20 30 29 20 29 3b 0a 20 20 72 65 74 75 72  y, 0) );.  retur
3330: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
3340: 62 74 61 69 6e 20 74 68 65 20 65 78 74 72 61 20  btain the extra 
3350: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 64 61 74  locks on the dat
3360: 61 62 61 73 65 20 66 69 6c 65 20 72 65 71 75 69  abase file requi
3370: 72 65 64 20 66 6f 72 20 57 41 4c 20 64 61 74 61  red for WAL data
3380: 62 61 73 65 73 2e 0a 2a 2a 20 49 6e 76 6f 6b 65  bases..** Invoke
3390: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
33a0: 73 79 2d 68 61 6e 64 6c 65 72 20 61 73 20 72 65  sy-handler as re
33b0: 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
33c0: 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63 6b 57  c int superlockW
33d0: 61 6c 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  alLock(.  sqlite
33e0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
33f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
3400: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 70 65  abase handle ope
3410: 6e 20 6f 6e 20 57 41 4c 20 64 61 74 61 62 61 73  n on WAL databas
3420: 65 20 2a 2f 0a 20 20 53 75 70 65 72 6c 6f 63 6b  e */.  Superlock
3430: 42 75 73 79 20 2a 70 42 75 73 79 20 20 20 20 20  Busy *pBusy     
3440: 20 20 20 20 20 20 20 2f 2a 20 42 75 73 79 20 68         /* Busy h
3450: 61 6e 64 6c 65 72 20 77 72 61 70 70 65 72 20 6f  andler wrapper o
3460: 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bject */.){.  in
3470: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3490: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
34a0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
34b0: 66 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  fd = 0;         
34c0: 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74 61 62 61    /* Main databa
34d0: 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a  se file handle *
34e0: 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
34f0: 65 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20  e *p = 0;       
3500: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
3510: 6f 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  o first page of 
3520: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
3530: 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20  ..  /* Obtain a 
3540: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
3550: 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65  qlite3_file obje
3560: 63 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 6d  ct open on the m
3570: 61 69 6e 20 64 62 20 66 69 6c 65 2e 20 2a 2f 0a  ain db file. */.
3580: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
3590: 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
35a0: 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46  "main", SQLITE_F
35b0: 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  CNTL_FILE_POINTE
35c0: 52 2c 20 28 76 6f 69 64 20 2a 29 26 66 64 29 3b  R, (void *)&fd);
35d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
35e0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
35f0: 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74  ;..  /* Obtain t
3600: 68 65 20 22 72 65 63 6f 76 65 72 79 22 20 6c 6f  he "recovery" lo
3610: 63 6b 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  ck. Normally, th
3620: 69 73 20 6c 6f 63 6b 20 69 73 20 6f 6e 6c 79 20  is lock is only 
3630: 6f 62 74 61 69 6e 65 64 20 62 79 0a 20 20 2a 2a  obtained by.  **
3640: 20 63 6c 69 65 6e 74 73 20 72 75 6e 6e 69 6e 67   clients running
3650: 20 64 61 74 61 62 61 73 65 20 72 65 63 6f 76 65   database recove
3660: 72 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 72 63 20  ry.  .  */.  rc 
3670: 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f  = superlockShmLo
3680: 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20 70 42 75  ck(fd, 2, 1, pBu
3690: 73 79 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  sy);.  if( rc!=S
36a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
36b0: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f  n rc;..  /* Zero
36c0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
36d0: 65 20 66 69 72 73 74 20 73 68 61 72 65 64 2d 6d  e first shared-m
36e0: 65 6d 6f 72 79 20 70 61 67 65 2e 20 54 68 69 73  emory page. This
36f0: 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 79 0a   means that any.
3700: 20 20 2a 2a 20 63 6c 69 65 6e 74 73 20 74 68 61    ** clients tha
3710: 74 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  t open read or w
3720: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
3730: 73 20 66 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e  s from this poin
3740: 74 20 6f 6e 20 77 69 6c 6c 0a 20 20 2a 2a 20 68  t on will.  ** h
3750: 61 76 65 20 74 6f 20 72 75 6e 20 72 65 63 6f 76  ave to run recov
3760: 65 72 79 20 62 65 66 6f 72 65 20 70 72 6f 63 65  ery before proce
3770: 65 64 69 6e 67 2e 20 53 69 6e 63 65 20 74 68 65  eding. Since the
3780: 79 20 6e 65 65 64 20 74 68 65 20 22 72 65 63 6f  y need the "reco
3790: 76 65 72 79 22 0a 20 20 2a 2a 20 6c 6f 63 6b 20  very".  ** lock 
37a0: 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 73  that this proces
37b0: 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 6f 20  s is holding to 
37c0: 64 6f 20 74 68 61 74 2c 20 6e 6f 20 6e 65 77 20  do that, no new 
37d0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 20 20  read or write.  
37e0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ** transactions 
37f0: 6d 61 79 20 6e 6f 77 20 62 65 20 6f 70 65 6e 65  may now be opene
3800: 64 2e 20 4e 6f 72 20 63 61 6e 20 61 20 63 68 65  d. Nor can a che
3810: 63 6b 70 6f 69 6e 74 20 62 65 20 72 75 6e 2c 20  ckpoint be run, 
3820: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d  for the.  ** sam
3830: 65 20 72 65 61 73 6f 6e 2e 0a 20 20 2a 2f 0a 20  e reason..  */. 
3840: 20 72 63 20 3d 20 66 64 2d 3e 70 4d 65 74 68 6f   rc = fd->pMetho
3850: 64 73 2d 3e 78 53 68 6d 4d 61 70 28 66 64 2c 20  ds->xShmMap(fd, 
3860: 30 2c 20 33 32 2a 31 30 32 34 2c 20 31 2c 20 26  0, 32*1024, 1, &
3870: 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  p);.  if( rc!=SQ
3880: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
3890: 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 28 76   rc;.  memset((v
38a0: 6f 69 64 20 2a 29 70 2c 20 30 2c 20 33 32 29 3b  oid *)p, 0, 32);
38b0: 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 65 78  ..  /* Obtain ex
38c0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 6f 6e  clusive locks on
38d0: 20 61 6c 6c 20 74 68 65 20 22 72 65 61 64 2d 6c   all the "read-l
38e0: 6f 63 6b 22 20 73 6c 6f 74 73 2e 20 4f 6e 63 65  ock" slots. Once
38f0: 20 74 68 65 73 65 20 6c 6f 63 6b 73 0a 20 20 2a   these locks.  *
3900: 2a 20 61 72 65 20 68 65 6c 64 2c 20 69 74 20 69  * are held, it i
3910: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
3920: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  t there are no a
3930: 63 74 69 76 65 20 72 65 61 64 65 72 2c 20 77 72  ctive reader, wr
3940: 69 74 65 72 20 6f 72 20 0a 20 20 2a 2a 20 63 68  iter or .  ** ch
3950: 65 63 6b 70 6f 69 6e 74 65 72 20 63 6c 69 65 6e  eckpointer clien
3960: 74 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ts..  */.  rc = 
3970: 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f 63 6b  superlockShmLock
3980: 28 66 64 2c 20 33 2c 20 53 51 4c 49 54 45 5f 53  (fd, 3, SQLITE_S
3990: 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 70 42 75 73  HM_NLOCK-3, pBus
39a0: 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  y);.  return rc;
39b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
39c0: 65 20 61 20 73 75 70 65 72 6c 6f 63 6b 20 68 65  e a superlock he
39d0: 6c 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ld on a database
39e0: 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d   file. The argum
39f0: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 0a 2a  ent passed to .*
3a00: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
3a10: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
3a20: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 73  btained from a s
3a30: 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74  uccessful call t
3a40: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 64 65 6d 6f  o.** sqlite3demo
3a50: 5f 73 75 70 65 72 6c 6f 63 6b 28 29 2e 0a 2a 2f  _superlock()..*/
3a60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
3a70: 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e  ite3demo_superun
3a80: 6c 6f 63 6b 28 76 6f 69 64 20 2a 70 4c 6f 63 6b  lock(void *pLock
3a90: 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b 20 2a  ){.  Superlock *
3aa0: 70 20 3d 20 28 53 75 70 65 72 6c 6f 63 6b 20 2a  p = (Superlock *
3ab0: 29 70 4c 6f 63 6b 3b 0a 20 20 69 66 28 20 70 2d  )pLock;.  if( p-
3ac0: 3e 62 57 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  >bWal ){.    int
3ad0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3af0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
3b00: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53     int flags = S
3b10: 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
3b20: 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
3b30: 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 73 71 6c  CLUSIVE;.    sql
3b40: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
3b50: 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
3b60: 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
3b70: 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20  (p->db, "main", 
3b80: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c  SQLITE_FCNTL_FIL
3b90: 45 5f 50 4f 49 4e 54 45 52 2c 20 28 76 6f 69 64  E_POINTER, (void
3ba0: 20 2a 29 26 66 64 29 3b 0a 20 20 20 20 69 66 28   *)&fd);.    if(
3bb0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3bc0: 7b 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74  {.      fd->pMet
3bd0: 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66  hods->xShmLock(f
3be0: 64 2c 20 32 2c 20 31 2c 20 66 6c 61 67 73 29 3b  d, 2, 1, flags);
3bf0: 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74 68  .      fd->pMeth
3c00: 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66 64  ods->xShmLock(fd
3c10: 2c 20 33 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  , 3, SQLITE_SHM_
3c20: 4e 4c 4f 43 4b 2d 33 2c 20 66 6c 61 67 73 29 3b  NLOCK-3, flags);
3c30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
3c40: 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62  ite3_close(p->db
3c50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3c60: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  e(p);.}../*.** O
3c70: 62 74 61 69 6e 20 61 20 73 75 70 65 72 6c 6f 63  btain a superloc
3c80: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
3c90: 65 20 66 69 6c 65 20 69 64 65 6e 74 69 66 69 65  e file identifie
3ca0: 64 20 62 79 20 7a 50 61 74 68 2c 20 75 73 69 6e  d by zPath, usin
3cb0: 67 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  g the.** locking
3cc0: 20 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76   primitives prov
3cd0: 69 64 65 64 20 62 79 20 56 46 53 20 7a 56 66 73  ided by VFS zVfs
3ce0: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
3cf0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a   SQLITE_OK is.**
3d00: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6f 75   returned and ou
3d10: 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
3d20: 70 4c 6f 63 6b 20 69 73 20 70 6f 70 75 6c 61 74  pLock is populat
3d30: 65 64 20 77 69 74 68 20 61 6e 20 6f 70 61 71 75  ed with an opaqu
3d40: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 74 68 61 74  e handle.** that
3d50: 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74   may be used wit
3d60: 68 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  h sqlite3demo_su
3d70: 70 65 72 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 72  perunlock() to r
3d80: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 2e  elease the lock.
3d90: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
3da0: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4c 6f  or occurs, *ppLo
3db0: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ck is set to 0 a
3dc0: 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  nd an SQLite err
3dd0: 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 28 65 2e 67  or code .** (e.g
3de0: 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 29 20 69  . SQLITE_BUSY) i
3df0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
3e00: 2a 20 49 66 20 61 20 72 65 71 75 69 72 65 64 20  * If a required 
3e10: 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
3e20: 62 74 61 69 6e 65 64 20 69 6d 6d 65 64 69 61 74  btained immediat
3e30: 65 6c 79 20 61 6e 64 20 74 68 65 20 78 42 75 73  ely and the xBus
3e40: 79 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 74  y parameter.** t
3e50: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
3e60: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
3e70: 6e 20 78 42 75 73 79 20 69 73 20 69 6e 76 6f 6b  n xBusy is invok
3e80: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ed in the same w
3e90: 61 79 0a 2a 2a 20 61 73 20 61 20 62 75 73 79 2d  ay.** as a busy-
3ea0: 68 61 6e 64 6c 65 72 20 72 65 67 69 73 74 65 72  handler register
3eb0: 65 64 20 77 69 74 68 20 53 51 4c 69 74 65 20 28  ed with SQLite (
3ec0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 62 75  using sqlite3_bu
3ed0: 73 79 5f 68 61 6e 64 6c 65 72 28 29 29 0a 2a 2a  sy_handler()).**
3ee0: 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 74 68   until either th
3ef0: 65 20 6c 6f 63 6b 20 63 61 6e 20 62 65 20 6f 62  e lock can be ob
3f00: 74 61 69 6e 65 64 20 6f 72 20 74 68 65 20 62 75  tained or the bu
3f10: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
3f20: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30  ion returns.** 0
3f30: 20 28 69 6e 64 69 63 61 74 69 6e 67 20 22 67 69   (indicating "gi
3f40: 76 65 20 75 70 22 29 2e 0a 2a 2f 0a 73 74 61 74  ve up")..*/.stat
3f50: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 64 65  ic int sqlite3de
3f60: 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 0a 20 20  mo_superlock(.  
3f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
3f80: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
3f90: 2f 2a 20 50 61 74 68 20 74 6f 20 64 61 74 61 62  /* Path to datab
3fa0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 6f 63 6b  ase file to lock
3fb0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3fc0: 20 2a 7a 56 66 73 2c 20 20 20 20 20 20 20 20 20   *zVfs,         
3fd0: 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
3fe0: 75 73 65 20 74 6f 20 61 63 63 65 73 73 20 64 61  use to access da
3ff0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4000: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 66   /* Additional f
4030: 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
4040: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20  sqlite3_open_v2 
4050: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
4060: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 20 20 20  )(void*,int),   
4070: 20 20 20 20 20 2f 2a 20 42 75 73 79 20 68 61 6e       /* Busy han
4080: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f  dler callback */
4090: 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 41 72  .  void *pBusyAr
40a0: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
40b0: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72     /* Context ar
40c0: 67 20 66 6f 72 20 62 75 73 79 20 68 61 6e 64 6c  g for busy handl
40d0: 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70  er */.  void **p
40e0: 70 4c 6f 63 6b 20 20 20 20 20 20 20 20 20 20 20  pLock           
40f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
4100: 43 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20  Context to pass 
4110: 74 6f 20 73 75 70 65 72 75 6e 6c 6f 63 6b 28 29  to superunlock()
4120: 20 2a 2f 0a 29 7b 0a 20 20 53 75 70 65 72 6c 6f   */.){.  Superlo
4130: 63 6b 42 75 73 79 20 62 75 73 79 20 3d 20 7b 30  ckBusy busy = {0
4140: 2c 20 30 2c 20 30 7d 3b 20 2f 2a 20 42 75 73 79  , 0, 0}; /* Busy
4150: 20 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65 72   handler wrapper
4160: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
4170: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4190: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
41a0: 20 53 75 70 65 72 6c 6f 63 6b 20 2a 70 4c 6f 63   Superlock *pLoc
41b0: 6b 3b 0a 0a 20 20 70 4c 6f 63 6b 20 3d 20 73 71  k;..  pLock = sq
41c0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
41d0: 65 6f 66 28 53 75 70 65 72 6c 6f 63 6b 29 29 3b  eof(Superlock));
41e0: 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 20  .  if( !pLock ) 
41f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
4200: 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4c  MEM;.  memset(pL
4210: 6f 63 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53  ock, 0, sizeof(S
4220: 75 70 65 72 6c 6f 63 6b 29 29 3b 0a 0a 20 20 2f  uperlock));..  /
4230: 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
4240: 65 20 68 61 6e 64 6c 65 20 6f 6e 20 74 68 65 20  e handle on the 
4250: 66 69 6c 65 20 74 6f 20 73 75 70 65 72 6c 6f 63  file to superloc
4260: 6b 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  k. */.  rc = sql
4270: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20  ite3_open_v2(.  
4280: 20 20 20 20 7a 50 61 74 68 2c 20 26 70 4c 6f 63      zPath, &pLoc
4290: 6b 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50  k->db, SQLITE_OP
42a0: 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
42b0: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
42c0: 66 6c 61 67 73 2c 20 7a 56 66 73 0a 20 20 29 3b  flags, zVfs.  );
42d0: 0a 0a 20 20 2f 2a 20 49 6e 73 74 61 6c 6c 20 61  ..  /* Install a
42e0: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 61 6e   busy-handler an
42f0: 64 20 65 78 65 63 75 74 65 20 61 20 42 45 47 49  d execute a BEGI
4300: 4e 20 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20  N EXCLUSIVE. If 
4310: 74 68 69 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  this is not.  **
4320: 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
4330: 20 74 68 69 73 20 69 73 20 61 6c 6c 20 77 65 20   this is all we 
4340: 6e 65 65 64 20 74 6f 20 64 6f 2e 20 20 0a 20 20  need to do.  .  
4350: 2a 2a 0a 20 20 2a 2a 20 41 20 77 72 61 70 70 65  **.  ** A wrappe
4360: 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  r function is us
4370: 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ed to invoke the
4380: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 6e   busy-handler in
4390: 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20 72 65  stead of.  ** re
43a0: 67 69 73 74 65 72 69 6e 67 20 74 68 65 20 62 75  gistering the bu
43b0: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
43c0: 69 6f 6e 20 73 75 70 70 6c 69 65 64 20 62 79 20  ion supplied by 
43d0: 74 68 65 20 75 73 65 72 20 64 69 72 65 63 74 6c  the user directl
43e0: 79 0a 20 20 2a 2a 20 77 69 74 68 20 53 51 4c 69  y.  ** with SQLi
43f0: 74 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  te. This is beca
4400: 75 73 65 20 74 68 65 20 73 61 6d 65 20 62 75 73  use the same bus
4410: 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
4420: 6f 6e 20 6d 61 79 20 62 65 0a 20 20 2a 2a 20 69  on may be.  ** i
4430: 6e 76 6f 6b 65 64 20 64 69 72 65 63 74 6c 79 20  nvoked directly 
4440: 6c 61 74 65 72 20 6f 6e 20 77 68 65 6e 20 61 74  later on when at
4450: 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 62 74 61  tempting to obta
4460: 69 6e 20 74 68 65 20 65 78 74 72 61 20 6c 6f 63  in the extra loc
4470: 6b 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  ks.  ** required
4480: 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 42 79   in WAL mode. By
4490: 20 75 73 69 6e 67 20 74 68 65 20 77 72 61 70 70   using the wrapp
44a0: 65 72 2c 20 77 65 20 61 72 65 20 61 62 6c 65 20  er, we are able 
44b0: 74 6f 20 67 75 61 72 61 6e 74 65 65 0a 20 20 2a  to guarantee.  *
44c0: 2a 20 74 68 61 74 20 74 68 65 20 22 6e 42 75 73  * that the "nBus
44d0: 79 22 20 69 6e 74 65 67 65 72 20 70 61 72 61 6d  y" integer param
44e0: 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 74  eter passed to t
44f0: 68 65 20 75 73 65 72 73 20 62 75 73 79 2d 68 61  he users busy-ha
4500: 6e 64 6c 65 72 0a 20 20 2a 2a 20 72 65 70 72 65  ndler.  ** repre
4510: 73 65 6e 74 73 20 74 68 65 20 74 6f 74 61 6c 20  sents the total 
4520: 6e 75 6d 62 65 72 20 6f 66 20 62 75 73 79 2d 68  number of busy-h
4530: 61 6e 64 6c 65 72 20 69 6e 76 6f 63 61 74 69 6f  andler invocatio
4540: 6e 73 20 6d 61 64 65 20 77 69 74 68 69 6e 0a 20  ns made within. 
4550: 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 74 6f   ** this call to
4560: 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
4570: 65 72 6c 6f 63 6b 28 29 2c 20 69 6e 63 6c 75 64  erlock(), includ
4580: 69 6e 67 20 61 6e 79 20 6d 61 64 65 20 64 75 72  ing any made dur
4590: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 22 42 45  ing the.  ** "BE
45a0: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 2e 0a  GIN EXCLUSIVE"..
45b0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
45c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
45d0: 62 75 73 79 2e 78 42 75 73 79 20 3d 20 78 42 75  busy.xBusy = xBu
45e0: 73 79 3b 0a 20 20 20 20 62 75 73 79 2e 70 42 75  sy;.    busy.pBu
45f0: 73 79 41 72 67 20 3d 20 70 42 75 73 79 41 72 67  syArg = pBusyArg
4600: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  ;.    sqlite3_bu
4610: 73 79 5f 68 61 6e 64 6c 65 72 28 70 4c 6f 63 6b  sy_handler(pLock
4620: 2d 3e 64 62 2c 20 73 75 70 65 72 6c 6f 63 6b 42  ->db, superlockB
4630: 75 73 79 48 61 6e 64 6c 65 72 2c 20 28 76 6f 69  usyHandler, (voi
4640: 64 20 2a 29 26 62 75 73 79 29 3b 0a 20 20 20 20  d *)&busy);.    
4650: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
4660: 63 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22 42 45  c(pLock->db, "BE
4670: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 2c 20  GIN EXCLUSIVE", 
4680: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  0, 0, 0);.  }.. 
4690: 20 2f 2a 20 49 66 20 74 68 65 20 42 45 47 49 4e   /* If the BEGIN
46a0: 20 45 58 43 4c 55 53 49 56 45 20 77 61 73 20 65   EXCLUSIVE was e
46b0: 78 65 63 75 74 65 64 20 73 75 63 63 65 73 73 66  xecuted successf
46c0: 75 6c 6c 79 20 61 6e 64 20 74 68 69 73 20 69 73  ully and this is
46d0: 20 61 20 57 41 4c 0a 20 20 2a 2a 20 64 61 74 61   a WAL.  ** data
46e0: 62 61 73 65 2c 20 63 61 6c 6c 20 73 75 70 65 72  base, call super
46f0: 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28 29 20 74 6f  lockWalLock() to
4700: 20 6f 62 74 61 69 6e 20 74 68 65 20 65 78 74 72   obtain the extr
4710: 61 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 64  a locks required
4720: 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  .  ** to prevent
4730: 20 72 65 61 64 65 72 73 2c 20 77 72 69 74 65 72   readers, writer
4740: 73 20 61 6e 64 2f 6f 72 20 63 68 65 63 6b 70 6f  s and/or checkpo
4750: 69 6e 74 65 72 73 20 66 72 6f 6d 20 61 63 63 65  inters from acce
4760: 73 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 64  ssing the.  ** d
4770: 62 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  b while this pro
4780: 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
4790: 74 68 65 20 73 75 70 65 72 6c 6f 63 6b 2e 0a 20  the superlock.. 
47a0: 20 2a 2a 0a 20 20 2a 2a 20 42 65 66 6f 72 65 20   **.  ** Before 
47b0: 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 57  attempting any W
47c0: 41 4c 20 6c 6f 63 6b 73 2c 20 63 6f 6d 6d 69 74  AL locks, commit
47d0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
47e0: 20 73 74 61 72 74 65 64 20 61 62 6f 76 65 0a 20   started above. 
47f0: 20 2a 2a 20 74 6f 20 64 72 6f 70 20 74 68 65 20   ** to drop the 
4800: 57 41 4c 20 72 65 61 64 20 61 6e 64 20 77 72 69  WAL read and wri
4810: 74 65 20 6c 6f 63 6b 73 20 63 75 72 72 65 6e 74  te locks current
4820: 6c 79 20 68 65 6c 64 2e 20 4f 74 68 65 72 77 69  ly held. Otherwi
4830: 73 65 2c 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77  se, the.  ** new
4840: 20 57 41 4c 20 6c 6f 63 6b 73 20 6d 61 79 20 63   WAL locks may c
4850: 6f 6e 66 6c 69 63 74 20 77 69 74 68 20 74 68 65  onflict with the
4860: 20 6f 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   old..  */.  if(
4870: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4880: 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
4890: 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 75 70 65 72  _OK==(rc = super
48a0: 6c 6f 63 6b 49 73 57 61 6c 28 70 4c 6f 63 6b 29  lockIsWal(pLock)
48b0: 29 20 26 26 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c  ) && pLock->bWal
48c0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
48d0: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 4c 6f 63  qlite3_exec(pLoc
48e0: 6b 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c  k->db, "COMMIT",
48f0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
4900: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4910: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
4920: 20 3d 20 73 75 70 65 72 6c 6f 63 6b 57 61 6c 4c   = superlockWalL
4930: 6f 63 6b 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 26  ock(pLock->db, &
4940: 62 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  busy);.      }. 
4950: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
4960: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
4970: 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f  .    sqlite3demo
4980: 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f  _superunlock(pLo
4990: 63 6b 29 3b 0a 20 20 20 20 2a 70 70 4c 6f 63 6b  ck);.    *ppLock
49a0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
49b0: 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f     *ppLock = pLo
49c0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
49d0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 41 20 63 6f  n rc;.}../* A co
49e0: 72 72 75 70 74 20 44 42 20 77 6f 6e 27 74 20 77  rrupt DB won't w
49f0: 6f 72 6b 20 77 69 74 68 20 74 68 65 20 73 71 6c  ork with the sql
4a00: 2d 62 61 73 65 64 20 6c 6f 63 6b 69 6e 67 20 61  -based locking a
4a10: 74 74 65 6d 70 74 2c 20 67 72 61 62 20 61 6e 20  ttempt, grab an 
4a20: 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  .** exclusive lo
4a30: 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ck and return SQ
4a40: 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54  LITE_OK or SQLIT
4a50: 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 6c 6f  E_BUSY if the lo
4a60: 63 6b 20 66 61 69 6c 73 20 0a 2a 2a 20 72 65 74  ck fails .** ret
4a70: 75 72 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74  urns the current
4a80: 20 6c 6f 63 6b 20 6c 65 76 65 6c 20 68 65 6c 64   lock level held
4a90: 20 6f 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   on sqlite3_file
4aa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4ab0: 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
4ac0: 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73 71 6c  lock_corrupt(sql
4ad0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
4ae0: 6e 74 20 65 54 61 72 67 65 74 46 69 6c 65 4c 6f  nt eTargetFileLo
4af0: 63 6b 2c 20 69 6e 74 20 2a 70 46 69 6c 65 4c 6f  ck, int *pFileLo
4b00: 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
4b10: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
4b20: 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 65  ile*)id;.  int e
4b30: 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 46 69 6c 65  FileLock = pFile
4b40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 69  ->eFileLock;.  i
4b50: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4b60: 4b 3b 0a 20 20 0a 20 20 69 66 28 20 65 46 69 6c  K;.  .  if( eFil
4b70: 65 4c 6f 63 6b 3c 65 54 61 72 67 65 74 46 69 6c  eLock<eTargetFil
4b80: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 63 20  eLock ){.    rc 
4b90: 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  = pFile->pMethod
4ba0: 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53 51 4c 49  ->xLock(id, SQLI
4bb0: 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b  TE_LOCK_SHARED);
4bc0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 26  .  }.  if( !rc &
4bd0: 26 20 65 46 69 6c 65 4c 6f 63 6b 3c 65 54 61 72  & eFileLock<eTar
4be0: 67 65 74 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  getFileLock ){. 
4bf0: 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70     rc = pFile->p
4c00: 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64  Method->xLock(id
4c10: 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58  , SQLITE_LOCK_EX
4c20: 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d 0a 20 20  CLUSIVE);.  }.  
4c30: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
4c40: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
4c50: 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29  ck > eFileLock )
4c60: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70  {.      pFile->p
4c70: 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
4c80: 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a  id, eFileLock);.
4c90: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
4ca0: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 20 28 70   rc;.  }.  if (p
4cb0: 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 20 20  FileLock) {.    
4cc0: 2a 70 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  *pFileLock = eFi
4cd0: 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65  leLock;.  }.  re
4ce0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4cf0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  }..static int sq
4d00: 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75  lite3demo_superu
4d10: 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73 71  nlock_corrupt(sq
4d20: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
4d30: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
4d40: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
4d50: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
4d60: 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  id;.  int rc = S
4d70: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69  QLITE_OK;.  .  i
4d80: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
4d90: 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20  ock > eFileLock 
4da0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c  ){.    rc = pFil
4db0: 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
4dc0: 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c  ock(id, SQLITE_L
4dd0: 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20 7d  OCK_SHARED);.  }
4de0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
4df0: 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c  ileLock > eFileL
4e00: 6f 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 75  ock ){.    int u
4e10: 6e 6c 6f 63 6b 52 43 20 3d 20 70 46 69 6c 65 2d  nlockRC = pFile-
4e20: 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
4e30: 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  k(id, SQLITE_LOC
4e40: 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 20  K_NONE);.    if 
4e50: 28 21 72 63 29 20 72 63 20 3d 20 75 6e 6c 6f 63  (!rc) rc = unloc
4e60: 6b 52 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  kRC;.  }.  retur
4e70: 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
4e80: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
4e90: 5f 53 55 50 45 52 4c 4f 43 4b 20 2a 2f 0a 0a 0a  _SUPERLOCK */...
4ea0: 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20  /*.** Different 
4eb0: 55 6e 69 78 20 73 79 73 74 65 6d 73 20 64 65 63  Unix systems dec
4ec0: 6c 61 72 65 20 6f 70 65 6e 28 29 20 69 6e 20 64  lare open() in d
4ed0: 69 66 66 65 72 65 6e 74 20 77 61 79 73 2e 20 20  ifferent ways.  
4ee0: 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e  Same use.** open
4ef0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
4f00: 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65 72  ,mode_t).  Other
4f10: 73 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74  s use open(const
4f20: 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e   char*,int,...).
4f30: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
4f40: 63 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  ce is important 
4f50: 77 68 65 6e 20 75 73 69 6e 67 20 61 20 70 6f 69  when using a poi
4f60: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e 63  nter to the func
4f70: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4f80: 73 61 66 65 73 74 20 77 61 79 20 74 6f 20 64 65  safest way to de
4f90: 61 6c 20 77 69 74 68 20 74 68 65 20 70 72 6f 62  al with the prob
4fa0: 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77 61 79 73  lem is to always
4fb0: 20 75 73 65 20 74 68 69 73 20 77 72 61 70 70 65   use this wrappe
4fc0: 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77 61 79  r.** which alway
4fd0: 73 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 77  s has the same w
4fe0: 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74 65  ell-defined inte
4ff0: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
5000: 20 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28 63   int posixOpen(c
5010: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
5020: 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74  , int flags, int
5030: 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75 72 6e   mode){.  return
5040: 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61   open(zFile, fla
5050: 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a  gs, mode);.}../*
5060: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
5070: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
5080: 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
5090: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a  onst char*, int*
50a0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  );../*.** Many s
50b0: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
50c0: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
50d0: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
50e0: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
50f0: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
5100: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
5110: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
5120: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
5130: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
5140: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
5150: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
5160: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
5170: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
5180: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
5190: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
51a0: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
51b0: 74 69 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f  tic struct unix_
51c0: 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73  syscall {.  cons
51d0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20  t char *zName;  
51e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
51f0: 65 20 6f 66 20 74 68 65 20 73 79 74 65 6d 20 63  e of the sytem c
5200: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
5210: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75  _syscall_ptr pCu
5220: 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e  rrent; /* Curren
5230: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  t value of the s
5240: 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20  ystem call */.  
5250: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5260: 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a  ptr pDefault; /*
5270: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   Default value *
5280: 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d  /.} aSyscall[] =
5290: 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20   {.  { "open",  
52a0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
52b0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69  syscall_ptr)posi
52c0: 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64  xOpen,  0  },.#d
52d0: 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20  efine osOpen    
52e0: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
52f0: 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29   char*,int,int))
5300: 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72  aSyscall[0].pCur
5310: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73  rent)..  { "clos
5320: 65 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  e",        (sqli
5330: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5340: 63 6c 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d  close,      0  }
5350: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73  ,.#define osClos
5360: 65 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  e     ((int(*)(i
5370: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e  nt))aSyscall[1].
5380: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5390: 61 63 63 65 73 73 22 2c 20 20 20 20 20 20 20 28  access",       (
53a0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
53b0: 70 74 72 29 61 63 63 65 73 73 2c 20 20 20 20 20  ptr)access,     
53c0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
53d0: 41 63 63 65 73 73 20 20 20 20 28 28 69 6e 74 28  Access    ((int(
53e0: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
53f0: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e  nt))aSyscall[2].
5400: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5410: 67 65 74 63 77 64 22 2c 20 20 20 20 20 20 20 28  getcwd",       (
5420: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5430: 70 74 72 29 67 65 74 63 77 64 2c 20 20 20 20 20  ptr)getcwd,     
5440: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5450: 47 65 74 63 77 64 20 20 20 20 28 28 63 68 61 72  Getcwd    ((char
5460: 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f  *(*)(char*,size_
5470: 74 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70  t))aSyscall[3].p
5480: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73  Current)..  { "s
5490: 74 61 74 22 2c 20 20 20 20 20 20 20 20 20 28 73  tat",         (s
54a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
54b0: 74 72 29 73 74 61 74 2c 20 20 20 20 20 20 20 30  tr)stat,       0
54c0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53    },.#define osS
54d0: 74 61 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a  tat      ((int(*
54e0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74  )(const char*,st
54f0: 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73  ruct stat*))aSys
5500: 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74  call[4].pCurrent
5510: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47  )../*.** The DJG
5520: 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69  PP compiler envi
5530: 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f  ronment looks mo
5540: 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20  stly like Unix, 
5550: 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20  but it.** lacks 
5560: 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74  the fcntl() syst
5570: 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64  em call.  So red
5580: 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f  efine fcntl() to
5590: 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   be something.**
55a0: 20 74 68 61 74 20 61 6c 77 61 79 73 20 73 75 63   that always suc
55b0: 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61  ceeds.  This mea
55c0: 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20  ns that locking 
55d0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
55e0: 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20  nder.** DJGPP.  
55f0: 42 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20  But it is DOS - 
5600: 77 68 61 74 20 64 69 64 20 79 6f 75 20 65 78 70  what did you exp
5610: 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f  ect?.*/.#ifdef _
5620: 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73  _DJGPP__.  { "fs
5630: 74 61 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20  tat",        0, 
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5660: 46 73 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20  Fstat(a,b,c)    
5670: 30 0a 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b  0.#else     .  {
5680: 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20   "fstat",       
5690: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
56a0: 6c 5f 70 74 72 29 66 73 74 61 74 2c 20 20 20 20  l_ptr)fstat,    
56b0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
56c0: 6f 73 46 73 74 61 74 20 20 20 20 20 28 28 69 6e  osFstat     ((in
56d0: 74 28 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20  t(*)(int,struct 
56e0: 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b  stat*))aSyscall[
56f0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  5].pCurrent).#en
5700: 64 69 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63  dif..  { "ftrunc
5710: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
5720: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74  3_syscall_ptr)ft
5730: 72 75 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a  runcate,  0  },.
5740: 23 64 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63  #define osFtrunc
5750: 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74  ate ((int(*)(int
5760: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
5770: 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [6].pCurrent).. 
5780: 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20   { "fcntl",     
5790: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
57a0: 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20  all_ptr)fcntl,  
57b0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
57c0: 65 20 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28  e osFcntl     ((
57d0: 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e  int(*)(int,int,.
57e0: 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e  ..))aSyscall[7].
57f0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5800: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 20 28  read",         (
5810: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5820: 70 74 72 29 72 65 61 64 2c 20 20 20 20 20 20 20  ptr)read,       
5830: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5840: 52 65 61 64 20 20 20 20 20 20 28 28 73 73 69 7a  Read      ((ssiz
5850: 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a  e_t(*)(int,void*
5860: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
5870: 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[8].pCurrent)..
5880: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
5890: 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45  PREAD) || SQLITE
58a0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
58b0: 53 54 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64  STYLE.  { "pread
58c0: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
58d0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
58e0: 72 65 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c  read,      0  },
58f0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61  .#else.  { "prea
5900: 64 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  d",        (sqli
5910: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5920: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
5930: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
5940: 20 6f 73 50 72 65 61 64 20 20 20 20 20 28 28 73   osPread     ((s
5950: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
5960: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
5970: 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43  ))aSyscall[9].pC
5980: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
5990: 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
59a0: 29 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c  ).  { "pread64",
59b0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
59c0: 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64  yscall_ptr)pread
59d0: 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  64,    0  },.#el
59e0: 73 65 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22  se.  { "pread64"
59f0: 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ,      (sqlite3_
5a00: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
5a10: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
5a20: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
5a30: 72 65 61 64 36 34 20 20 20 28 28 73 73 69 7a 65  read64   ((ssize
5a40: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
5a50: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53  size_t,off_t))aS
5a60: 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72  yscall[10].pCurr
5a70: 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65  ent)..  { "write
5a80: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
5a90: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77  e3_syscall_ptr)w
5aa0: 72 69 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c  rite,      0  },
5ab0: 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65  .#define osWrite
5ac0: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
5ad0: 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  )(int,const void
5ae0: 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61  *,size_t))aSysca
5af0: 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[11].pCurrent)
5b00: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
5b10: 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49  E_PREAD) || SQLI
5b20: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
5b30: 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72  G_STYLE.  { "pwr
5b40: 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ite",       (sql
5b50: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5b60: 29 70 77 72 69 74 65 2c 20 20 20 20 20 30 20 20  )pwrite,     0  
5b70: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77  },.#else.  { "pw
5b80: 72 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71  rite",       (sq
5b90: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5ba0: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20  r)0,          0 
5bb0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
5bc0: 6e 65 20 6f 73 50 77 72 69 74 65 20 20 20 20 28  ne osPwrite    (
5bd0: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
5be0: 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65  const void*,size
5bf0: 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20  _t,off_t))\.    
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75  aSyscall[12].pCu
5c20: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
5c30: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
5c40: 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c  .  { "pwrite64",
5c50: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5c60: 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65  scall_ptr)pwrite
5c70: 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  64,   0  },.#els
5c80: 65 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22  e.  { "pwrite64"
5c90: 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ,     (sqlite3_s
5ca0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
5cb0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
5cc0: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77  dif.#define osPw
5cd0: 72 69 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f  rite64  ((ssize_
5ce0: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
5cf0: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
5d00: 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20  t))\.           
5d10: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
5d20: 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[13].pCurrent).
5d30: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
5d40: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
5d50: 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20  .  { "fchmod",  
5d60: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5d70: 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64  scall_ptr)fchmod
5d80: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  ,     0  },.#els
5d90: 65 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20  e.  { "fchmod", 
5da0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
5db0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
5dc0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
5dd0: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  dif.#define osFc
5de0: 68 6d 6f 64 20 20 20 20 28 28 69 6e 74 28 2a 29  hmod    ((int(*)
5df0: 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79  (int,mode_t))aSy
5e00: 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65  scall[14].pCurre
5e10: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
5e20: 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c  (HAVE_POSIX_FALL
5e30: 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f 50  OCATE) && HAVE_P
5e40: 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20  OSIX_FALLOCATE. 
5e50: 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20   { "fallocate", 
5e60: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5e70: 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 5f 66 61  all_ptr)posix_fa
5e80: 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23  llocate,  0 },.#
5e90: 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63  else.  { "falloc
5ea0: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
5eb0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ed0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66  0 },.#endif.#def
5ee0: 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20  ine osFallocate 
5ef0: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66  ((int(*)(int,off
5f00: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
5f10: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[15].pCurrent)
5f20: 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20  ..  { "unlink", 
5f30: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
5f40: 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e  yscall_ptr)unlin
5f50: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  k,           0 }
5f60: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 69  ,.#define osUnli
5f70: 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  nk    ((int(*)(c
5f80: 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79 73  onst char*))aSys
5f90: 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e  call[16].pCurren
5fa0: 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e 44 69 72  t)..  { "openDir
5fb0: 65 63 74 6f 72 79 22 2c 20 20 20 20 28 73 71 6c  ectory",    (sql
5fc0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5fd0: 29 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 20  )openDirectory, 
5fe0: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
5ff0: 65 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  e osOpenDirector
6000: 79 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74  y ((int(*)(const
6010: 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29 61 53 79   char*,int*))aSy
6020: 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65  scall[17].pCurre
6030: 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f  nt)..}; /* End o
6040: 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62  f the overrideab
6050: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  le system calls 
6060: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  */../*.** This i
6070: 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d  s the xSetSystem
6080: 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66  Call() method of
6090: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72   sqlite3_vfs for
60a0: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22   all of the.** "
60b0: 75 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52 65  unix" VFSes.  Re
60c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
60d0: 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  pon successfully
60e0: 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a   updating the.**
60f0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69   system call poi
6100: 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f  nter, or SQLITE_
6110: 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72  NOTFOUND if ther
6120: 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72  e is no configur
6130: 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63  able.** system c
6140: 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e  all named zName.
6150: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
6160: 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  nixSetSystemCall
6170: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
6180: 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20  *pNotUsed,      
6190: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69    /* The VFS poi
61a0: 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20  nter.  Not used 
61b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
61c0: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
61d0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79     /* Name of sy
61e0: 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65  stem call to ove
61f0: 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  rride */.  sqlit
6200: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
6210: 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e  NewFunc  /* Poin
6220: 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65  ter to new syste
6230: 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a  m call value */.
6240: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
6250: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
6260: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
6270: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
6280: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
6290: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
62a0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a  {.    /* If no z
62b0: 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72  Name is given, r
62c0: 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65  estore all syste
62d0: 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72  m calls to their
62e0: 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20   default.    ** 
62f0: 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74  settings and ret
6300: 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a  urn NULL.    */.
6310: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6320: 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  OK;.    for(i=0;
6330: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
6340: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
6350: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
6360: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
6370: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b  l[i].pDefault ){
6380: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
6390: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
63a0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
63b0: 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ault;.      }.  
63c0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
63d0: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
63e0: 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61  specified, opera
63f0: 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f  te on only the o
6400: 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20  ne system call. 
6410: 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e     ** specified.
6420: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
6430: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
6440: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
6450: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
6460: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
6470: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
6480: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
6490: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
64a0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
64b0: 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ault==0 ){.     
64c0: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
64d0: 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73  .pDefault = aSys
64e0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
64f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6500: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6510: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
6520: 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e  pNewFunc==0 ) pN
6530: 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c  ewFunc = aSyscal
6540: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
6550: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
6560: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e  i].pCurrent = pN
6570: 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  ewFunc;.        
6580: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6590: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
65a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
65b0: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
65c0: 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  of a system call
65d0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
65e0: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61  f zName is not a
65f0: 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73  .** recognized s
6600: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e  ystem call name.
6610: 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72    NULL is also r
6620: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73  eturned if the s
6630: 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73  ystem call.** is
6640: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66   currently undef
6650: 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
6660: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6670: 70 74 72 20 75 6e 69 78 47 65 74 53 79 73 74 65  ptr unixGetSyste
6680: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
6690: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a  _vfs *pNotUsed,.
66a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
66b0: 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  ame.){.  unsigne
66c0: 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53  d int i;..  UNUS
66d0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
66e0: 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d  tUsed);.  for(i=
66f0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
6700: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
6710: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
6720: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
6730: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
6740: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  i].zName)==0 ) r
6750: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
6760: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a  ].pCurrent;.  }.
6770: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
6780: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6790: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73  name of the firs
67a0: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66  t system call af
67b0: 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a  ter zName.  If z
67c0: 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68  Name==NULL.** th
67d0: 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61  en return the na
67e0: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
67f0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
6800: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
6810: 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73  me.** is the las
6820: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72  t system call or
6830: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
6840: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76   the name of a v
6850: 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63  alid.** system c
6860: 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  all..*/.static c
6870: 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 4e  onst char *unixN
6880: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
6890: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
68a0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
68b0: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
68c0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
68d0: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
68e0: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
68f0: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
6900: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
6910: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
6920: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
6930: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
6940: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
6950: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
6960: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
6970: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
6980: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
6990: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
69a0: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
69b0: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
69c0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
69d0: 20 52 65 74 72 79 20 6f 70 65 6e 28 29 20 63 61   Retry open() ca
69e0: 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75  lls that fail du
69f0: 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74  e to EINTR.*/.st
6a00: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
6a10: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  open(const char 
6a20: 2a 7a 2c 20 69 6e 74 20 66 2c 20 69 6e 74 20 6d  *z, int f, int m
6a30: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  ){.  int rc;.  d
6a40: 6f 7b 20 72 63 20 3d 20 6f 73 4f 70 65 6e 28 7a  o{ rc = osOpen(z
6a50: 2c 66 2c 6d 29 3b 20 7d 77 68 69 6c 65 28 20 72  ,f,m); }while( r
6a60: 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
6a70: 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NTR );.  return 
6a80: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  rc;.}../*.** Hel
6a90: 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
6aa0: 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
6ab0: 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
6ac0: 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
6ad0: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
6ae0: 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
6af0: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
6b00: 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73  o and.** vxworks
6b10: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 73 20 75  FileId objects u
6b20: 73 65 64 20 62 79 20 74 68 69 73 20 66 69 6c 65  sed by this file
6b30: 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d  , all of which m
6b40: 61 79 20 62 65 20 0a 2a 2a 20 73 68 61 72 65 64  ay be .** shared
6b50: 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72   by multiple thr
6b60: 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63  eads..**.** Func
6b70: 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48 65  tion unixMutexHe
6b80: 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20  ld() is used to 
6b90: 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
6ba0: 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a  e global mutex .
6bb0: 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20  ** is held when 
6bc0: 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66  required. This f
6bd0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
6be0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
6bf0: 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61  assert() .** sta
6c00: 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a  tements. e.g..**
6c10: 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  .**   unixEnterM
6c20: 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73  utex().**     as
6c30: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
6c40: 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e  eld() );.**   un
6c50: 69 78 45 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a  ixEnterLeave().*
6c60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
6c70: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69  ixEnterMutex(voi
6c80: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
6c90: 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
6ca0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
6cb0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
6cc0: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74  MASTER));.}.stat
6cd0: 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61 76  ic void unixLeav
6ce0: 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  eMutex(void){.  
6cf0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
6d00: 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ave(sqlite3Mutex
6d10: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
6d20: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
6d30: 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c  ));.}.#ifdef SQL
6d40: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
6d50: 20 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48 65   int unixMutexHe
6d60: 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74  ld(void) {.  ret
6d70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
6d80: 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75  x_held(sqlite3Mu
6d90: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
6da0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
6db0: 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TER));.}.#endif.
6dc0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6dd0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  DEBUG./*.** Help
6de0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
6df0: 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61  printing out tra
6e00: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
6e10: 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a  rom debugging.**
6e20: 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20   binaries. This 
6e30: 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
6e40: 6e 67 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e  ng represetation
6e50: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
6e60: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b  .** integer lock
6e70: 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -type..*/.static
6e80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46   const char *azF
6e90: 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c  ileLock(int eFil
6ea0: 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68  eLock){.  switch
6eb0: 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ( eFileLock ){. 
6ec0: 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a     case NO_LOCK:
6ed0: 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a   return "NONE";.
6ee0: 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f      case SHARED_
6ef0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48  LOCK: return "SH
6f00: 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20  ARED";.    case 
6f10: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72  RESERVED_LOCK: r
6f20: 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22  eturn "RESERVED"
6f30: 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49  ;.    case PENDI
6f40: 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NG_LOCK: return 
6f50: 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63  "PENDING";.    c
6f60: 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ase EXCLUSIVE_LO
6f70: 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c  CK: return "EXCL
6f80: 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65  USIVE";.  }.  re
6f90: 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a  turn "ERROR";.}.
6fa0: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
6fb0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
6fc0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74  ./*.** Print out
6fd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
6fe0: 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f  ut all locking o
6ff0: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
7000: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
7010: 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c   used for troubl
7020: 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20  eshooting locks 
7030: 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64  on multithreaded
7040: 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  .** platforms.  
7050: 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c  Enable by compil
7060: 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53  ing with the -DS
7070: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
7080: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  .** command-line
7090: 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63   option on the c
70a0: 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63  ompiler.  This c
70b0: 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ode is normally.
70c0: 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a  ** turned off..*
70d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
70e0: 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69  kTrace(int fd, i
70f0: 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c  nt op, struct fl
7100: 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ock *p){.  char 
7110: 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65  *zOpName, *zType
7120: 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74  ;.  int s;.  int
7130: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69   savedErrno;.  i
7140: 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29  f( op==F_GETLK )
7150: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
7160: 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "GETLK";.  }else
7170: 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b   if( op==F_SETLK
7180: 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20   ){.    zOpName 
7190: 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c  = "SETLK";.  }el
71a0: 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63  se{.    s = osFc
71b0: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
71c0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
71d0: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e  Printf("fcntl un
71e0: 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e  known %d %d %d\n
71f0: 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20  ", fd, op, s);. 
7200: 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d     return s;.  }
7210: 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  .  if( p->l_type
7220: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
7230: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
7240: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
7250: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  >l_type==F_WRLCK
7260: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
7270: 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "WRLCK";.  }else
7280: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
7290: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_UNLCK ){.    z
72a0: 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a  Type = "UNLCK";.
72b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
72c0: 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20  ert( 0 );.  }.  
72d0: 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65  assert( p->l_whe
72e0: 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b  nce==SEEK_SET );
72f0: 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66  .  s = osFcntl(f
7300: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
7310: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
7320: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
7330: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
7340: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
7350: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
7360: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
7370: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
7380: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
7390: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
73a0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
73b0: 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31  s);.  if( s==(-1
73c0: 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b  ) && op==F_SETLK
73d0: 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d   && (p->l_type==
73e0: 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f  F_RDLCK || p->l_
73f0: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29  type==F_WRLCK) )
7400: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
7410: 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20  ck l2;.    l2 = 
7420: 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28  *p;.    osFcntl(
7430: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32  fd, F_GETLK, &l2
7440: 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f  );.    if( l2.l_
7450: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
7460: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
7470: 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  RDLCK";.    }els
7480: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
7490: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
74a0: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
74b0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
74c0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   l2.l_type==F_UN
74d0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
74e0: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
74f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
7500: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20  ssert( 0 );.    
7510: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
7520: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d  ugPrintf("fcntl-
7530: 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20  failure-reason: 
7540: 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %s %d %d %d\n",.
7550: 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69         zType, (i
7560: 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28  nt)l2.l_start, (
7570: 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69  int)l2.l_len, (i
7580: 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20  nt)l2.l_pid);.  
7590: 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65  }.  errno = save
75a0: 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e  dErrno;.  return
75b0: 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46   s;.}.#undef osF
75c0: 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46  cntl.#define osF
75d0: 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23  cntl lockTrace.#
75e0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
75f0: 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  LOCK_TRACE */../
7600: 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e  *.** Retry ftrun
7610: 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61  cate() calls tha
7620: 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49  t fail due to EI
7630: 4e 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NTR.*/.static in
7640: 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  t robust_ftrunca
7650: 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65  te(int h, sqlite
7660: 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69  3_int64 sz){.  i
7670: 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
7680: 3d 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c  = osFtruncate(h,
7690: 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  sz); }while( rc<
76a0: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
76b0: 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
76c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
76d0: 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74  routine translat
76e0: 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f  es a standard PO
76f0: 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69  SIX errno code i
7700: 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a  nto something.**
7710: 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63   useful to the c
7720: 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71  lients of the sq
7730: 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e  lite3 functions.
7740: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
7750: 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65  it is.** intende
7760: 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61  d to translate a
7770: 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79   variety of "try
7780: 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69   again" errors i
7790: 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a  nto SQLITE_BUSY.
77a0: 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79  ** and a variety
77b0: 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73   of "please clos
77c0: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
77d0: 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72  iptor NOW" error
77e0: 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  s into .** SQLIT
77f0: 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45  E_IOERR.** .** E
7800: 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69  rrors during ini
7810: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c  tialization of l
7820: 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79  ocks, or file sy
7830: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72  stem support for
7840: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c   locks,.** shoul
7850: 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c  d handle ENOLCK,
7860: 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54   ENOTSUP, EOPNOT
7870: 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e  SUPP separately.
7880: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
7890: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
78a0: 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73  sixError(int pos
78b0: 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c  ixError, int sql
78c0: 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77  iteIOErr) {.  sw
78d0: 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72  itch (posixError
78e0: 29 20 7b 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41  ) {.#if 0.  /* A
78f0: 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73  t one point this
7900: 20 63 6f 64 65 20 77 61 73 20 6e 6f 74 20 63 6f   code was not co
7910: 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20  mmented out. In 
7920: 74 68 65 6f 72 79 2c 20 74 68 69 73 20 62 72 61  theory, this bra
7930: 6e 63 68 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  nch.  ** should 
7940: 6e 65 76 65 72 20 62 65 20 68 69 74 2c 20 61 73  never be hit, as
7950: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
7960: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
7970: 6c 6c 65 64 20 61 66 74 65 72 0a 20 20 2a 2a 20  lled after.  ** 
7980: 61 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65  a locking-relate
7990: 64 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e  d function (i.e.
79a0: 20 66 63 6e 74 6c 28 29 29 20 68 61 73 20 72 65   fcntl()) has re
79b0: 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20  turned non-zero 
79c0: 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 76 61  with.  ** the va
79d0: 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20 61 73 20  lue of errno as 
79e0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
79f0: 6e 74 2e 20 53 69 6e 63 65 20 61 20 73 79 73 74  nt. Since a syst
7a00: 65 6d 20 63 61 6c 6c 20 68 61 73 20 66 61 69 6c  em call has fail
7a10: 65 64 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73  ed,.  ** errno s
7a20: 68 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72  hould be non-zer
7a30: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73  o..  **.  ** Des
7a40: 70 69 74 65 20 74 68 69 73 2c 20 69 66 20 65 72  pite this, if er
7a50: 72 6e 6f 20 72 65 61 6c 6c 79 20 69 73 20 7a 65  rno really is ze
7a60: 72 6f 2c 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e  ro, we still don
7a70: 27 74 20 77 61 6e 74 20 74 6f 20 72 65 74 75 72  't want to retur
7a80: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  n.  ** SQLITE_OK
7a90: 2e 20 54 68 65 20 73 79 73 74 65 6d 20 63 61 6c  . The system cal
7aa0: 6c 20 66 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73  l failed, and *s
7ab0: 6f 6d 65 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  ome* SQLite erro
7ac0: 72 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a  r should be.  **
7ad0: 20 70 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b   propagated back
7ae0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
7af0: 43 6f 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  Commenting this 
7b00: 62 72 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73  branch out means
7b10: 20 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77   errno==0.  ** w
7b20: 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62  ill be handled b
7b30: 79 20 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22  y the "default:"
7b40: 20 63 61 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a   case below..  *
7b50: 2f 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20  /.  case 0: .   
7b60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7b70: 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73  K;.#endif..  cas
7b80: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
7b90: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
7ba0: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
7bb0: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
7bc0: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
7bd0: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
7be0: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
7bf0: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
7c00: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
7c10: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
7c20: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
7c30: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
7c40: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
7c50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
7c60: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
7c70: 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20  EACCES: .    /* 
7c80: 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45  EACCES is like E
7c90: 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63  AGAIN during loc
7ca0: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c  king operations,
7cb0: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68   but not any oth
7cc0: 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66  er time*/.    if
7cd0: 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ( (sqliteIOErr =
7ce0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  = SQLITE_IOERR_L
7cf0: 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74  OCK) || ..(sqlit
7d00: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
7d10: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c  _IOERR_UNLOCK) |
7d20: 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  | ..(sqliteIOErr
7d30: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
7d40: 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71  _RDLOCK) ||..(sq
7d50: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
7d60: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
7d70: 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a  ESERVEDLOCK) ){.
7d80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7d90: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
7da0: 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c      /* else fall
7db0: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61   through */.  ca
7dc0: 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72  se EPERM: .    r
7dd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
7de0: 4d 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 45 44 45  M;.    .  /* EDE
7df0: 41 44 4c 4b 20 69 73 20 6f 6e 6c 79 20 70 6f 73  ADLK is only pos
7e00: 73 69 62 6c 65 20 69 66 20 61 20 63 61 6c 6c 20  sible if a call 
7e10: 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b  to fcntl(F_SETLK
7e20: 57 29 20 69 73 20 6d 61 64 65 2e 20 41 6e 64 0a  W) is made. And.
7e30: 20 20 2a 2a 20 74 68 69 73 20 6d 6f 64 75 6c 65    ** this module
7e40: 20 6e 65 76 65 72 20 6d 61 6b 65 73 20 73 75 63   never makes suc
7e50: 68 20 61 20 63 61 6c 6c 2e 20 41 6e 64 20 74 68  h a call. And th
7e60: 65 20 63 6f 64 65 20 69 6e 20 53 51 4c 69 74 65  e code in SQLite
7e70: 20 69 74 73 65 6c 66 20 0a 20 20 2a 2a 20 61 73   itself .  ** as
7e80: 73 65 72 74 73 20 74 68 61 74 20 53 51 4c 49 54  serts that SQLIT
7e90: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
7ea0: 69 73 20 6e 65 76 65 72 20 72 65 74 75 72 6e 65  is never returne
7eb0: 64 2e 20 46 6f 72 20 74 68 65 73 65 20 72 65 61  d. For these rea
7ec0: 73 6f 6e 73 0a 20 20 2a 2a 20 74 68 69 73 20 63  sons.  ** this c
7ed0: 61 73 65 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d  ase is also comm
7ee0: 65 6e 74 65 64 20 6f 75 74 2e 20 49 66 20 74 68  ented out. If th
7ef0: 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 65  e system does se
7f00: 74 20 65 72 72 6e 6f 20 74 6f 20 45 44 45 41 44  t errno to EDEAD
7f10: 4c 4b 2c 0a 20 20 2a 2a 20 74 68 65 20 64 65 66  LK,.  ** the def
7f20: 61 75 6c 74 20 53 51 4c 49 54 45 5f 49 4f 45 52  ault SQLITE_IOER
7f30: 52 5f 58 58 58 20 63 6f 64 65 20 77 69 6c 6c 20  R_XXX code will 
7f40: 62 65 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a  be returned. */.
7f50: 23 69 66 20 30 0a 20 20 63 61 73 65 20 45 44 45  #if 0.  case EDE
7f60: 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e  ADLK:.    return
7f70: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c   SQLITE_IOERR_BL
7f80: 4f 43 4b 45 44 3b 0a 23 65 6e 64 69 66 0a 20 20  OCKED;.#endif.  
7f90: 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50    .#if EOPNOTSUP
7fa0: 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  P!=ENOTSUP.  cas
7fb0: 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20  e EOPNOTSUPP: . 
7fc0: 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20     /* something 
7fd0: 77 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77  went terribly aw
7fe0: 72 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  ry, unless durin
7ff0: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
8000: 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e  pport .     * in
8010: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
8020: 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c  which it actuall
8030: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
8040: 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  says */.#endif.#
8050: 69 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20  ifdef ENOTSUP.  
8060: 63 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20  case ENOTSUP: . 
8070: 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64     /* invalid fd
8080: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
8090: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
80a0: 6f 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f  ort introspectio
80b0: 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20  n, in which .   
80c0: 20 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20    * it actually 
80d0: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
80e0: 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ys */.#endif.  c
80f0: 61 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20  ase EIO:.  case 
8100: 45 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49  EBADF:.  case EI
8110: 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f  NVAL:.  case ENO
8120: 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e  TCONN:.  case EN
8130: 4f 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58  ODEV:.  case ENX
8140: 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e  IO:.  case ENOEN
8150: 54 3a 0a 23 69 66 64 65 66 20 45 53 54 41 4c 45  T:.#ifdef ESTALE
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8170: 20 20 20 20 20 2f 2a 20 45 53 54 41 4c 45 20 69       /* ESTALE i
8180: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e  s not defined on
8190: 20 49 6e 74 65 72 69 78 20 73 79 73 74 65 6d 73   Interix systems
81a0: 20 2a 2f 0a 20 20 63 61 73 65 20 45 53 54 41 4c   */.  case ESTAL
81b0: 45 3a 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65  E:.#endif.  case
81c0: 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20   ENOSYS:.    /* 
81d0: 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72  these should for
81e0: 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f  ce the client to
81f0: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
8200: 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f  and reconnect */
8210: 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a  .    .  default:
8220: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c   .    return sql
8230: 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a  iteIOErr;.  }.}.
8240: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
8250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8290: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
82a0: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
82b0: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
82c0: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
82d0: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
82e0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
82f0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
8300: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
8310: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
8320: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
8330: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
8340: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
8350: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
8360: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
8370: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
8380: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
8390: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
83a0: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
83b0: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
83c0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
83d0: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
83e0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
83f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
8400: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
8410: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
8420: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
8430: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
8440: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
8450: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
8460: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
8470: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
8480: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
8490: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
84a0: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
84b0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
84c0: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
84d0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
84e0: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
84f0: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
8500: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
8510: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
8520: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
8530: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
8540: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
8550: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
8560: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
8570: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
8580: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
8590: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
85a0: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
85b0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
85c0: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
85d0: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
85e0: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
85f0: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
8600: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8620: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8630: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
8640: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
8650: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
8660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
8670: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
8680: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
8690: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
86a0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
86b0: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
86c0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
86d0: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
86e0: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
86f0: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
8700: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
8710: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
8720: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
8730: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
8740: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
8750: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
8760: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
8770: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
8780: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
8790: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
87a0: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
87b0: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
87c0: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
87d0: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
87e0: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
87f0: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
8800: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
8810: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
8820: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
8830: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
8840: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
8850: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
8860: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
8870: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
8880: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
8890: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
88a0: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
88b0: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
88c0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
88d0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
88e0: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
88f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
8900: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
8910: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
8920: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
8930: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
8940: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
8950: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
8960: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
8970: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
8980: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
8990: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
89a0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
89b0: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
89c0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
89d0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
89e0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
89f0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
8a00: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
8a10: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
8a20: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
8a30: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
8a40: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
8a50: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
8a60: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
8a70: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
8a80: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
8a90: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
8aa0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
8ab0: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
8ac0: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
8ad0: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
8ae0: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
8af0: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
8b00: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
8b10: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
8b20: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
8b30: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
8b40: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
8b50: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
8b60: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
8b70: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
8b80: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
8b90: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
8ba0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
8bb0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
8bc0: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
8bd0: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
8be0: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
8bf0: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
8c00: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
8c10: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
8c20: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
8c30: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
8c40: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
8c50: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
8c60: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
8c70: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
8c80: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
8c90: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
8ca0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
8cb0: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
8cc0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
8cd0: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
8ce0: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
8cf0: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
8d00: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
8d10: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
8d20: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
8d30: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
8d40: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
8d50: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
8d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d70: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
8d80: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
8d90: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
8da0: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
8db0: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
8dc0: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
8dd0: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
8de0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
8df0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
8e00: 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29  f(*pNew) + (n+1)
8e10: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
8e20: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
8e30: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
8e40: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
8e50: 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  New[1];.  memcpy
8e60: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
8e70: 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65  lName, zAbsolute
8e80: 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20  Name, n+1);.  n 
8e90: 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  = vxworksSimplif
8ea0: 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e  yName(pNew->zCan
8eb0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a  onicalName, n);.
8ec0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
8ed0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
8ee0: 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67  ry that matching
8ef0: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e   the canonical n
8f00: 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75  ame..  ** If fou
8f10: 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  nd, increment th
8f20: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
8f30: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
8f40: 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74  ointer to.  ** t
8f50: 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  he existing file
8f60: 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78   ID..  */.  unix
8f70: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
8f80: 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76  for(pCandidate=v
8f90: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
8fa0: 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e  pCandidate; pCan
8fb0: 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74  didate=pCandidat
8fc0: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
8fd0: 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e  f( pCandidate->n
8fe0: 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26  Name==n .     &&
8ff0: 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61   memcmp(pCandida
9000: 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  te->zCanonicalNa
9010: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  me, pNew->zCanon
9020: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a  icalName, n)==0.
9030: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
9040: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
9050: 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64  ;.       pCandid
9060: 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ate->nRef++;.   
9070: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
9080: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74  ex();.       ret
9090: 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a  urn pCandidate;.
90a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
90b0: 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75  No match was fou
90c0: 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b  nd.  We will mak
90d0: 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20  e a new file ID 
90e0: 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  */.  pNew->nRef 
90f0: 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61  = 1;.  pNew->nNa
9100: 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e  me = n;.  pNew->
9110: 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46  pNext = vxworksF
9120: 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72  ileList;.  vxwor
9130: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65  ksFileList = pNe
9140: 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  w;.  unixLeaveMu
9150: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
9160: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
9170: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
9180: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
9190: 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  a vxworksFileId 
91a0: 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a  object.  Free.**
91b0: 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e   the object when
91c0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
91d0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
91e0: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
91f0: 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  d vxworksRelease
9200: 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78  FileId(struct vx
9210: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
9220: 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  ){.  unixEnterMu
9230: 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
9240: 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pId->nRef>0 );.
9250: 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pId->nRef--;. 
9260: 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d   if( pId->nRef==
9270: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
9280: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a  vxworksFileId **
9290: 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26  pp;.    for(pp=&
92a0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
92b0: 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64   *pp && *pp!=pId
92c0: 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e  ; pp = &((*pp)->
92d0: 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73  pNext)){}.    as
92e0: 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29  sert( *pp==pId )
92f0: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d  ;.    *pp = pId-
9300: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
9310: 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20  te3_free(pId);. 
9320: 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
9330: 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  tex();.}.#endif 
9340: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
9350: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
9360: 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20  * End of Unique 
9370: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
9380: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
9390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93a0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
93b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
93f0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
9400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9440: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
9450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50  ************** P
9460: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
9470: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
9480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9490: 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61  **.**.** POSIX a
94a0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
94b0: 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69  e broken by desi
94c0: 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30  gn.  ANSI STD 10
94d0: 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73  03.1 (1996).** s
94e0: 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c  ection 6.5.2.2 l
94f0: 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68  ines 483 through
9500: 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61   490 specify tha
9510: 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73  t when a process
9520: 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61  .** sets or clea
9530: 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20  rs a lock, that 
9540: 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69  operation overri
9550: 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f  des any prior lo
9560: 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68  cks set.** by th
9570: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
9580: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70   It does not exp
9590: 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20  licitly say so, 
95a0: 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73  but this implies
95b0: 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72  .** that it over
95c0: 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20  rides locks set 
95d0: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
95e0: 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66  ess using a diff
95f0: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
9600: 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69  scriptor.  Consi
9610: 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61  der this test ca
9620: 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se:.**.**       
9630: 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22  int fd1 = open("
9640: 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52  ./file1", O_RDWR
9650: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
9660: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
9670: 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  2 = open("./file
9680: 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  2", O_RDWR|O_CRE
9690: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a  AT, 0644);.**.**
96a0: 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31   Suppose ./file1
96b0: 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65   and ./file2 are
96c0: 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65   really the same
96d0: 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a   file (because.*
96e0: 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20  * one is a hard 
96f0: 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  or symbolic link
9700: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74   to the other) t
9710: 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a  hen if you set.*
9720: 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  * an exclusive l
9730: 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e  ock on fd1, then
9740: 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65   try to get an e
9750: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
9760: 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b   on fd2, it work
9770: 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65  s.  I would have
9780: 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65   expected the se
9790: 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20  cond lock to.** 
97a0: 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65  fail since there
97b0: 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c   was already a l
97c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
97d0: 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42  due to fd1..** B
97e0: 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63  ut not so.  Sinc
97f0: 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d  e both locks cam
9800: 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20  e from the same 
9810: 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20  process, the.** 
9820: 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73  second overrides
9830: 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e   the first, even
9840: 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72   though they wer
9850: 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a  e on different.*
9860: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
9870: 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66  rs opened on dif
9880: 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65  ferent file name
9890: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  s..**.** This me
98a0: 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e  ans that we cann
98b0: 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63  ot use POSIX loc
98c0: 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ks to synchroniz
98d0: 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a  e file access.**
98e0: 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67   among competing
98f0: 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20   threads of the 
9900: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50  same process.  P
9910: 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  OSIX locks will 
9920: 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20  work fine.** to 
9930: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65  synchronize acce
9940: 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69  ss for threads i
9950: 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  n separate proce
9960: 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a  sses, but not.**
9970: 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20   threads within 
9980: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
9990: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
99a0: 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c  around the probl
99b0: 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74  em, SQLite has t
99c0: 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f  o manage file lo
99d0: 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  cks internally.*
99e0: 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57  * on its own.  W
99f0: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61  henever a new da
9a00: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
9a10: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e  , we have to fin
9a20: 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  d the.** specifi
9a30: 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64  c inode of the d
9a40: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
9a50: 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72  e inode is deter
9a60: 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  mined by the.** 
9a70: 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e  st_dev and st_in
9a80: 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  o fields of the 
9a90: 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74  stat structure t
9aa0: 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c  hat fstat() fill
9ab0: 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65  s in).** and che
9ac0: 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72  ck for locks alr
9ad0: 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e  eady existing on
9ae0: 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68   that inode.  Wh
9af0: 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20  en locks are.** 
9b00: 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76  created or remov
9b10: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c  ed, we have to l
9b20: 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69  ook at our own i
9b30: 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
9b40: 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74  f the.** locks t
9b50: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
9b60: 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76   thread has prev
9b70: 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63  iously set a loc
9b80: 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a  k on that same.*
9b90: 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28  * inode..**.** (
9ba0: 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f  Aside: The use o
9bb0: 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20  f inode numbers 
9bc0: 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f  as unique IDs do
9bd0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
9be0: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56  xWorks..** For V
9bf0: 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20  xWorks, we have 
9c00: 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72  to use the alter
9c10: 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44  native unique ID
9c20: 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e   system based on
9c30: 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  .** canonical fi
9c40: 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65  lename and imple
9c50: 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72  mented in the pr
9c60: 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e  evious division.
9c70: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ).**.** The sqli
9c80: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
9c90: 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20  re for POSIX is 
9ca0: 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61  no longer just a
9cb0: 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  n integer file.*
9cc0: 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49  * descriptor.  I
9cd0: 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63  t is now a struc
9ce0: 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20  ture that holds 
9cf0: 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65  the integer file
9d00: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61  .** descriptor a
9d10: 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
9d20: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
9d30: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
9d40: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73  nternal.** locks
9d50: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
9d60: 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68  nding inode.  Th
9d70: 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69  ere is one locki
9d80: 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ng structure.** 
9d90: 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66  per inode, so if
9da0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
9db0: 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c  is opened twice,
9dc0: 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73   both unixFile s
9dd0: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69  tructures.** poi
9de0: 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c  nt to the same l
9df0: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
9e00: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73  .  The locking s
9e10: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a  tructure keeps.*
9e20: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  * a reference co
9e30: 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20  unt (so we will 
9e40: 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c  know when to del
9e50: 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63  ete it) and a "c
9e60: 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  nt".** field tha
9e70: 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69  t tells us its i
9e80: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  nternal lock sta
9e90: 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61  tus.  cnt==0 mea
9ea0: 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  ns the.** file i
9eb0: 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74  s unlocked.  cnt
9ec0: 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66  ==-1 means the f
9ed0: 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75  ile has an exclu
9ee0: 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e  sive lock..** cn
9ef0: 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>0 means there 
9f00: 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c  are cnt shared l
9f10: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ocks on the file
9f20: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65  ..**.** Any atte
9f30: 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  mpt to lock or u
9f40: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72  nlock a file fir
9f50: 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f  st checks the lo
9f60: 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  cking.** structu
9f70: 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29  re.  The fcntl()
9f80: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20   system call is 
9f90: 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20  only invoked to 
9fa0: 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20  set a .** POSIX 
9fb0: 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65  lock if the inte
9fc0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74  rnal lock struct
9fd0: 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ure transitions 
9fe0: 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63  between.** a loc
9ff0: 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63  ked and an unloc
a000: 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ked state..**.**
a010: 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72   But wait:  ther
a020: 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70  e are yet more p
a030: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53  roblems with POS
a040: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
a050: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  s..**.** If you 
a060: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
a070: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
a080: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
a090: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
a0a0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
a0b0: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
a0c0: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
a0d0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
a0e0: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
a0f0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
a100: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
a110: 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  h unixInodeInfo 
a120: 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61  object.** mainta
a130: 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  ins a count of t
a140: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e  he number of pen
a150: 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ding locks on th
a160: 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e  a inode..** When
a170: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
a180: 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20  ade to close an 
a190: 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65  unixFile, if the
a1a0: 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20  re are.** other 
a1b0: 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e  unixFile open on
a1c0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
a1d0: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
a1e0: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
a1f0: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
a200: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
a210: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
a220: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
a230: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
a240: 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  The unixInodeInf
a250: 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  o structure keep
a260: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
a270: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
a280: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
a290: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
a2a0: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
a2b0: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
a2c0: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
a2d0: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
a2e0: 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f   Yet another pro
a2f0: 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65  blem:  LinuxThre
a300: 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20  ads do not play 
a310: 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20  well with posix 
a320: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e  locks..**.** Man
a330: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
a340: 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68   of linux use th
a350: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c  e LinuxThreads l
a360: 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a  ibrary which is.
a370: 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d  ** not posix com
a380: 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c  pliant.  Under L
a390: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c  inuxThreads, a l
a3a0: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
a3b0: 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f  hread.** A canno
a3c0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72  t be modified or
a3d0: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61   overridden by a
a3e0: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
a3f0: 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72  d B..** Only thr
a400: 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79  ead A can modify
a410: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b   the lock.  Lock
a420: 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20  ing behavior is 
a430: 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68  correct.** if th
a440: 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65  e appliation use
a450: 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69  s the newer Nati
a460: 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20  ve Posix Thread 
a470: 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a  Library (NPTL).*
a480: 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74  * on linux - wit
a490: 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72  h NPTL a lock cr
a4a0: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20  eated by thread 
a4b0: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
a4c0: 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61  ocks.** in threa
a4d0: 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20  d B.  But there 
a4e0: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
a4f0: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
a500: 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61  e which.** threa
a510: 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20  ding library is 
a520: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20  being used.  So 
a530: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
a540: 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f  to know at.** co
a550: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
a560: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
a570: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
a580: 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20  locks on thread 
a590: 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f  B..** One has to
a5a0: 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63   do a run-time c
a5b0: 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72  heck to discover
a5c0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
a5d0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
a5e0: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53  process..**.** S
a5f0: 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75  QLite used to su
a600: 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61  pport LinuxThrea
a610: 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74  ds.  But support
a620: 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64   for LinuxThread
a630: 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64  s.** was dropped
a640: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
a650: 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20  version 3.7.0.  
a660: 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c  SQLite will stil
a670: 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c  l work with.** L
a680: 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76  inuxThreads prov
a690: 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68  ided that (1) th
a6a0: 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74  ere is no more t
a6b0: 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69  han one connecti
a6c0: 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62  on .** per datab
a6d0: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
a6e0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64  same process and
a6f0: 20 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f   (2) database co
a700: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20  nnections.** do 
a710: 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20  not move across 
a720: 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  threads..*/../*.
a730: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
a740: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
a750: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
a760: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
a770: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
a780: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49  particular unixI
a790: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
a7a0: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46  .*/.struct unixF
a7b0: 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20  ileId {.  dev_t 
a7c0: 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  dev;            
a7d0: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
a7e0: 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53  number */.#if OS
a7f0: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
a800: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
a810: 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65  *pId;  /* Unique
a820: 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77   file ID for vxw
a830: 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20  orks. */.#else. 
a840: 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20   ino_t ino;     
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a860: 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  Inode number */.
a870: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
a880: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
a890: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
a8a0: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
a8b0: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
a8c0: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72  en.** inode.  Or
a8d0: 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64  , on LinuxThread
a8e0: 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  s, there is one 
a8f0: 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75  of these structu
a900: 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  res for.** each 
a910: 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20  inode opened by 
a920: 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  each thread..**.
a930: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
a940: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
a950: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
a960: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e  tors, so each un
a970: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
a980: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
a990: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
a9a0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
a9b0: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
a9c0: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
a9d0: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
a9e0: 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20  ber of unixFile 
a9f0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a  pointing to it..
aa00: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e  */.struct unixIn
aa10: 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75  odeInfo {.  stru
aa20: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
aa30: 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  leId;       /* T
aa40: 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f  he lookup key */
aa50: 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20  .  int nShared; 
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
aa80: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c  SHARED locks hel
aa90: 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
aaa0: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
aab0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
aac0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
aad0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
aae0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
aaf0: 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b  har bProcessLock
ab00: 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c  ;     /* An excl
ab10: 75 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f  usive process lo
ab20: 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20  ck is held */.  
ab30: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69  /* Number of poi
ab60: 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74  nters to this st
ab70: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69  ructure */.  uni
ab80: 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
ab90: 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
aba0: 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73  Shared memory as
abb0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
abc0: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
abd0: 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  t nLock;        
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
abf0: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
ac00: 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  anding file lock
ac10: 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  s */.  UnixUnuse
ac20: 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20  dFd *pUnused;   
ac30: 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64         /* Unused
ac40: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
ac50: 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  s to close */.  
ac60: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
ac70: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
ac80: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75  /* List of all u
ac90: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
aca0: 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  ects */.  unixIn
acb0: 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20  odeInfo *pPrev; 
acc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20            /*    
acd0: 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b  .... doubly link
ace0: 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ed */.#if SQLITE
acf0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
ad00: 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64  STYLE.  unsigned
ad10: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65   long long share
ad20: 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41  dByte;  /* for A
ad30: 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61  FP simulated sha
ad40: 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64  red lock */.#end
ad50: 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  if.#if OS_VXWORK
ad60: 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b  S.  sem_t *pSem;
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad80: 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53      /* Named POS
ad90: 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a  IX semaphore */.
ada0: 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b    char aSemName[
adb0: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b  MAX_PATHNAME+2];
adc0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61    /* Name of tha
add0: 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23  t semaphore */.#
ade0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
adf0: 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75  A lists of all u
ae00: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
ae10: 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ects..*/.static 
ae20: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69  unixInodeInfo *i
ae30: 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  nodeList = 0;../
ae40: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  *.**.** This fun
ae50: 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45  ction - unixLogE
ae60: 72 72 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c  rror_x(), is onl
ae70: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
ae80: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75  a the macro.** u
ae90: 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a  nixLogError()..*
aea0: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b  *.** It is invok
aeb0: 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f  ed after an erro
aec0: 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f  r occurs in an O
aed0: 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65  S function and e
aee0: 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a  rrno has been.**
aef0: 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20   set. It logs a 
af00: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
af10: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74  lite3_log() cont
af20: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
af30: 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  nt value of.** e
af40: 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73  rrno and, if pos
af50: 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e  sible, the human
af60: 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61  -readable equiva
af70: 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72  lent from strerr
af80: 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72  or() or.** strer
af90: 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  ror_r()..**.** T
afa0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
afb0: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
afc0: 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20  macro should be 
afd0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
afe0: 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  hat.** will be r
aff0: 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
b000: 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49  e (e.g. SQLITE_I
b010: 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c  OERR_DELETE, SQL
b020: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a  ITE_CANTOPEN). .
b030: 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65  ** The two subse
b040: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
b050: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61  should be the na
b060: 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e  me of the OS fun
b070: 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61  ction that.** fa
b080: 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69  iled (e.g. "unli
b090: 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64  nk", "open") and
b0a0: 20 74 68 65 20 74 68 65 20 61 73 73 6f 63 69 61   the the associa
b0b0: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
b0c0: 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  path,.** if any.
b0d0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78  .*/.#define unix
b0e0: 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20  LogError(a,b,c) 
b0f0: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
b100: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c  AtLine(a,b,c,__L
b110: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
b120: 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74  t unixLogErrorAt
b130: 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63  Line(.  int errc
b140: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
b150: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74          /* SQLit
b160: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
b170: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
b180: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
b190: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
b1a0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
b1b0: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
b1c0: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
b1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
b1e0: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
b1f0: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
b200: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
b230: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
b240: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
b250: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
b260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b270: 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20       /* Message 
b280: 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20  from strerror() 
b290: 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f  or equivalent */
b2a0: 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20  .  int iErrno = 
b2b0: 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  errno;          
b2c0: 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63     /* Saved sysc
b2d0: 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72  all error number
b2e0: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
b2f0: 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61  s is not a threa
b300: 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c  dsafe build (SQL
b310: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d  ITE_THREADSAFE==
b320: 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a  0), then use.  *
b330: 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29  * the strerror()
b340: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74   function to obt
b350: 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  ain the human-re
b360: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73  adable error mes
b370: 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61  sage.  ** equiva
b380: 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f  lent to errno. O
b390: 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74  therwise, use st
b3a0: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f  rerror_r()..  */
b3b0: 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52   .#if SQLITE_THR
b3c0: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
b3d0: 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52  ed(HAVE_STRERROR
b3e0: 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b  _R).  char aErr[
b3f0: 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45  80];.  memset(aE
b400: 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45  rr, 0, sizeof(aE
b410: 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61  rr));.  zErr = a
b420: 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54  Err;..  /* If ST
b430: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20  RERROR_R_CHAR_P 
b440: 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66  (set by autoconf
b450: 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55   scripts) or __U
b460: 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65  SE_GNU is define
b470: 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  d,.  ** assume t
b480: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
b490: 72 6f 76 69 64 65 73 20 74 68 65 20 74 68 65 20  rovides the the 
b4a0: 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  GNU version of s
b4b0: 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74  trerror_r() that
b4c0: 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61   .  ** returns a
b4d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
b4e0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
b4f0: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
b500: 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20  e. That pointer 
b510: 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20  .  ** may point 
b520: 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74  to aErr[], or it
b530: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f   may point to so
b540: 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67  me static storag
b550: 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20  e somewhere. .  
b560: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  ** Otherwise, as
b570: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79  sume that the sy
b580: 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68  stem provides th
b590: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
b5a0: 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f  of .  ** strerro
b5b0: 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77  r_r(), which alw
b5c0: 61 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72  ays writes an er
b5d0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f  ror message into
b5e0: 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20   aErr[]..  **.  
b5f0: 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69  ** If the code i
b600: 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d  ncorrectly assum
b610: 65 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  es that it is th
b620: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
b630: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61  that is.  ** ava
b640: 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f  ilable, the erro
b650: 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f  r message will o
b660: 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79  ften be an empty
b670: 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20   string. Not a. 
b680: 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d   ** huge problem
b690: 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f  . Incorrectly co
b6a0: 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68  ncluding that th
b6b0: 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73  e GNU version is
b6c0: 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a   available .  **
b6d0: 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
b6e0: 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68   segfault though
b6f0: 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ..  */.#if defin
b700: 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  ed(STRERROR_R_CH
b710: 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64  AR_P) || defined
b720: 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45  (__USE_GNU).  zE
b730: 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20  rr = .# endif.  
b740: 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e  strerror_r(iErrn
b750: 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28  o, aErr, sizeof(
b760: 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66  aErr)-1);..#elif
b770: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
b780: 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  FE.  /* This is 
b790: 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69  a threadsafe bui
b7a0: 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72  ld, but strerror
b7b0: 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69  _r() is not avai
b7c0: 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72  lable. */.  zErr
b7d0: 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f   = "";.#else.  /
b7e0: 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65  * Non-threadsafe
b7f0: 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65   build, use stre
b800: 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72  rror(). */.  zEr
b810: 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72  r = strerror(iEr
b820: 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  rno);.#endif..  
b830: 61 73 73 65 72 74 28 20 65 72 72 63 6f 64 65 21  assert( errcode!
b840: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
b850: 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a  if( zPath==0 ) z
b860: 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c  Path = "";.  sql
b870: 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65  ite3_log(errcode
b880: 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78  ,.      "os_unix
b890: 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25  .c:%d: (%d) %s(%
b8a0: 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20  s) - %s",.      
b8b0: 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a  iLine, iErrno, z
b8c0: 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72  Func, zPath, zEr
b8d0: 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  r.  );..  return
b8e0: 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   errcode;.}../*.
b8f0: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
b900: 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a  descriptor..**.*
b910: 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74  * We assume that
b920: 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20   close() almost 
b930: 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69  always works, si
b940: 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69  nce it is only i
b950: 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b  n a.** very sick
b960: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20   application or 
b970: 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70  on a very sick p
b980: 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20  latform that it 
b990: 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49  might fail..** I
b9a0: 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20  f it does fail, 
b9b0: 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20  simply leak the 
b9c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
b9d0: 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a   but do log the.
b9e0: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
b9f0: 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20  Note that it is 
ba00: 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72  not safe to retr
ba10: 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20  y close() after 
ba20: 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a  EINTR since the.
ba30: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
ba40: 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c  or might have al
ba50: 72 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65  ready been reuse
ba60: 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72  d by another thr
ba70: 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f  ead..** So we do
ba80: 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20  n't even try to 
ba90: 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20  recover from an 
baa0: 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67  EINTR.  Just log
bab0: 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e   the error.** an
bac0: 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74  d move on..*/.st
bad0: 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74  atic void robust
bae0: 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20  _close(unixFile 
baf0: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69  *pFile, int h, i
bb00: 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66  nt lineno){.  if
bb10: 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a  ( osClose(h) ){.
bb20: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
bb30: 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f  AtLine(SQLITE_IO
bb40: 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73  ERR_CLOSE, "clos
bb50: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
bb60: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
bb70: 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20   ? pFile->zPath 
bb80: 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20  : 0, lineno);.  
bb90: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
bba0: 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69   all file descri
bbb0: 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64  ptors accumuated
bbc0: 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64   in the unixInod
bbd0: 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c  eInfo->pUnused l
bbe0: 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  ist..*/ .static 
bbf0: 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e  void closePendin
bc00: 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70  gFds(unixFile *p
bc10: 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f  File){.  unixIno
bc20: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
bc30: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
bc40: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
bc50: 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  p;.  UnixUnusedF
bc60: 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28  d *pNext;.  for(
bc70: 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  p=pInode->pUnuse
bc80: 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a  d; p; p=pNext){.
bc90: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
bca0: 4e 65 78 74 3b 0a 23 69 66 20 4f 53 43 4c 4f 53  Next;.#if OSCLOS
bcb0: 45 5f 43 48 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f  E_CHECK_CLOSE_IO
bcc0: 45 52 52 0a 20 20 20 20 69 66 28 20 63 6c 6f 73  ERR.    if( clos
bcd0: 65 28 70 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  e(p->fd) ){.    
bce0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
bcf0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
bd00: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
bd10: 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20  ERR_CLOSE;.     
bd20: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 45 72 72   p->pNext = pErr
bd30: 6f 72 3b 0a 20 20 20 20 20 20 70 45 72 72 6f 72  or;.      pError
bd40: 20 3d 20 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = p;.    }else{
bd50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
bd60: 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a 23 65  ree(p);.    }.#e
bd70: 6c 73 65 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  lse.    robust_c
bd80: 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66  lose(pFile, p->f
bd90: 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
bda0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
bdb0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
bdc0: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
bdd0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
bde0: 6c 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64  lease a unixInod
bdf0: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
be00: 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
be10: 61 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64  ated by findInod
be20: 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  eInfo()..**.** T
be30: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
be40: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
be50: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
be60: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
be70: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
be80: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
be90: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
bea0: 64 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e  d releaseInodeIn
beb0: 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  fo(unixFile *pFi
bec0: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
bed0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
bee0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
bef0: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
bf00: 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28  xHeld() );.  if(
bf10: 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20   ALWAYS(pInode) 
bf20: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  ){.    pInode->n
bf30: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
bf40: 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  Inode->nRef==0 )
bf50: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
bf60: 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
bf70: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f  ==0 );.      clo
bf80: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
bf90: 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  le);.      if( p
bfa0: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a  Inode->pPrev ){.
bfb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
bfc0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70  pInode->pPrev->p
bfd0: 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Next==pInode );.
bfe0: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
bff0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
c000: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
c010: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c020: 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65     assert( inode
c030: 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  List==pInode );.
c040: 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73          inodeLis
c050: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
c060: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
c070: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65   if( pInode->pNe
c080: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  xt ){.        as
c090: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e  sert( pInode->pN
c0a0: 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f  ext->pPrev==pIno
c0b0: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49  de );.        pI
c0c0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  node->pNext->pPr
c0d0: 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ev = pInode->pPr
c0e0: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
c0f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
c100: 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Inode);.    }.  
c110: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
c120: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
c130: 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75  or, locate the u
c140: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
c150: 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63  ect that.** desc
c160: 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20  ribes that file 
c170: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65  descriptor.  Cre
c180: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
c190: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
c1a0: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
c1b0: 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74   might be uninit
c1c0: 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72  ialized if an er
c1d0: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ror occurs..**.*
c1e0: 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65  * The mutex ente
c1f0: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e  red using the un
c200: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66  ixEnterMutex() f
c210: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
c220: 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  held.** when thi
c230: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
c240: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
c250: 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  rn an appropriat
c260: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
c270: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
c280: 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69  InodeInfo(.  uni
c290: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  xFile *pFile,   
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
c2b0: 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69  nix file with fi
c2c0: 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20  le desc used in 
c2d0: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69  the key */.  uni
c2e0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49  xInodeInfo **ppI
c2f0: 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52  node        /* R
c300: 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e  eturn the unixIn
c310: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68  odeInfo object h
c320: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
c330: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
c340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
c350: 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e  stem call return
c360: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66   code */.  int f
c370: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
c380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c390: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c3a0: 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20   for pFile */.  
c3b0: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
c3c0: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f  d fileId;      /
c3d0: 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72  * Lookup key for
c3e0: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
c3f0: 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  fo */.  struct s
c400: 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20  tat statbuf;    
c410: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65         /* Low-le
c420: 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61  vel file informa
c430: 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  tion */.  unixIn
c440: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
c450: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64  = 0;     /* Cand
c460: 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49  idate unixInodeI
c470: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  nfo object */.. 
c480: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
c490: 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f  exHeld() );..  /
c4a0: 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20  * Get low-level 
c4b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
c4c0: 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  t the file that 
c4d0: 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20  we can used to. 
c4e0: 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69   ** create a uni
c4f0: 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  que name for the
c500: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64   file..  */.  fd
c510: 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72   = pFile->h;.  r
c520: 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20  c = osFstat(fd, 
c530: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28  &statbuf);.  if(
c540: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46   rc!=0 ){.    pF
c550: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
c560: 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45   errno;.#ifdef E
c570: 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28  OVERFLOW.    if(
c580: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
c590: 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72  o==EOVERFLOW ) r
c5a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c  eturn SQLITE_NOL
c5b0: 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  FS;.#endif.    r
c5c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
c5d0: 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  RR;.  }..#ifdef 
c5e0: 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f  __APPLE__.  /* O
c5f0: 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64  n OS X on an msd
c600: 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74  os filesystem, t
c610: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20  he inode number 
c620: 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a  is reported.  **
c630: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72   incorrectly for
c640: 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73   zero-size files
c650: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33  .  See ticket #3
c660: 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20  260.  To work.  
c670: 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  ** around this p
c680: 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69  roblem (we consi
c690: 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20  der it a bug in 
c6a0: 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65  OS X, not SQLite
c6b0: 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73  ).  ** we always
c6c0: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69   increase the fi
c6d0: 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20  le size to 1 by 
c6e0: 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  writing a single
c6f0: 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72   byte.  ** prior
c700: 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68   to accessing th
c710: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
c720: 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72   The one byte wr
c730: 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e  itten is.  ** an
c740: 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61   ASCII 'S' chara
c750: 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20  cter which also 
c760: 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68  happens to be th
c770: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a  e first byte.  *
c780: 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  * in the header 
c790: 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20  of every SQLite 
c7a0: 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68  database.  In th
c7b0: 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65  is way, if there
c7c0: 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20  .  ** is a race 
c7d0: 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74  condition such t
c7e0: 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  hat another thre
c7f0: 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  ad has already p
c800: 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68  opulated.  ** th
c810: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
c820: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f  the database, no
c830: 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e   damage is done.
c840: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74  .  */.  if( stat
c850: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26  buf.st_size==0 &
c860: 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67  & (pFile->fsFlag
c870: 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  s & SQLITE_FSFLA
c880: 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20  GS_IS_MSDOS)!=0 
c890: 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20  ){.    do{ rc = 
c8a0: 6f 73 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c  osWrite(fd, "S",
c8b0: 20 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c   1); }while( rc<
c8c0: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
c8d0: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  R );.    if( rc!
c8e0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  =1 ){.      pFil
c8f0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
c900: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
c910: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
c920: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
c930: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
c940: 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72  tbuf);.    if( r
c950: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46  c!=0 ){.      pF
c960: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
c970: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65   errno;.      re
c980: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
c990: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
c9a0: 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66  dif..  memset(&f
c9b0: 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66  ileId, 0, sizeof
c9c0: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c  (fileId));.  fil
c9d0: 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75  eId.dev = statbu
c9e0: 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53  f.st_dev;.#if OS
c9f0: 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49  _VXWORKS.  fileI
ca00: 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70  d.pId = pFile->p
ca10: 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65  Id;.#else.  file
ca20: 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66  Id.ino = statbuf
ca30: 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a  .st_ino;.#endif.
ca40: 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
ca50: 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70  List;.  while( p
ca60: 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28  Inode && memcmp(
ca70: 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65  &fileId, &pInode
ca80: 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66  ->fileId, sizeof
ca90: 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20  (fileId)) ){.   
caa0: 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
cab0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
cac0: 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a  f( pInode==0 ){.
cad0: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c      pInode = sql
cae0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
caf0: 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a  eof(*pInode) );.
cb00: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d      if( pInode==
cb10: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
cb20: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
cb30: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
cb40: 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65  (pInode, 0, size
cb50: 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20  of(*pInode));.  
cb60: 20 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65    memcpy(&pInode
cb70: 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49  ->fileId, &fileI
cb80: 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  d, sizeof(fileId
cb90: 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ));.    pInode->
cba0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49  nRef = 1;.    pI
cbb0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e  node->pNext = in
cbc0: 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e  odeList;.    pIn
cbd0: 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  ode->pPrev = 0;.
cbe0: 20 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73      if( inodeLis
cbf0: 74 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70  t ) inodeList->p
cc00: 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20  Prev = pInode;. 
cc10: 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70     inodeList = p
cc20: 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Inode;.  }else{.
cc30: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66      pInode->nRef
cc40: 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f  ++;.  }.  *ppIno
cc50: 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72  de = pInode;.  r
cc60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cc70: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
cc80: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
cc90: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
cca0: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
ccb0: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
ccc0: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
ccd0: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
cce0: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
ccf0: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
cd00: 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
cd10: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
cd20: 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
cd30: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
cd40: 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
cd50: 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
cd60: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
cd70: 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
cd80: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
cd90: 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
cda0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
cdb0: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
cdc0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
cdd0: 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
cde0: 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
cdf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
ce00: 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
ce10: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
ce20: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
ce30: 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
ce40: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
ce50: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
ce60: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
ce70: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
ce80: 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   );.  unixEnterM
ce90: 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
cea0: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
ceb0: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
cec0: 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20  s threads */..  
ced0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
cee0: 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
cef0: 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
cf00: 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
cf10: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
cf20: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
cf30: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
cf40: 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  rved = 1;.  }.. 
cf50: 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
cf60: 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
cf70: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
cf80: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f  ..  */.#ifndef _
cf90: 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21  _DJGPP__.  if( !
cfa0: 72 65 73 65 72 76 65 64 20 26 26 20 21 70 46 69  reserved && !pFi
cfb0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  le->pInode->bPro
cfc0: 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  cessLock ){.    
cfd0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
cfe0: 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  k;.    lock.l_wh
cff0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
d000: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
d010: 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54  t = RESERVED_BYT
d020: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
d030: 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e  n = 1;.    lock.
d040: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
d050: 3b 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74  ;.    if( osFcnt
d060: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45  l(pFile->h, F_GE
d070: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 23  TLK, &lock) ){.#
d080: 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
d090: 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
d0a0: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
d0b0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
d0c0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
d0d0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
d0e0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
d0f0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
d100: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  OCK);.      pFil
d110: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
d120: 45 72 72 6e 6f 3b 0a 23 65 6c 73 65 0a 20 20 20  Errno;.#else.   
d130: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
d140: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
d150: 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46  EDLOCK;.      pF
d160: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
d170: 20 65 72 72 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20   errno;.#endif. 
d180: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
d190: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
d1a0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
d1b0: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
d1c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
d1d0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
d1e0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
d1f0: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
d200: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
d210: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
d220: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
d230: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
d240: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d250: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
d260: 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c  o set a system-l
d270: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
d280: 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b  pFile.  The lock
d290: 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65   is .** describe
d2a0: 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a  d by pLock..**.*
d2b0: 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77  * If the pFile w
d2c0: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77  as opened read/w
d2d0: 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65  rite from unix-e
d2e0: 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e  xcl, then the on
d2f0: 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20  ly lock.** ever 
d300: 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65  obtained is an e
d310: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61  xclusive lock, a
d320: 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  nd it is obtaine
d330: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a  d exactly once.*
d340: 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  * the first time
d350: 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74   any lock is att
d360: 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62  empted.  All sub
d370: 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c  sequent system l
d380: 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  ocking.** operat
d390: 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f  ions become no-o
d3a0: 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65  ps.  Locking ope
d3b0: 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61  rations still ha
d3c0: 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c  ppen internally,
d3d0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
d3e0: 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73  coordinate acces
d3f0: 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61  s between separa
d400: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
d410: 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69  ections.** withi
d420: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  n this process, 
d430: 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20  but all of that 
d440: 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65  is handled in me
d450: 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mory and the.** 
d460: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
d470: 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63   does not partic
d480: 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ipate..**.** Thi
d490: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d4a0: 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20  pass-through to 
d4b0: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69  fcntl(F_SETLK) i
d4c0: 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67  f pFile is using
d4d0: 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65  .** any VFS othe
d4e0: 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63  r than "unix-exc
d4f0: 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69  l" or if pFile i
d500: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69  s opened on "uni
d510: 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69  x-excl".** and i
d520: 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a  s read-only..**.
d530: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
d540: 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20  ned if the call 
d550: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
d560: 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66  sfully, or -1 if
d570: 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63   a call.** to fc
d580: 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20  ntl() fails. In 
d590: 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f  this case, errno
d5a0: 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69   is set appropri
d5b0: 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28  ately (by fcntl(
d5c0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
d5d0: 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75  t unixFileLock(u
d5e0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
d5f0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c  struct flock *pL
d600: 6f 63 6b 2c 20 69 6e 74 20 6e 52 65 74 72 79 29  ock, int nRetry)
d610: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
d620: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
d630: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
d640: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
d650: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
d660: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
d670: 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  de!=0 );.  if( (
d680: 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
d690: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 45 58 43  s & UNIXFILE_EXC
d6a0: 4c 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d  L)!=0 || pInode-
d6b0: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20  >bProcessLock). 
d6c0: 20 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 63 74    && ((pFile->ct
d6d0: 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
d6e0: 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20  LE_RDONLY)==0). 
d6f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   ){.    if( pIno
d700: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
d710: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ==0 ){.      str
d720: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
d730: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
d740: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
d750: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
d760: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
d770: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
d780: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
d790: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
d7a0: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
d7b0: 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  IZE;.      lock.
d7c0: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
d7d0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46  ;.      rc = osF
d7e0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
d7f0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
d800: 20 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29        if( rc<0 )
d810: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d820: 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65    pInode->bProce
d830: 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  ssLock = 1;.    
d840: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
d850: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
d860: 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 20 20      int i = 0;  
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d880: 20 20 20 20 0a 20 20 20 20 20 20 64 6f 20 7b 0a      .      do {.
d890: 20 20 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46          rc = osF
d8a0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
d8b0: 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a  _SETLK, pLock);.
d8c0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 26          if( rc &
d8d0: 26 20 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20  & nRetry ){.    
d8e0: 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 31 30         usleep(10
d8f0: 30 20 2a 20 28 2b 2b 69 29 29 3b 0a 20 20 20 20  0 * (++i));.    
d900: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 77 68 69      }.      }whi
d910: 6c 65 28 20 21 72 63 20 26 26 20 6e 52 65 74 72  le( !rc && nRetr
d920: 79 2d 2d 20 29 3b 0a 20 20 20 20 20 20 72 63 20  y-- );.      rc 
d930: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
d940: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  se{.    rc = osF
d950: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
d960: 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a  _SETLK, pLock);.
d970: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
d980: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
d990: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
d9a0: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
d9b0: 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
d9c0: 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
d9d0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
d9e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
d9f0: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
da00: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
da10: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
da20: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
da30: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
da40: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
da50: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
da60: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
da70: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
da80: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
da90: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
daa0: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
dab0: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
dac0: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
dad0: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
dae0: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
daf0: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
db00: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
db10: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
db20: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
db30: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
db40: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
db50: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
db60: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
db70: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
db80: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
db90: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
dba0: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
dbb0: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
dbc0: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
dbd0: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
dbe0: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
dbf0: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
dc00: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
dc10: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
dc20: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
dc30: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
dc40: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
dc50: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
dc60: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
dc70: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
dc80: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
dc90: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
dca0: 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
dcb0: 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69  nt unixLock(sqli
dcc0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
dcd0: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
dce0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
dcf0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
dd00: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
dd10: 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63   the various loc
dd20: 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b  ks and.  ** lock
dd30: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20   transitions in 
dd40: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53  terms of the POS
dd50: 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72  IX advisory shar
dd60: 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  ed and exclusive
dd70: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69  .  ** lock primi
dd80: 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65  tives (called re
dd90: 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69  ad-locks and wri
dda0: 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20  te-locks below, 
ddb0: 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f  to avoid.  ** co
ddc0: 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c  nfusion with SQL
ddd0: 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e  ite lock names).
dde0: 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20   The algorithms 
ddf0: 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a  are complicated.
de00: 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e    ** slightly in
de10: 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d   order to be com
de20: 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e  patible with win
de30: 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d  dows systems sim
de40: 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a  ultaneously.  **
de50: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
de60: 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
de70: 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74 20  e, in case that 
de80: 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64  is ever required
de90: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62  ..  **.  ** Symb
dea0: 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f  ols defined in o
deb0: 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68  s.h indentify th
dec0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
ded0: 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72 76   and the 'reserv
dee0: 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65  ed.  ** byte', e
def0: 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73  ach single bytes
df00: 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f   at well known o
df10: 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20  ffsets, and the 
df20: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
df30: 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67  * range', a rang
df40: 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20 61  e of 510 bytes a
df50: 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f  t a well known o
df60: 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ffset..  **.  **
df70: 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41   To obtain a SHA
df80: 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64  RED lock, a read
df90: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
dfa0: 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  d on the 'pendin
dfb0: 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49  g.  ** byte'.  I
dfc0: 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73  f this is succes
dfd0: 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62  sful, a random b
dfe0: 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68  yte from the 'sh
dff0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
e000: 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f  ange' is read-lo
e010: 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63  cked and the loc
e020: 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  k on the 'pendin
e030: 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65 64  g byte' released
e040: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72  ..  **.  ** A pr
e050: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
e060: 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
e070: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
e080: 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  as a SHARED lock
e090: 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45  ..  ** A RESERVE
e0a0: 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  D lock is implem
e0b0: 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69 6e  ented by grabbin
e0c0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  g a write-lock o
e0d0: 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65  n the.  ** 'rese
e0e0: 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a  rved byte'. .  *
e0f0: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
e100: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
e110: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
e120: 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62 74  after it has obt
e130: 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41  ained a.  ** SHA
e140: 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44  RED lock. A PEND
e150: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c  ING lock is impl
e160: 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69  emented by obtai
e170: 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ning a write-loc
e180: 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70  k.  ** on the 'p
e190: 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68  ending byte'. Th
e1a0: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
e1b0: 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f  no new SHARED lo
e1c0: 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  cks can be.  ** 
e1d0: 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78  obtained, but ex
e1e0: 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f  isting SHARED lo
e1f0: 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  cks are allowed 
e200: 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70 72  to persist. A pr
e210: 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20  ocess.  ** does 
e220: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61  not have to obta
e230: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
e240: 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ck on the way to
e250: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e   a PENDING lock.
e260: 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65  .  ** This prope
e270: 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20 74  rty is used by t
e280: 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72  he algorithm for
e290: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
e2a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a  journal file.  *
e2b0: 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68 2e  * after a crash.
e2c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58  .  **.  ** An EX
e2d0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62  CLUSIVE lock, ob
e2e0: 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20 50  tained after a P
e2f0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68  ENDING lock is h
e300: 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70  eld, is.  ** imp
e310: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
e320: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
e330: 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65  ck on the entire
e340: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
e350: 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65  ** range'. Since
e360: 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73   all other locks
e370: 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64 2d   require a read-
e380: 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  lock on one of t
e390: 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69  he bytes.  ** wi
e3a0: 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c  thin this range,
e3b0: 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   this ensures th
e3c0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b  at no other lock
e3d0: 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68  s are held on th
e3e0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
e3f0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
e400: 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20  reason a single 
e410: 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75  byte cannot be u
e420: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
e430: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
e440: 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74    ** range' is t
e450: 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e  hat some version
e460: 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20  s of windows do 
e470: 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61 64  not support read
e480: 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20  -locks. By.  ** 
e490: 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d  locking a random
e4a0: 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e   byte from a ran
e4b0: 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53  ge, concurrent S
e4c0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20  HARED locks may 
e4d0: 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20  exist.  ** even 
e4e0: 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  if the locking p
e4f0: 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 69 73  rimitive used is
e500: 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d   always a write-
e510: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  lock..  */.  int
e520: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e530: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
e540: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
e550: 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
e560: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
e570: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73  ile->pInode;.  s
e580: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
e590: 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d  ;.  int tErrno =
e5a0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
e5b0: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
e5c0: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
e5d0: 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20  s was %s(%s,%d) 
e5e0: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
e5f0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
e600: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
e610: 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c  leLock), azFileL
e620: 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ock(pFile->eFile
e630: 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46  Lock),.      azF
e640: 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e  ileLock(pInode->
e650: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f  eFileLock), pIno
e660: 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65  de->nShared , ge
e670: 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20  tpid()));..  /* 
e680: 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
e690: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
e6a0: 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
e6b0: 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
e6c0: 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
e6d0: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
e6e0: 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
e6f0: 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
e700: 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74   as.  ** unixEnt
e710: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
e720: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
e730: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
e740: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65  le->eFileLock>=e
e750: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
e760: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
e770: 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
e780: 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29  ady held) (unix)
e790: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
e7a0: 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
e7b0: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
e7c0: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
e7d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
e7e0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
e7f0: 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
e800: 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  ce is correct.. 
e810: 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
e820: 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
e830: 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
e840: 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
e850: 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
e860: 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
e870: 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
e880: 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
e890: 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
e8a0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
e8b0: 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
e8c0: 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
e8d0: 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
e8e0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
e8f0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
e900: 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
e910: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
e920: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
e930: 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
e940: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
e950: 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
e960: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
e970: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
e980: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
e990: 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
e9a0: 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
e9b0: 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
e9c0: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
e9d0: 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
e9e0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
e9f0: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
ea00: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f  le->pInode;..  /
ea10: 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
ea20: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
ea30: 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
ea40: 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
ea50: 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
ea60: 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
ea70: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
ea80: 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
ea90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
eaa0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70  le->eFileLock!=p
eab0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
eac0: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28   && .          (
ead0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
eae0: 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
eaf0: 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  || eFileLock>SHA
eb00: 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  RED_LOCK)).  ){.
eb10: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
eb20: 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65  BUSY;.    goto e
eb30: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
eb40: 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
eb50: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
eb60: 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
eb70: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
eb80: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
eb90: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
eba0: 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
ebb0: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
ebc0: 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
ebd0: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
ebe0: 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
ebf0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
ec00: 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20  ARED_LOCK && .  
ec10: 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
ec20: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
ec30: 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65  OCK || pInode->e
ec40: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
ec50: 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
ec60: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
ec70: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
ec80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
ec90: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
eca0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
ecb0: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
ecc0: 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
ecd0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
ece0: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  RED_LOCK;.    pI
ecf0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b  node->nShared++;
ed00: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
ed10: 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ck++;.    goto e
ed20: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20  nd_lock;.  }... 
ed30: 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f   /* A PENDING lo
ed40: 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66  ck is needed bef
ed50: 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  ore acquiring a 
ed60: 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SHARED lock and 
ed70: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75  before.  ** acqu
ed80: 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  iring an EXCLUSI
ed90: 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68  VE lock.  For th
eda0: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
edb0: 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a  he PENDING will.
edc0: 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
edd0: 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f  ..  */.  lock.l_
ede0: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b  len = 1L;.  lock
edf0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
ee00: 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c  _SET;.  if( eFil
ee10: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
ee20: 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46  CK .      || (eF
ee30: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
ee40: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
ee50: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44  ->eFileLock<PEND
ee60: 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  ING_LOCK).  ){. 
ee70: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
ee80: 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
ee90: 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b  RED_LOCK?F_RDLCK
eea0: 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c  :F_WRLCK);.    l
eeb0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
eec0: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
eed0: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
eee0: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30  (pFile, &lock, 0
eef0: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
ef00: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
ef10: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
ef20: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
ef30: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
ef40: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
ef50: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
ef60: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
ef70: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
ef80: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
ef90: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
efa0: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d   end_lock;.    }
efb0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63  .  }...  /* If c
efc0: 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
efd0: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
efe0: 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
eff0: 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
f000: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
f010: 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
f020: 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
f030: 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
f040: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
f050: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f060: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
f070: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
f080: 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
f090: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
f0a0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
f0b0: 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  _OK );..    /* N
f0c0: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
f0d0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
f0e0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
f0f0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
f100: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
f110: 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75  _SIZE;.    if( u
f120: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f130: 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a  e, &lock, 0) ){.
f140: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
f150: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
f160: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
f170: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
f180: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
f190: 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  LOCK);.    }..  
f1a0: 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
f1b0: 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
f1c0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
f1d0: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
f1e0: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
f1f0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
f200: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f210: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_UNLCK;.    if(
f220: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
f230: 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 20  ile, &lock, 10) 
f240: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
f250: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
f260: 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77  s could happen w
f270: 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f  ith a network mo
f280: 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72  unt */.      tEr
f290: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
f2a0: 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
f2b0: 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
f2c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
f2d0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
f2e0: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
f2f0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a  IOERR_UNLOCK); .
f300: 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d  #else.      rc =
f310: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
f320: 4c 4f 43 4b 3b 20 0a 23 65 6e 64 69 66 0a 20 20  LOCK; .#endif.  
f330: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20    }..    if( rc 
f340: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  ){.      if( IS_
f350: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
f360: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
f370: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
f380: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
f390: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
f3a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f3b0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
f3c0: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
f3d0: 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
f3e0: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
f3f0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
f400: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
f410: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
f420: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
f430: 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
f440: 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
f450: 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
f460: 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
f470: 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
f480: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
f490: 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
f4a0: 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
f4b0: 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
f4c0: 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
f4d0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
f4e0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
f4f0: 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
f500: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
f510: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
f520: 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
f530: 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
f540: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
f550: 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
f560: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
f570: 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
f580: 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
f590: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
f5a0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
f5b0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20   = F_WRLCK;..   
f5c0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
f5d0: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
f5e0: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
f5f0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
f600: 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c  ;.    if( eFileL
f610: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
f620: 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  CK ){.      lock
f630: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
f640: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20  VED_BYTE;.      
f650: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
f660: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f670: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
f680: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
f690: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
f6a0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
f6b0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e     }..    if( un
f6c0: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
f6d0: 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a 20  , &lock, 0) ){. 
f6e0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
f6f0: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
f700: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
f710: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
f720: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
f730: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
f740: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
f750: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
f760: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
f770: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
f780: 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 6e    }.  }.  ..#ifn
f790: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
f7a0: 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e 73  Set up the trans
f7b0: 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63  action-counter c
f7c0: 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66  hange checking f
f7d0: 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74  lags when.  ** t
f7e0: 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
f7f0: 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61 20  m a SHARED to a 
f800: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20  RESERVED lock.  
f810: 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20  The change.  ** 
f820: 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52  from SHARED to R
f830: 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68  ESERVED marks th
f840: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
f850: 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69   normal.  ** wri
f860: 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f  te operation (no
f870: 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  t a hot journal 
f880: 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a  rollback)..  */.
f890: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f8a0: 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d  _OK.   && pFile-
f8b0: 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52  >eFileLock<=SHAR
f8c0: 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46  ED_LOCK.   && eF
f8d0: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
f8e0: 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20  D_LOCK.  ){.    
f8f0: 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
f900: 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46  Chng = 0;.    pF
f910: 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  ile->dbUpdate = 
f920: 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  0;.    pFile->in
f930: 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b  NormalWrite = 1;
f940: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20  .  }.#endif...  
f950: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f960: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
f970: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
f980: 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64  eLock;.    pInod
f990: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
f9a0: 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73  FileLock;.  }els
f9b0: 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
f9c0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
f9d0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
f9e0: 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
f9f0: 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  G_LOCK;.    pIno
fa00: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
fa10: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
fa20: 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  }..end_lock:.  u
fa30: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
fa40: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
fa50: 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 75  K    %d %s %s (u
fa60: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
fa70: 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
fa80: 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
fa90: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
faa0: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
fab0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
fac0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
fad0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
fae0: 72 20 75 73 65 64 20 62 79 20 66 69 6c 65 20 68  r used by file h
faf0: 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74  andle pFile to t
fb00: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
fb10: 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74  .** pUnused list
fb20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fb30: 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e   setPendingFd(un
fb40: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
fb50: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
fb60: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
fb70: 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55  >pInode;.  UnixU
fb80: 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69  nusedFd *p = pFi
fb90: 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70  le->pUnused;.  p
fba0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65  ->pNext = pInode
fbb0: 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e  ->pUnused;.  pIn
fbc0: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70  ode->pUnused = p
fbd0: 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d  ;.  pFile->h = -
fbe0: 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75  1;.  pFile->pUnu
fbf0: 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  sed = 0;.}../*.*
fc00: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
fc10: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
fc20: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
fc30: 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
fc40: 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
fc50: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
fc60: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
fc70: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
fc80: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
fc90: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
fca0: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
fcb0: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
fcc0: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
fcd0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
fce0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
fcf0: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49   no-op..** .** I
fd00: 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  f handleNFSUnloc
fd10: 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  k is true, then 
fd20: 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61  on downgrading a
fd30: 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  n EXCLUSIVE_LOCK
fd40: 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68   to SHARED.** th
fd50: 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73 20  e byte range is 
fd60: 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70  divided into 2 p
fd70: 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69 72  arts and the fir
fd80: 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63  st part is unloc
fd90: 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20  ked then.** set 
fda0: 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  to a read lock, 
fdb0: 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70  then the other p
fdc0: 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e  art is simply un
fdd0: 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f  locked.  This wo
fde0: 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61  rks .** around a
fdf0: 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20   bug in BSD NFS 
fe00: 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e  lockd (also seen
fe10: 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b   on MacOSX 10.3+
fe20: 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20  ) that fails to 
fe30: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77  .** remove the w
fe40: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72  rite lock on a r
fe50: 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61  egion when a rea
fe60: 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a  d lock is set..*
fe70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
fe80: 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
fe90: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
fea0: 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61  FileLock, int ha
feb0: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a  ndleNFSUnlock){.
fec0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
fed0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
fee0: 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
fef0: 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74  fo *pInode;.  st
ff00: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
ff10: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ff20: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 68 3b 0a  TE_OK;.  int h;.
ff30: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
ff40: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
ff50: 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
ff60: 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d  s %d(%d,%d) pid=
ff70: 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %d (unix)\n", pF
ff80: 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
ff90: 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  k,.      pFile->
ffa0: 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
ffb0: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
ffc0: 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
ffd0: 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20  de->nShared,.   
ffe0: 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a     getpid()));..
fff0: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
10000 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
10010 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
10020 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c  >eFileLock<=eFil
10030 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
10040 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10050 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
10060 74 65 78 28 29 3b 0a 20 20 68 20 3d 20 70 46 69  tex();.  h = pFi
10070 6c 65 2d 3e 68 3b 0a 20 20 70 49 6e 6f 64 65 20  le->h;.  pInode 
10080 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
10090 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
100a0 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b  e->nShared!=0 );
100b0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
100c0 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
100d0 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
100e0 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
100f0 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69  Lock==pFile->eFi
10100 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69  leLock );.    Si
10110 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
10120 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75  ign(1);.    Simu
10130 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
10140 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61  -1) ).    Simula
10150 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
10160 30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  0);..#ifndef NDE
10170 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  BUG.    /* When 
10180 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20  reducing a lock 
10190 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20  such that other 
101a0 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74  processes can st
101b0 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  art.    ** readi
101c0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
101d0 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65  file again, make
101e0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20   sure that the. 
101f0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
10200 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  n counter was up
10210 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72  dated if any par
10220 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
10230 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68  e.    ** file ch
10240 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
10250 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
10260 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65  er is not update
10270 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  d,.    ** other 
10280 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74  connections to t
10290 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67  he same file mig
102a0 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74  ht not realize t
102b0 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  hat.    ** the f
102c0 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20  ile has changed 
102d0 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20  and hence might 
102e0 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73  not know to flus
102f0 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63  h their.    ** c
10300 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f  ache.  The use o
10310 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20  f a stale cache 
10320 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
10330 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
10340 0a 20 20 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20  .    */.#if 0.  
10350 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
10360 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d  >inNormalWrite==
10370 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46  0.         || pF
10380 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30  ile->dbUpdate==0
10390 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69  .         || pFi
103a0 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
103b0 67 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20  g==1 );.#endif. 
103c0 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
103d0 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
103e0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e  dif..    /* down
103f0 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61  grading to a sha
10400 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20  red lock on NFS 
10410 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e  involves clearin
10420 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  g the write lock
10430 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65  .    ** before e
10440 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20  stablishing the 
10450 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76  readlock - to av
10460 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69  oid a race condi
10470 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64  tion we downgrad
10480 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  e.    ** the loc
10490 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73  k in 2 blocks, s
104a0 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74  o that part of t
104b0 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65  he range will be
104c0 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20   covered by a . 
104d0 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b     ** write lock
104e0 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20   until the rest 
104f0 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20  is covered by a 
10500 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a  read lock:.    *
10510 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a  *  1:   [WWWWW].
10520 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e      **  2:   [..
10530 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20  ..W].    **  3: 
10540 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a    [RRRRW].    **
10550 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20    4:   [RRRR.]. 
10560 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46     */.    if( eF
10570 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
10580 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  LOCK ){.      in
10590 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  t tErrno;       
105a0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
105b0 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
105c0 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
105d0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  ..#if !defined(_
105e0 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51  _APPLE__) || !SQ
105f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
10600 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20  ING_STYLE.      
10610 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55  (void)handleNFSU
10620 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73  nlock;.      ass
10630 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e  ert( handleNFSUn
10640 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  lock==0 );.#endi
10650 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
10660 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
10670 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
10680 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66  G_STYLE.      if
10690 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  ( handleNFSUnloc
106a0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 66 66  k ){.        off
106b0 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41  _t divSize = SHA
106c0 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20  RED_SIZE - 1;.  
106d0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c        .        l
106e0 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
106f0 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
10700 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
10710 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
10720 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
10730 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
10740 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
10750 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
10760 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
10770 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
10780 2c 20 31 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  , 10)==(-1) ){. 
10790 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
107a0 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c  = errno;.#if OSL
107b0 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53  OCKING_CHECK_BUS
107c0 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  Y_IOERR.        
107d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
107e0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
107f0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
10800 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23  IOERR_UNLOCK);.#
10810 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 72  else.          r
10820 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
10830 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a  _UNLOCK;.#endif.
10840 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
10850 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
10860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
10870 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
10880 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
10890 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
108a0 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
108b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
108c0 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
108d0 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
108e0 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
108f0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
10900 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
10910 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
10920 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
10930 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20  len = divSize;. 
10940 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
10950 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
10960 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29 20  lock, 10)==(-1) 
10970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
10980 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
10990 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
109a0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
109b0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
109c0 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
109d0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  K);.          if
109e0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
109f0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
10a00 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
10a10 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
10a20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10a30 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
10a40 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
10a50 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
10a60 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
10a70 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
10a80 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
10a90 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
10aa0 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
10ab0 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20  RST+divSize;.   
10ac0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
10ad0 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69  = SHARED_SIZE-di
10ae0 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
10af0 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
10b00 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30  pFile, &lock, 10
10b10 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
10b20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
10b30 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49  rno;.#if OSLOCKI
10b40 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f  NG_CHECK_BUSY_IO
10b50 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 72 63  ERR.          rc
10b60 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
10b70 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
10b80 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
10b90 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65  R_UNLOCK);.#else
10ba0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
10bb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
10bc0 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  OCK;.#endif.    
10bd0 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
10be0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
10bf0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
10c00 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
10c10 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
10c20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
10c30 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
10c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
10c50 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  se.#endif /* def
10c60 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
10c70 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
10c80 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
10c90 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
10ca0 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
10cb0 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
10cc0 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
10cd0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
10ce0 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
10cf0 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
10d00 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
10d10 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
10d20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
10d30 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
10d40 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 20 29 7b 0a  , &lock, 10) ){.
10d50 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
10d60 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53   = errno;.#if OS
10d70 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55  LOCKING_CHECK_BU
10d80 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  SY_IOERR.       
10d90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
10da0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
10db0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
10dc0 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a  _IOERR_RDLOCK);.
10dd0 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
10de0 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
10df0 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69  e call to unixFi
10e00 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20  leLock() cannot 
10e10 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f  fail because ano
10e20 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ther.          *
10e30 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  * process is hol
10e40 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74  ding an incompat
10e50 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74  ible lock. If it
10e60 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20   does, this .   
10e70 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61         ** indica
10e80 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68  tes that the oth
10e90 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
10ea0 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  t following the 
10eb0 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20  locking.        
10ec0 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49    ** protocol. I
10ed0 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
10ee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
10ef0 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75  ERR_RDLOCK. Retu
10f00 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rning.          
10f10 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
10f20 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65  ould confuse the
10f30 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e   upper layer (in
10f40 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75   practice it cau
10f50 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ses .          *
10f60 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66  * an assert to f
10f70 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ail). */ .      
10f80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10f90 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20  IOERR_RDLOCK;.  
10fa0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
10fb0 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
10fc0 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  o;.#endif.      
10fd0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
10fe0 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
10ff0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
11000 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
11010 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
11020 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
11030 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
11040 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11050 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
11060 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
11070 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
11080 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
11090 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
110a0 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
110b0 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
110c0 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
110d0 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
110e0 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
110f0 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
11100 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31  (pFile, &lock, 1
11110 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  0)==0 ){.      p
11120 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
11130 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
11140 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f      }else{.#if O
11150 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42  SLOCKING_CHECK_B
11160 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  USY_IOERR.      
11170 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
11180 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11190 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
111a0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
111b0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
111c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
111d0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
111e0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
111f0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
11200 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c  rno;.      }.#el
11210 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  se.      rc = SQ
11220 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
11230 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
11240 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
11250 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  o;.#endif.      
11260 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
11270 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
11280 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
11290 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65  OCK ){.    /* De
112a0 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
112b0 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
112c0 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
112d0 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
112e0 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
112f0 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
11300 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
11310 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
11320 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
11330 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
11340 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d  pInode->nShared-
11350 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
11360 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b  e->nShared==0 ){
11370 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
11380 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
11390 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
113a0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
113b0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
113c0 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20   = lock.l_len = 
113d0 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  0L;.      Simula
113e0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
113f0 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  1);.      Simula
11400 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
11410 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  ) ).      Simula
11420 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
11430 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e  0);.      if( un
11440 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
11450 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30 20  , &lock, 10)==0 
11460 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
11470 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
11480 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65  O_LOCK;.      }e
11490 6c 73 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49  lse{.#if OSLOCKI
114a0 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f  NG_CHECK_BUSY_IO
114b0 45 52 52 0a 20 20 20 20 20 20 20 20 74 45 72 72  ERR.        tErr
114c0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
114d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
114e0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
114f0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
11500 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
11510 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f  .        if( IS_
11520 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
11530 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
11540 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
11550 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  Errno;.        }
11560 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72  .#else.        r
11570 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
11580 5f 55 4e 4c 4f 43 4b 3b 0a 09 20 20 20 20 70 46  _UNLOCK;..    pF
11590 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
115a0 20 65 72 72 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20   errno;.#endif. 
115b0 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65         pInode->e
115c0 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
115d0 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  CK;.        pFil
115e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
115f0 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  O_LOCK;.      }.
11600 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
11610 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e  crement the coun
11620 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e  t of locks again
11630 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c  st this same fil
11640 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20  e.  When the.   
11650 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65   ** count reache
11660 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e  s zero, close an
11670 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  y other file des
11680 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63  criptors whose c
11690 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20  lose.    ** was 
116a0 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65  deferred because
116b0 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
116c0 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  locks..    */.  
116d0 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d    pInode->nLock-
116e0 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
116f0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  Inode->nLock>=0 
11700 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
11710 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  e->nLock==0 ){. 
11720 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e       closePendin
11730 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
11740 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c   }.  }...end_unl
11750 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
11760 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
11770 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
11780 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
11790 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
117a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
117b0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
117c0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
117d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
117e0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
117f0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
11800 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
11810 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
11820 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
11830 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
11840 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
11850 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
11860 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
11870 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
11880 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
11890 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
118a0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
118b0 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
118c0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
118d0 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
118e0 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73  k){.  return pos
118f0 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
11900 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f  leLock, 0);.}../
11910 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
11920 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20  on performs the 
11930 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c  parts of the "cl
11940 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74  ose file" operat
11950 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74  ion .** common t
11960 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63  o all locking sc
11970 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73  hemes. It closes
11980 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
11990 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c  nd file.** handl
119a0 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65 20  es, if they are 
119b0 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20  valid, and sets 
119c0 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68  all fields of th
119d0 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  e unixFile.** st
119e0 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a  ructure to 0..**
119f0 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20  .** It is *not* 
11a00 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c  necessary to hol
11a10 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e  d the mutex when
11a20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
11a30 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e   called,.** even
11a40 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20   on VxWorks.  A 
11a50 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63  mutex will be ac
11a60 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b  quired on VxWork
11a70 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f  s by the.** vxwo
11a80 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
11a90 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  () routine..*/.s
11aa0 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55  tatic int closeU
11ab0 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f  nixFile(sqlite3_
11ac0 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69  file *id){.  uni
11ad0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11ae0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69  unixFile*)id;.#i
11af0 66 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f  f OSCLOSE_CHECK_
11b00 43 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20 69 66  CLOSE_IOERR.  if
11b10 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
11b20 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 63  .    int err = c
11b30 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  lose(pFile->h);.
11b40 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
11b50 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11b60 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
11b70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11b80 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
11b90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11ba0 20 70 46 69 6c 65 2d 3e 68 3d 2d 31 3b 0a 20 20   pFile->h=-1;.  
11bb0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
11bc0 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
11bd0 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  ){.    robust_cl
11be0 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65  ose(pFile, pFile
11bf0 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
11c00 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d      pFile->h = -
11c10 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  1;.  }.#endif.#i
11c20 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
11c30 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b  f( pFile->pId ){
11c40 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
11c50 69 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  isDelete ){.    
11c60 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65    osUnlink(pFile
11c70 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
11c80 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  lName);.    }.  
11c90 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65    vxworksRelease
11ca0 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49  FileId(pFile->pI
11cb0 64 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  d);.    pFile->p
11cc0 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  Id = 0;.  }.#end
11cd0 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43  if.  OSTRACE(("C
11ce0 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
11cf0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70  pFile->h));.  Op
11d00 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
11d10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
11d20 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20  ile->pUnused);. 
11d30 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
11d40 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
11d50 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e));.  return SQ
11d60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11d70 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
11d80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
11d90 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ixClose(sqlite3_
11da0 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  file *id){.  int
11db0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11dc0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11dd0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
11de0 29 69 64 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  )id;.  unixUnloc
11df0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
11e00 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
11e10 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69  ();..  /* unixFi
11e20 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77  le.pInode is alw
11e30 61 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20  ays valid here. 
11e40 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64 69 66  Otherwise, a dif
11e50 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a  ferent close.  *
11e60 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20  * routine (e.g. 
11e70 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77  nolockClose()) w
11e80 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69  ould be called i
11e90 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61  nstead..  */.  a
11ea0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49  ssert( pFile->pI
11eb0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c  node->nLock>0 ||
11ec0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
11ed0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
11ee0 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
11ef0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26  pFile->pInode) &
11f00 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  & pFile->pInode-
11f10 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a  >nLock ){.    /*
11f20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
11f30 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
11f40 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
11f50 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
11f60 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20  just.    ** yet 
11f70 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
11f80 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
11f90 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
11fa0 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
11fb0 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
11fc0 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  o pInode->pUnuse
11fd0 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  d list.  It will
11fe0 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
11ff0 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a  y closed .    **
12000 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
12010 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
12020 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65      */.    setPe
12030 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a  ndingFd(pFile);.
12040 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f    }.  releaseIno
12050 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
12060 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
12070 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c  ile(id);.  unixL
12080 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
12090 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a  eturn rc;.}../**
120a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
120b0 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64   of the posix ad
120c0 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c  visory lock impl
120d0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
120e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
120f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
12140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 20 4e 6f 2d  ************ No-
121b0 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  op Locking *****
121c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
121e0 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f  .** Of the vario
121f0 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  us locking imple
12200 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c  mentations avail
12210 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79  able, this is by
12220 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70   far the.** simp
12230 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69  lest:  locking i
12240 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61  s ignored.  No a
12250 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
12260 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  o lock the datab
12270 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20  ase.** file for 
12280 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
12290 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c  ng..**.** This l
122a0 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61  ocking mode is a
122b0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75  ppropriate for u
122c0 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  se on read-only 
122d0 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78  databases.** (ex
122e0 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  : databases that
122f0 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f   are burned into
12300 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61   CD-ROM, for exa
12310 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a  mple.)  It can.*
12320 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69  * also be used i
12330 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  f the applicatio
12340 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65  n employs some e
12350 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73  xternal mechanis
12360 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20  m to.** prevent 
12370 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63  simultaneous acc
12380 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ess of the same 
12390 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20  database by two 
123a0 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62  or more.** datab
123b0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
123c0 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61    But there is a
123d0 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66   serious risk of
123e0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72   database.** cor
123f0 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20  ruption if this 
12400 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
12410 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f  used in situatio
12420 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c  ns where multipl
12430 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
12440 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63  nnections are ac
12450 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
12460 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
12470 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69  t the same.** ti
12480 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f  me and one or mo
12490 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e  re of those conn
124a0 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74  ections are writ
124b0 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  ing..*/..static 
124c0 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  int nolockCheckR
124d0 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
124e0 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
124f0 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
12500 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
12510 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
12520 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20   *pResOut = 0;. 
12530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12540 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
12550 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74  nolockLock(sqlit
12560 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
12570 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b  , int NotUsed2){
12580 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12590 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
125a0 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
125b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73  n SQLITE_OK;.}.s
125c0 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
125d0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
125e0 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
125f0 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55  t NotUsed2){.  U
12600 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
12610 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
12620 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d2);.  return SQ
12630 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12640 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  * Close the file
12650 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12660 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  nolockClose(sqli
12670 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
12680 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
12690 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f  ixFile(id);.}../
126a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126b0 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
126c0 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  o-op lock implem
126d0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
126e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
126f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
12740 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
12750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
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 20 42 65 67 69 6e 20  ********* Begin 
127b0 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67  dot-file Locking
127c0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
127d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
127e0 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c  **.** The dotfil
127f0 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
12800 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68  entation uses th
12810 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 73  e existance of s
12820 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20  eparate lock.** 
12830 66 69 6c 65 73 20 69 6e 20 6f 72 64 65 72 20 74  files in order t
12840 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73  o control access
12850 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
12860 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 6f 6e  .  This works on
12870 20 6a 75 73 74 0a 2a 2a 20 61 62 6f 75 74 20 65   just.** about e
12880 76 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20  very filesystem 
12890 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74  imaginable.  But
128a0 20 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f   there are serio
128b0 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a  us downsides:.**
128c0 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72  .**    (1)  Ther
128d0 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72  e is zero concur
128e0 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65  rency.  A single
128f0 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61   reader blocks a
12900 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  ll other.**     
12910 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20      connections 
12920 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20  from reading or 
12930 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
12940 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  base..**.**    (
12950 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69  2)  An applicati
12960 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65  on crash or powe
12970 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65  r loss can leave
12980 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65   stale lock file
12990 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74  s.**         sit
129a0 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74  ting around that
129b0 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61   need to be clea
129c0 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a  red manually..**
129d0 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73  .** Nevertheless
129e0 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61  , a dotlock is a
129f0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f  n appropriate lo
12a00 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75  cking mode for u
12a10 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65  se if no.** othe
12a20 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  r locking strate
12a30 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  gy is available.
12a40 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c  .**.** Dotfile l
12a50 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20  ocking works by 
12a60 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20  creating a file 
12a70 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
12a80 63 74 6f 72 79 20 61 73 20 74 68 65 0a 2a 2a 20  ctory as the.** 
12a90 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69 74  database and wit
12aa0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
12ab0 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63  but with a ".loc
12ac0 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64  k" extension add
12ad0 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74  ed..** The exist
12ae0 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 66  ance of a lock f
12af0 69 6c 65 20 69 6d 70 6c 69 65 73 20 61 6e 20 45  ile implies an E
12b00 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
12b10 41 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 0a 2a  All other lock.*
12b20 2a 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c  * types (SHARED,
12b30 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49   RESERVED, PENDI
12b40 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69  NG) are mapped i
12b50 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  nto EXCLUSIVE..*
12b60 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  /../*.** The fil
12b70 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74  e suffix added t
12b80 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20  o the data base 
12b90 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65  filename in orde
12ba0 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  r to create the.
12bb0 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f  ** lock file..*/
12bc0 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b  .#define DOTLOCK
12bd0 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a  _SUFFIX ".lock".
12be0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12bf0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
12c00 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
12c10 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
12c20 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
12c30 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
12c40 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
12c50 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
12c60 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
12c70 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
12c80 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
12c90 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
12ca0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
12cb0 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
12cc0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
12cd0 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
12ce0 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
12cf0 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
12d00 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  k checking..**.*
12d10 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63  * In dotfile loc
12d20 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c  king, either a l
12d30 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74  ock exists or it
12d40 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69   does not.  So i
12d50 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74  n this.** variat
12d60 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65  ion of CheckRese
12d70 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65  rvedLock(), *pRe
12d80 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  sOut is set to t
12d90 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a  rue if any lock.
12da0 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ** is held on th
12db0 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65  e file and false
12dc0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
12dd0 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61  unlocked..*/.sta
12de0 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
12df0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
12e00 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12e10 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
12e20 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
12e30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
12e40 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
12e50 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
12e60 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
12e70 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
12e80 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
12e90 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
12ea0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
12eb0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12ec0 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
12ed0 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
12ee0 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
12ef0 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
12f00 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
12f10 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
12f20 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  OCK ){.    /* Ei
12f30 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63  ther this connec
12f40 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68  tion or some oth
12f50 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  er connection in
12f60 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
12f70 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61  s.    ** holds a
12f80 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
12f90 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63  e.  No need to c
12fa0 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f  heck further. */
12fb0 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
12fc0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
12fd0 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68  /* The lock is h
12fe0 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  eld if and only 
12ff0 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20  if the lockfile 
13000 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f  exists */.    co
13010 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  nst char *zLockF
13020 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ile = (const cha
13030 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
13040 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65  gContext;.    re
13050 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63 65 73  served = osAcces
13060 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d  s(zLockFile, 0)=
13070 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  =0;.  }.  OSTRAC
13080 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
13090 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f   %d %d %d (dotlo
130a0 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
130b0 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
130c0 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ;.  *pResOut = r
130d0 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
130e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
130f0 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
13100 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
13110 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
13120 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
13130 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
13140 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
13150 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
13160 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
13170 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
13180 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
13190 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
131a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
131b0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
131c0 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
131d0 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
131e0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
131f0 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
13200 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
13210 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
13220 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
13230 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
13240 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
13250 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
13260 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
13270 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
13280 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
13290 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
132a0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
132b0 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
132c0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
132d0 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
132e0 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
132f0 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
13300 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
13310 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
13320 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
13330 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
13340 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
13350 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
13360 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
13370 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
13380 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
13390 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
133a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
133b0 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
133c0 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
133d0 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
133e0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
133f0 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
13400 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20  ng level..**.** 
13410 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63  With dotfile loc
13420 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20  king, we really 
13430 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61  only support sta
13440 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56  te (4): EXCLUSIV
13450 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61  E..** But we tra
13460 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63  ck the other loc
13470 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65  king levels inte
13480 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rnally..*/.stati
13490 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63  c int dotlockLoc
134a0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
134b0 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
134c0 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
134d0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
134e0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64  le*)id;.  int fd
134f0 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  ;.  char *zLockF
13500 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46  ile = (char *)pF
13510 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
13520 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ext;.  int rc = 
13530 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f  SQLITE_OK;...  /
13540 2a 20 49 66 20 77 65 20 68 61 76 65 20 61 6e 79  * If we have any
13550 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
13560 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64  lock file alread
13570 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20 77  y exists.  All w
13580 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
13590 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72 20  o is adjust our 
135a0 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20  internal record 
135b0 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65  of the lock leve
135c0 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  l..  */.  if( pF
135d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
135e0 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20   NO_LOCK ){.    
135f0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13600 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
13610 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61    /* Always upda
13620 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  te the timestamp
13630 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65   on the old file
13640 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45 5f   */.#ifdef HAVE_
13650 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d 65 28  UTIME.    utime(
13660 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29  zLockFile, NULL)
13670 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 69 6d  ;.#else.    utim
13680 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  es(zLockFile, NU
13690 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LL);.#endif.    
136a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
136b0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
136c0 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
136d0 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20 3d 20 72  lock */.  fd = r
136e0 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4c 6f 63 6b  obust_open(zLock
136f0 46 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  File,O_RDONLY|O_
13700 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30  CREAT|O_EXCL,060
13710 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29  0);.  if( fd<0 )
13720 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20  {.    /* failed 
13730 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
13740 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65  he file, someone
13750 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65 20 73   else may have s
13760 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b 20 2a  tolen the lock *
13770 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  /.    int tErrno
13780 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
13790 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72  ( EEXIST == tErr
137a0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  no ){.      rc =
137b0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
137c0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
137d0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
137e0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
137f0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
13800 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
13810 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
13820 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
13830 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13840 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
13850 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13860 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a  return rc;.  } .
13870 23 69 66 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43  #if OSCLOSE_CHEC
13880 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20  K_CLOSE_IOERR.  
13890 69 66 28 20 63 6c 6f 73 65 28 66 64 29 20 29 7b  if( close(fd) ){
138a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
138b0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
138c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
138d0 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a  OERR_CLOSE;.  }.
138e0 23 65 6c 73 65 0a 20 20 72 6f 62 75 73 74 5f 63  #else.  robust_c
138f0 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20  lose(pFile, fd, 
13900 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 23 65 6e 64 69  __LINE__);.#endi
13910 66 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74  f.  .  /* got it
13920 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
13930 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
13940 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13950 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
13960 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13970 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
13980 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
13990 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
139a0 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
139b0 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
139c0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
139d0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
139e0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
139f0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
13a00 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
13a10 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
13a20 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
13a30 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
13a40 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
13a50 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
13a60 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
13a70 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69  * When the locki
13a80 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73  ng level reaches
13a90 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65   NO_LOCK, delete
13aa0 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a   the lock file..
13ab0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
13ac0 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  tlockUnlock(sqli
13ad0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
13ae0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
13af0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
13b00 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
13b10 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  ;.  char *zLockF
13b20 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46  ile = (char *)pF
13b30 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
13b40 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ext;..  assert( 
13b50 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
13b60 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
13b70 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
13b80 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
13b90 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
13ba0 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 65  ck,..   pFile->e
13bb0 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
13bc0 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
13bd0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
13be0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
13bf0 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
13c00 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
13c10 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
13c20 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
13c30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13c40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64  ;.  }..  /* To d
13c50 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72  owngrade to shar
13c60 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74  ed, simply updat
13c70 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e  e our internal n
13c80 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  otion of the.  *
13c90 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e  * lock state.  N
13ca0 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77  o need to mess w
13cb0 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  ith the file on 
13cc0 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  disk..  */.  if(
13cd0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
13ce0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  ED_LOCK ){.    p
13cf0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13d00 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
13d10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13d20 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
13d30 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b   To fully unlock
13d40 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64   the database, d
13d50 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
13d60 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ile */.  assert(
13d70 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
13d80 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 6f 73 55  OCK );.  if( osU
13d90 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29  nlink(zLockFile)
13da0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
13db0 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72   0;.    int tErr
13dc0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
13dd0 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45  if( ENOENT != tE
13de0 72 72 6e 6f 20 29 7b 0a 23 69 66 20 4f 53 4c 4f  rrno ){.#if OSLO
13df0 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59  CKING_CHECK_BUSY
13e00 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 72 63 20  _IOERR.      rc 
13e10 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
13e20 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
13e30 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
13e40 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a  _UNLOCK);.#else.
13e50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13e60 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
13e70 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
13e80 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
13e90 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
13ea0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
13eb0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
13ec0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
13ed0 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
13ee0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
13ef0 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
13f00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13f10 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d  Close a file.  M
13f20 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
13f30 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61  k has been relea
13f40 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69  sed before closi
13f50 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
13f60 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73  t dotlockClose(s
13f70 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
13f80 20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69   {.  int rc;.  i
13f90 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
13fa0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
13fb0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
13fc0 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28    dotlockUnlock(
13fd0 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
13fe0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13ff0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
14000 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  text);.  }.  rc 
14010 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
14020 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  id);.  return rc
14030 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
14040 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
14050 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  he dot-file lock
14060 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
14070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14080 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
14090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140d0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
140e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14120 2a 2a 2a 2a 0a 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 20  *************** 
14140 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b  Begin flock Lock
14150 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
14160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14170 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ****.**.** Use t
14180 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65  he flock() syste
14190 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c  m call to do fil
141a0 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a  e locking..**.**
141b0 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67   flock() locking
141c0 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c   is like dot-fil
141d0 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61  e locking in tha
141e0 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  t the various.**
141f0 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b   fine-grain lock
14200 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f  ing levels suppo
14210 72 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 61  rted by SQLite a
14220 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74  re collapsed int
14230 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78  o.** a single ex
14240 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49  clusive lock.  I
14250 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53  n other words, S
14260 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
14270 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20   and.** PENDING 
14280 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73 61  locks are the sa
14290 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45  me thing as an E
142a0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
142b0 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20  SQLite.** still 
142c0 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64  works when you d
142d0 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63  o this, but conc
142e0 75 72 72 65 6e 63 79 20 69 73 20 72 65 64 75 63  urrency is reduc
142f0 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79  ed since.** only
14300 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73   a single proces
14310 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
14320 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
14330 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f   a time..**.** O
14340 6d 69 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e  mit this section
14350 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
14360 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
14370 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72  is turned off or
14380 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67   if.** compiling
14390 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f   for VXWORKS..*/
143a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
143b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
143c0 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a   && !OS_VXWORKS.
143d0 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f  ./*.** Retry flo
143e0 63 6b 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20  ck() calls that 
143f0 66 61 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a  fail with EINTR.
14400 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a  */.#ifdef EINTR.
14410 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
14420 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20  t_flock(int fd, 
14430 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72  int op){.  int r
14440 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c  c;.  do{ rc = fl
14450 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69  ock(fd,op); }whi
14460 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
14470 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65  o==EINTR );.  re
14480 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65  turn rc;.}.#else
14490 0a 23 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74  .# define robust
144a0 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63  _flock(a,b) floc
144b0 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20  k(a,b).#endif.  
144c0 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
144d0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
144e0 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
144f0 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
14500 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
14510 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
14520 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
14530 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
14540 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
14550 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
14560 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
14570 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
14580 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
14590 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
145a0 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
145b0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
145c0 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
145d0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
145e0 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
145f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
14600 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
14610 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
14620 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
14630 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
14640 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
14650 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
14660 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
14670 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
14680 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65  d;.  .  Simulate
14690 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
146a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
146b0 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
146c0 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
146d0 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a  pFile );.  .  /*
146e0 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
146f0 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
14700 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
14710 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
14720 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
14730 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
14740 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
14750 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
14760 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
14770 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
14780 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
14790 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
147a0 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74      /* attempt t
147b0 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a  o get the lock *
147c0 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
147d0 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
147e0 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
147f0 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69   LOCK_NB);.    i
14800 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20  f( !lrc ){.     
14810 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b   /* got the lock
14820 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20  , unlock it */. 
14830 20 20 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73       lrc = robus
14840 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
14850 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20  , LOCK_UN);.    
14860 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20    if ( lrc ) {. 
14870 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
14880 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
14890 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69     /* unlock fai
148a0 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  led with an erro
148b0 72 20 2a 2f 0a 23 69 66 20 4f 53 4c 4f 43 4b 49  r */.#if OSLOCKI
148c0 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f  NG_CHECK_BUSY_IO
148d0 45 52 52 0a 20 20 20 20 20 20 20 20 6c 72 63 20  ERR.        lrc 
148e0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
148f0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
14900 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
14910 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 20  _UNLOCK);.#else 
14920 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53  .        lrc = S
14930 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
14940 43 4b 3b 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  CK; .#endif.    
14950 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
14960 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
14970 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
14980 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
14990 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
149a0 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  = lrc;.        }
149b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
149c0 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lse {.      int 
149d0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
149e0 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
149f0 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d   1;.      /* som
14a00 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
14a10 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
14a20 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
14a30 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
14a40 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
14a50 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
14a60 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28  OCK); .      if(
14a70 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
14a80 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
14a90 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
14aa0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
14ab0 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
14ac0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
14ad0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
14ae0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
14af0 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
14b00 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
14b10 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ed));..#ifdef SQ
14b20 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
14b30 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
14b40 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
14b50 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
14b60 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
14b70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14b80 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20     reserved=1;. 
14b90 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
14ba0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
14bb0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
14bc0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
14bd0 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
14be0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
14bf0 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
14c00 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
14c10 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
14c20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
14c30 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
14c40 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
14c50 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
14c60 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
14c70 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
14c80 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
14c90 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
14ca0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
14cb0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
14cc0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
14cd0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
14ce0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
14cf0 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
14d00 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
14d10 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
14d20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
14d30 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
14d40 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
14d50 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
14d60 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
14d70 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
14d80 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
14d90 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
14da0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
14db0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
14dc0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
14dd0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
14de0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
14df0 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
14e00 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
14e10 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
14e20 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
14e30 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
14e40 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
14e50 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
14e60 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
14e70 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
14e80 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
14e90 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
14ea0 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61  flock() only rea
14eb0 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
14ec0 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
14ed0 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
14ee0 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
14ef0 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
14f00 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
14f10 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
14f20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
14f30 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
14f40 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
14f50 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
14f60 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
14f70 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
14f80 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
14f90 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
14fa0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
14fb0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
14fc0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
14fd0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
14fe0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
14ff0 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
15000 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  nt flockLock(sql
15010 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
15020 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
15030 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15040 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
15050 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
15060 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
15070 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
15080 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
15090 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
150a0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
150b0 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
150c0 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
150d0 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
150e0 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
150f0 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
15100 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
15110 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
15120 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
15130 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15140 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
15150 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
15160 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f  k */.  .  if (ro
15170 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
15180 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
15190 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69  OCK_NB)) {.    i
151a0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
151b0 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74  o;.    /* didn't
151c0 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
151d0 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  sy */.    rc = s
151e0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
151f0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
15200 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
15210 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
15220 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
15230 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
15240 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
15250 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  o;.    }.  } els
15260 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
15270 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
15280 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
15290 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
152a0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
152b0 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  k;.  }.  OSTRACE
152c0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
152d0 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %s (flock)\n", 
152e0 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
152f0 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
15300 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d   .           rc=
15310 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
15320 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
15330 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
15340 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
15350 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
15360 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
15370 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
15380 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
15390 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65  ITE_BUSY;.  }.#e
153a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
153b0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
153c0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74  _ERRORS */.  ret
153d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
153e0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
153f0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
15400 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
15410 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
15420 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
15430 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
15440 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
15450 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
15460 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
15470 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
15480 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
15490 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
154a0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
154b0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
154c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
154d0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
154e0 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63  c int flockUnloc
154f0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
15500 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
15510 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
15520 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15530 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
15540 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
15550 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
15560 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
15570 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  id=%d (flock)\n"
15580 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
15590 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
155a0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
155b0 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
155c0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
155d0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
155e0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
155f0 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
15600 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
15610 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
15620 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
15630 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15640 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
15650 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
15660 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
15670 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
15680 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
15690 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
156a0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
156b0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
156c0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
156d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
156e0 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
156f0 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  ally, unlock. */
15700 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c  .  if( robust_fl
15710 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
15720 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66  CK_UN) ){.#ifdef
15730 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
15740 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
15750 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15760 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a  TE_OK;.#endif /*
15770 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
15780 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
15790 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
157a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
157b0 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  CK;.  }else{.   
157c0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
157d0 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
157e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
157f0 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
15800 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
15810 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
15820 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
15830 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
15840 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b   id ){.    flock
15850 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
15860 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  CK);.  }.  retur
15870 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  n closeUnixFile(
15880 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  id);.}..#endif /
15890 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
158a0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
158b0 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a   !OS_VXWORK */..
158c0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
158d0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
158e0 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65  flock lock imple
158f0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
15900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
15910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
15960 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
15970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159b0 0a 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 20 42 65 67 69 6e 20  ********* Begin 
159d0 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20  Named Semaphore 
159e0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
159f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a00 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d  .**.** Named sem
15a10 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69  aphore locking i
15a20 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64  s only supported
15a30 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a   on VxWorks..**.
15a40 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
15a50 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
15a60 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20  -lock and flock 
15a70 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c  in that it reall
15a80 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72  y only.** suppor
15a90 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ts EXCLUSIVE loc
15aa0 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69  king.  Only a si
15ab0 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e  ngle process can
15ac0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a   read or write.*
15ad0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
15ae0 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20  ile at a time.  
15af0 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74  This reduces pot
15b00 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e  ential concurren
15b10 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73  cy, but.** makes
15b20 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   the lock implem
15b30 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61  entation much ea
15b40 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f  sier..*/.#if OS_
15b50 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54  VXWORKS../*.** T
15b60 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
15b70 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
15b80 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
15b90 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
15ba0 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
15bb0 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
15bc0 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
15bd0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
15be0 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
15bf0 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
15c00 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
15c10 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
15c20 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
15c30 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
15c40 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
15c50 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
15c60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
15c70 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
15c80 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
15c90 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76  t semCheckReserv
15ca0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
15cb0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
15cc0 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
15cd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15ce0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
15cf0 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
15d00 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
15d10 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
15d20 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
15d30 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
15d40 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
15d50 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
15d60 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
15d70 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
15d80 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
15d90 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
15da0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
15db0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
15dc0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
15dd0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
15de0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
15df0 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
15e00 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
15e10 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
15e20 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
15e30 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d     sem_t *pSem =
15e40 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
15e50 70 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74  pSem;.    struct
15e60 20 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a   stat statBuf;..
15e70 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77      if( sem_tryw
15e80 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
15e90 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
15ea0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
15eb0 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74   if( EAGAIN != t
15ec0 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  Errno ){.       
15ed0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
15ee0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
15ef0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
15f00 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
15f10 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  EDLOCK);.       
15f20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15f30 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
15f40 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
15f50 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c     /* someone el
15f60 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20  se has the lock 
15f70 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e  when we are in N
15f80 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20  O_LOCK */.      
15f90 20 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46    reserved = (pF
15fa0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c  ile->eFileLock <
15fb0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
15fc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
15fd0 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f  {.      /* we co
15fe0 75 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77  uld have it if w
15ff0 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20  e want it */.   
16000 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d     sem_post(pSem
16010 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f  );.    }.  }.  O
16020 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
16030 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
16040 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  sem)\n", pFile->
16050 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
16060 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
16070 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
16080 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16090 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
160a0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
160b0 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
160c0 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
160d0 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
160e0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
160f0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
16100 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
16110 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
16120 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
16130 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
16140 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
16150 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
16160 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
16170 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
16180 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
16190 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
161a0 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
161b0 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
161c0 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
161d0 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
161e0 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
161f0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
16200 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
16210 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
16220 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
16230 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
16240 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
16250 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
16260 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
16270 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
16280 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
16290 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
162a0 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
162b0 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
162c0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
162d0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
162e0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
162f0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
16300 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
16310 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
16320 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
16330 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
16340 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
16350 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  cks only really 
16360 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
16370 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
16380 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
16390 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
163a0 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
163b0 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
163c0 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
163d0 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
163e0 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
163f0 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
16400 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
16410 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
16420 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
16430 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
16440 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
16450 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
16460 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
16470 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
16480 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
16490 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
164a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
164b0 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  emLock(sqlite3_f
164c0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
164d0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
164e0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
164f0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
16500 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a  nt fd;.  sem_t *
16510 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
16520 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e  node->pSem;.  in
16530 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16540 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
16550 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
16560 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
16570 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
16580 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
16590 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
165a0 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
165b0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
165c0 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
165d0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
165e0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
165f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
16600 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65  ;.    goto sem_e
16610 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
16620 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68    /* lock semaph
16630 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c  ore now but bail
16640 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64   out when alread
16650 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69  y locked. */.  i
16660 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
16670 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
16680 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
16690 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65  ;.    goto sem_e
166a0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
166b0 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
166c0 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
166d0 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65  rn ok */.  pFile
166e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
166f0 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65  ileLock;.. sem_e
16700 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72  nd_lock:.  retur
16710 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
16720 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
16730 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
16740 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
16750 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
16760 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
16770 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
16780 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
16790 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
167a0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
167b0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
167c0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
167d0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
167e0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
167f0 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
16800 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
16810 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
16820 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c  nt semUnlock(sql
16830 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
16840 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
16850 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
16860 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
16870 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
16880 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
16890 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72  ->pSem;..  asser
168a0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73  t( pFile );.  as
168b0 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20  sert( pSem );.  
168c0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
168d0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
168e0 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20  id=%d (sem)\n", 
168f0 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
16900 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e  ock,..   pFile->
16910 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69  eFileLock, getpi
16920 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  d()));.  assert(
16930 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
16940 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
16950 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
16960 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
16970 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
16980 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
16990 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
169a0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
169b0 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
169c0 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
169d0 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
169e0 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
169f0 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
16a00 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
16a10 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16a20 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
16a30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16a40 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
16a50 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f   no, really unlo
16a60 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65  ck. */.  if ( se
16a70 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31  m_post(pSem)==-1
16a80 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c   ) {.    int rc,
16a90 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
16aa0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16ab0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
16ac0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
16ad0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
16ae0 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
16af0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
16b00 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
16b10 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
16b20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
16b30 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
16b40 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
16b50 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
16b60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16b70 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  *. ** Close a fi
16b80 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  le.. */.static i
16b90 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69  nt semClose(sqli
16ba0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
16bb0 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
16bc0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
16bd0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
16be0 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69  .    semUnlock(i
16bf0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
16c00 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
16c10 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
16c20 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65  utex();.    rele
16c30 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
16c40 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  le);.    unixLea
16c50 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63  veMutex();.    c
16c60 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
16c70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
16c80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
16c90 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
16ca0 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64  S */./*.** Named
16cb0 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
16cc0 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
16cd0 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  able on VxWorks.
16ce0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
16cf0 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
16d00 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
16d10 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
16d20 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
16d30 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
16d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d80 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
16d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 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 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b  * Begin AFP Lock
16e00 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
16e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e20 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20  *****.**.** AFP 
16e30 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c  is the Apple Fil
16e40 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41  ing Protocol.  A
16e50 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20  FP is a network 
16e60 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64  filesystem found
16e70 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63  .** on Apple Mac
16e80 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73  intosh computers
16e90 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20   - both OS9 and 
16ea0 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64  OSX..**.** Third
16eb0 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74  -party implement
16ec0 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72  ations of AFP ar
16ed0 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75  e available.  Bu
16ee0 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65  t this code here
16ef0 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f  .** only works o
16f00 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64  n OSX..*/..#if d
16f10 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
16f20 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
16f30 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
16f40 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f  ./*.** The afpLo
16f50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72  ckingContext str
16f60 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
16f70 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65  all afp lock spe
16f80 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74  cific state.*/.t
16f90 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66  ypedef struct af
16fa0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
16fb0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
16fc0 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63  t;.struct afpLoc
16fd0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
16fe0 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20  int reserved;.  
16ff0 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61  const char *dbPa
17000 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
17010 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
17020 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a  pen file */.};..
17030 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
17040 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69  LockPB2.{.  unsi
17050 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
17060 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
17070 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   offset to first
17080 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f   byte to lock */
17090 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
170a0 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20   long length;   
170b0 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62       /* nbr of b
170c0 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
170d0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
170e0 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61  long retRangeSta
170f0 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73  rt; /* nbr of 1s
17100 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66  t byte locked if
17110 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20   successful */. 
17120 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75   unsigned char u
17130 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20  nLockFlag;      
17140 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b     /* 1 = unlock
17150 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20  , 0 = lock */.  
17160 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74  unsigned char st
17170 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20  artEndFlag;     
17180 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e    /* 1=rel to en
17190 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c  d of fork, 0=rel
171a0 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69   to start */.  i
171b0 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171d0 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f   /* file desc to
171e0 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b   assoc this lock
171f0 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65   with */.};..#de
17200 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61  fine afpfsByteRa
17210 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20  ngeLock2FSCTL   
17220 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20       _IOWR('z', 
17230 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
17240 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a  angeLockPB2)../*
17250 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74  .** This is a ut
17260 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e  ility for settin
17270 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20  g or clearing a 
17280 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f  bit-range lock o
17290 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65  n an.** AFP file
172a0 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52  system..** .** R
172b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
172c0 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49  on success, SQLI
172d0 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75  TE_BUSY on failu
172e0 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
172f0 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20  t afpSetLock(.  
17300 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
17310 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17320 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
17330 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
17340 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  or unlocked */. 
17350 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
17360 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17370 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
17380 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20  criptor on path 
17390 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
173a0 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20  ng long offset, 
173b0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
173c0 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
173d0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
173e0 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20  g long length,  
173f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17400 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
17410 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c  .  int setLockFl
17420 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
17430 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74    /* True to set
17440 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f   lock.  False to
17450 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29   clear lock */.)
17460 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52  {.  struct ByteR
17470 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a  angeLockPB2 pb;.
17480 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20    int err;.  .  
17490 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20  pb.unLockFlag = 
174a0 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20  setLockFlag ? 0 
174b0 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45  : 1;.  pb.startE
174c0 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62  ndFlag = 0;.  pb
174d0 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .offset = offset
174e0 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20  ;.  pb.length = 
174f0 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64  length; .  pb.fd
17500 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a   = pFile->h;.  .
17510 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53    OSTRACE(("AFPS
17520 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20  ETLOCK [%s] for 
17530 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c  %d%s in range %l
17540 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20  lx:%llx\n", .   
17550 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f   (setLockFlag?"O
17560 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65  N":"OFF"), pFile
17570 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f  ->h, (pb.fd==-1?
17580 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22  "[testval-1]":""
17590 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c  ),.    offset, l
175a0 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20 3d  ength));.  err =
175b0 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70   fsctl(path, afp
175c0 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
175d0 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a  FSCTL, &pb, 0);.
175e0 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29    if ( err==-1 )
175f0 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20   {.    int rc;. 
17600 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
17610 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41  errno;.    OSTRA
17620 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE(("AFPSETLOCK 
17630 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28  failed to fsctl(
17640 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c  ) '%s' %d %s\n",
17650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61  .             pa
17660 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65  th, tErrno, stre
17670 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a  rror(tErrno)));.
17680 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
17690 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52  NORE_AFP_LOCK_ER
176a0 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51  RORS.    rc = SQ
176b0 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65  LITE_BUSY;.#else
176c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
176d0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
176e0 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20  ror(tErrno,.    
176f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17700 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51  setLockFlag ? SQ
17710 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20  LITE_IOERR_LOCK 
17720 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  : SQLITE_IOERR_U
17730 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f  NLOCK);.#endif /
17740 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
17750 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  AFP_LOCK_ERRORS 
17760 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  */.    if( IS_LO
17770 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
17780 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
17790 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
177a0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
177b0 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  n rc;.  } else {
177c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
177d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
177e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
177f0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
17800 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
17810 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
17820 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
17830 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
17840 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
17850 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
17860 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
17870 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
17880 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
17890 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
178a0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
178b0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
178c0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
178d0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
178e0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
178f0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
17900 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
17910 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52  ic int afpCheckR
17920 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
17930 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
17940 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
17950 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17960 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
17970 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
17980 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
17990 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c  File*)id;.  afpL
179a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
179b0 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d  ontext;.  .  Sim
179c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
179d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
179e0 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
179f0 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
17a00 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
17a10 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
17a20 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
17a30 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
17a40 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e  ntext;.  if( con
17a50 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29  text->reserved )
17a60 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d  {.    *pResOut =
17a70 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
17a80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17a90 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
17aa0 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
17ab0 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
17ac0 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
17ad0 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43  ads */.  .  /* C
17ae0 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
17af0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
17b00 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
17b10 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
17b20 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
17b30 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
17b40 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
17b50 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
17b60 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
17b70 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
17b80 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
17b90 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73     */.  if( !res
17ba0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
17bb0 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45  lock the RESERVE
17bc0 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e  D byte */.    in
17bd0 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f  t lrc = afpSetLo
17be0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17bf0 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
17c00 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20  VED_BYTE, 1,1); 
17c10 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45   .    if( SQLITE
17c20 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20  _OK==lrc ){.    
17c30 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65    /* if we succe
17c40 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74  eded in taking t
17c50 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
17c60 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72  , unlock it to r
17c70 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  estore.      ** 
17c80 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  the original sta
17c90 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  te */.      lrc 
17ca0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
17cb0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
17cc0 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
17cd0 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
17ce0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a   else {.      /*
17cf0 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f   if we failed to
17d00 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68   get the lock th
17d10 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  en someone else 
17d20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a  must have it */.
17d30 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
17d40 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
17d50 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
17d60 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63  lrc) ){.      rc
17d70 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =lrc;.    }.  }.
17d80 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
17d90 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
17da0 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
17db0 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e  %d %d %d (afp)\n
17dc0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
17dd0 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a   reserved));.  .
17de0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
17df0 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
17e00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
17e10 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
17e20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
17e30 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
17e40 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
17e50 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
17e60 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
17e70 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
17e80 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
17e90 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
17ea0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
17eb0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
17ec0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
17ed0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
17ee0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
17ef0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
17f00 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
17f10 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
17f20 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
17f30 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
17f40 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
17f50 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
17f60 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
17f70 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
17f80 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
17f90 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
17fa0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
17fb0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
17fc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
17fd0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
17fe0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
17ff0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
18000 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
18010 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
18020 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
18030 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
18040 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
18050 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
18060 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
18070 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
18080 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
18090 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
180a0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
180b0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
180c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
180d0 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
180e0 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
180f0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
18100 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
18110 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
18120 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
18130 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71  c int afpLock(sq
18140 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
18150 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
18160 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18170 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
18180 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
18190 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
181a0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
181b0 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
181c0 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
181d0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
181e0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
181f0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
18200 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
18210 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
18220 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
18230 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
18240 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
18250 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
18260 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
18270 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
18280 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c  leLock), azFileL
18290 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ock(pFile->eFile
182a0 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20  Lock),.         
182b0 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e    azFileLock(pIn
182c0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ode->eFileLock),
182d0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
182e0 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a   , getpid()));..
182f0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
18300 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
18310 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
18320 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
18330 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
18340 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
18350 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
18360 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65   afp_end_lock: e
18370 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
18380 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
18390 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
183a0 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
183b0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
183c0 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
183d0 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
183e0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
183f0 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
18400 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  d) (afp)\n", pFi
18410 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
18420 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
18430 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72  leLock)));.    r
18440 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18450 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
18460 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
18470 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
18480 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57  rect.  **  (1) W
18490 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f  e never move fro
184a0 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e  m unlocked to an
184b0 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68  ything higher th
184c0 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a  an shared lock..
184d0 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65    **  (2) SQLite
184e0 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c   never explicitl
184f0 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e  y requests a pen
18500 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  dig lock..  **  
18510 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63  (3) A shared loc
18520 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  k is always held
18530 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20   when a reserve 
18540 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
18550 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
18560 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
18570 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck!=NO_LOCK || e
18580 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
18590 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
185a0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45  t( eFileLock!=PE
185b0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
185c0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
185d0 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k!=RESERVED_LOCK
185e0 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   || pFile->eFile
185f0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
18600 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  K );.  .  /* Thi
18610 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
18620 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
18630 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
18640 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
18650 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
18660 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
18670 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
18680 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  de;..  /* If som
18690 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
186a0 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
186b0 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
186c0 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a  nt unixFile*.  *
186d0 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72  * handle that pr
186e0 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75  ecludes the requ
186f0 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75  ested lock, retu
18700 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  rn BUSY..  */.  
18710 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  if( (pFile->eFil
18720 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65  eLock!=pInode->e
18730 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20  FileLock && .   
18740 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
18750 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
18760 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
18770 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a  k>SHARED_LOCK)).
18780 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d       ){.    rc =
18790 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
187a0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
187b0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
187c0 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
187d0 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
187e0 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
187f0 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
18800 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
18810 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
18820 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
18830 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
18840 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
18850 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
18860 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
18870 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
18880 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
18890 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
188a0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
188b0 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c   || pInode->eFil
188c0 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
188d0 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
188e0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
188f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
18900 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
18910 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
18920 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
18930 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20  node->nShared>0 
18940 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  );.    pFile->eF
18950 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
18960 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
18970 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20  e->nShared++;.  
18980 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
18990 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  +;.    goto afp_
189a0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
189b0 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e    .  /* A PENDIN
189c0 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
189d0 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
189e0 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
189f0 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
18a00 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
18a10 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
18a20 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
18a30 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
18a40 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
18a50 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ased..  */.  if(
18a60 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
18a70 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
18a80 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  | (eFileLock==EX
18a90 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
18aa0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18ab0 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
18ac0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   ){.    int fail
18ad0 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d  ed;.    failed =
18ae0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
18af0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
18b00 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
18b10 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20  , 1, 1);.    if 
18b20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  (failed) {.     
18b30 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
18b40 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
18b50 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
18b60 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  .  .  /* If cont
18b70 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
18b80 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
18b90 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
18ba0 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
18bb0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
18bc0 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
18bd0 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
18be0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
18bf0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
18c00 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c  .    int lrc1, l
18c10 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d  rc2, lrc1Errno =
18c20 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c   0;.    long lk,
18c30 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20   mask;.    .    
18c40 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
18c50 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20  nShared==0 );.  
18c60 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
18c70 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
18c80 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d  ;.        .    m
18c90 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f  ask = (sizeof(lo
18ca0 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53  ng)==8) ? LARGES
18cb0 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66  T_INT64 : 0x7fff
18cc0 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77  ffff;.    /* Now
18cd0 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
18ce0 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  ck SHARED_LOCK *
18cf0 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68  /.    /* note th
18d00 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f  at the quality o
18d10 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  f the randomness
18d20 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
18d30 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20  that much */.   
18d40 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20   lk = random(); 
18d50 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61  .    pInode->sha
18d60 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20  redByte = (lk & 
18d70 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49  mask)%(SHARED_SI
18d80 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63  ZE - 1);.    lrc
18d90 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  1 = afpSetLock(c
18da0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
18db0 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
18dc0 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70    SHARED_FIRST+p
18dd0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
18de0 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  e, 1, 1);.    if
18df0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
18e00 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c  lrc1) ){.      l
18e10 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65  rc1Errno = pFile
18e20 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
18e30 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74   }.    /* Drop t
18e40 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
18e50 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
18e60 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f   lrc2 = afpSetLo
18e70 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
18e80 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
18e90 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
18ea0 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f      .    if( IS_
18eb0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
18ec0 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   ) {.      pFile
18ed0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72  ->lastErrno = lr
18ee0 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  c1Errno;.      r
18ef0 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20  c = lrc1;.      
18f00 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
18f10 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
18f20 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
18f30 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72  lrc2) ){.      r
18f40 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20  c = lrc2;.      
18f50 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
18f60 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
18f70 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45  ( lrc1 != SQLITE
18f80 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63  _OK ) {.      rc
18f90 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65   = lrc1;.    } e
18fa0 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  lse {.      pFil
18fb0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
18fc0 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
18fd0 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
18fe0 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  +;.      pInode-
18ff0 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  >nShared = 1;.  
19000 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
19010 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
19020 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e  SIVE_LOCK && pIn
19030 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
19040 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
19050 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
19060 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
19070 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
19080 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20  in this.     ** 
19090 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
190a0 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
190b0 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
190c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
190d0 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
190e0 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
190f0 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
19100 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
19110 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
19120 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
19130 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
19140 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
19150 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
19160 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
19170 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
19180 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  failed = 0;.    
19190 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
191a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
191b0 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b     if (eFileLock
191c0 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   >= RESERVED_LOC
191d0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
191e0 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44  eLock < RESERVED
191f0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20  _LOCK) {.       
19200 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
19210 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20  SERVED lock */. 
19220 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
19230 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
19240 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
19250 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
19260 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66  , 1,1);.      if
19270 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  ( !failed ){.   
19280 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65       context->re
19290 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
192a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
192b0 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46 69   (!failed && eFi
192c0 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53  leLock == EXCLUS
192d0 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  IVE_LOCK) {.    
192e0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
192f0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a  EXCLUSIVE lock *
19300 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  /.        .     
19310 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
19320 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72  hared lock befor
19330 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e  e trying the ran
19340 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20  ge.  we'll need 
19350 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65  to .      ** ree
19360 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
19370 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63  red lock if we c
19380 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66  an't get the  af
19390 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f  pUnlock.      */
193a0 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69  .      if( !(fai
193b0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
193c0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
193d0 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
193e0 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19400 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
19410 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20  yte, 1, 0)) ){. 
19420 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65         int faile
19430 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  d2 = SQLITE_OK;.
19440 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61          /* now a
19450 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74  ttemmpt to get t
19460 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
19470 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20  k range */.     
19480 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
19490 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
194a0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
194b0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20  HARED_FIRST, .  
194c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194d0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
194e0 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20  RED_SIZE, 1);.  
194f0 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65 64        if( failed
19500 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61   && (failed2 = a
19510 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
19520 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
19530 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
19540 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
19550 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d  _FIRST + pInode-
19560 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
19570 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  1)) ){.         
19580 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61   /* Can't reesta
19590 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
195a0 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63   lock.  Sqlite c
195b0 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20  an't deal, this 
195c0 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
195d0 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65  a critical I/O e
195e0 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
195f0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
19600 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49   ((failed & SQLI
19610 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
19620 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69  ITE_IOERR) ? fai
19630 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20  led2 : .        
19640 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
19650 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
19660 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
19670 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  _lock;.        }
19680 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20   .      }else{. 
19690 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c         rc = fail
196a0 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed; .      }.   
196b0 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65   }.    if( faile
196c0 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
196d0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
196e0 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
196f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19700 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
19710 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
19720 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
19730 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
19740 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
19750 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
19760 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
19770 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
19780 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
19790 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
197a0 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
197b0 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f  OCK;.  }.  .afp_
197c0 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
197d0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
197e0 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
197f0 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70 29    %d %s %s (afp)
19800 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
19810 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
19820 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ock), .         
19830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
19840 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
19850 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19860 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
19870 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
19880 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
19890 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
198a0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
198b0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
198c0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
198d0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
198e0 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
198f0 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
19900 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
19910 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
19920 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
19930 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
19940 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
19950 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
19960 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
19970 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
19980 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
19990 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
199a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
199b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
199c0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
199d0 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
199e0 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66  fo *pInode;.  af
199f0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
19a00 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
19a10 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
19a20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
19a30 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b  ontext;.  int sk
19a40 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69  ipShared = 0;.#i
19a50 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
19a60 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65  .  int h = pFile
19a70 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ->h;.#endif..  a
19a80 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
19a90 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
19aa0 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
19ab0 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
19ac0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
19ad0 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
19ae0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
19af0 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
19b00 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
19b10 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
19b20 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20  de->nShared,.   
19b30 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29          getpid()
19b40 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  ));..  assert( e
19b50 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
19b60 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
19b70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
19b80 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
19b90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19ba0 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
19bb0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
19bc0 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
19bd0 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
19be0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21  pInode->nShared!
19bf0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
19c00 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
19c10 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
19c20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
19c30 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65  eFileLock==pFile
19c40 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
19c50 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19c60 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
19c70 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19c80 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53  ( h=(-1) ).    S
19c90 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
19ca0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69  nign(0);.    .#i
19cb0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
19cc0 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
19cd0 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
19ce0 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
19cf0 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
19d00 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
19d10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
19d20 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
19d30 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
19d40 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
19d50 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
19d60 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
19d70 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
19d80 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
19d90 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
19da0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
19db0 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
19dc0 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
19dd0 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
19de0 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
19df0 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
19e00 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
19e10 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
19e20 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
19e30 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
19e40 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
19e50 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
19e60 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
19e70 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
19e80 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
19e90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
19ea0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
19eb0 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
19ec0 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61  || pFile->dbUpda
19ed0 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
19ee0 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73   || pFile->trans
19ef0 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20  CntrChng==1 );. 
19f00 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
19f10 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
19f20 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28  dif.    .    if(
19f30 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
19f40 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
19f50 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
19f60 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
19f70 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
19f80 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
19f90 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
19fa0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
19fb0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
19fc0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
19fd0 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
19fe0 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20  nShared>1) ){.  
19ff0 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65        /* only re
1a000 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  -establish the s
1a010 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65  hared lock if ne
1a020 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20  cessary */.     
1a030 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63     int sharedLoc
1a040 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
1a050 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
1a060 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20  redByte;.       
1a070 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
1a080 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1a090 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
1a0a0 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  ockByte, 1, 1);.
1a0b0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
1a0c0 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65         skipShare
1a0d0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
1a0e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1a0f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
1a100 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
1a110 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
1a120 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
1a130 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
1a140 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
1a150 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
1a160 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66  );.    } .    if
1a170 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a180 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
1a190 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
1a1a0 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72  CK && context->r
1a1b0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20  eserved ){.     
1a1c0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
1a1d0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1a1e0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
1a1f0 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
1a200 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20       if( !rc ){ 
1a210 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
1a220 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20  ->reserved = 0; 
1a230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a240 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a250 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
1a260 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
1a270 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
1a280 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49  ed>1)){.      pI
1a290 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
1a2a0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
1a2b0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
1a2c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1a2d0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
1a2e0 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65  CK ){..    /* De
1a2f0 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
1a300 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
1a310 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
1a320 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
1a330 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
1a340 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
1a350 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
1a360 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
1a370 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
1a380 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
1a390 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
1a3a0 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  ng sharedLockByt
1a3b0 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
1a3c0 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
1a3d0 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  yte;.    pInode-
1a3e0 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20  >nShared--;.    
1a3f0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  if( pInode->nSha
1a400 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
1a410 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1a420 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1a430 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1a440 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20   h=(-1) ).      
1a450 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1a460 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1a470 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20  if( !skipShared 
1a480 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1a490 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
1a4a0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
1a4b0 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
1a4c0 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
1a4d0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  }.      if( !rc 
1a4e0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
1a4f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
1a500 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  O_LOCK;.        
1a510 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1a520 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
1a530 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1a540 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a550 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
1a560 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20  >nLock--;.      
1a570 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
1a580 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
1a590 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
1a5a0 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
1a5b0 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
1a5c0 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
1a5d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  }.    }.  }.  . 
1a5e0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
1a5f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1a600 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
1a610 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
1a620 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
1a630 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
1a640 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61  se a file & clea
1a650 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63  nup AFP specific
1a660 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
1a670 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
1a680 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  afpClose(sqlite3
1a690 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
1a6a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a6b0 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
1a6c0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
1a6d0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1a6e0 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63  id;.    afpUnloc
1a6f0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
1a700 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
1a710 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ex();.    if( pF
1a720 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70  ile->pInode && p
1a730 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
1a740 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
1a750 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
1a760 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
1a770 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
1a780 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
1a790 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74  ust.      ** yet
1a7a0 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
1a7b0 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
1a7c0 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
1a7d0 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
1a7e0 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
1a7f0 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65  r to pInode->aPe
1a800 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20  nding.  It will 
1a810 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
1a820 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20   closed when.   
1a830 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c     ** the last l
1a840 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
1a850 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1a860 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
1a870 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  e);.    }.    re
1a880 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
1a890 46 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  File);.    sqlit
1a8a0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
1a8b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
1a8c0 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e      rc = closeUn
1a8d0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20  ixFile(id);.    
1a8e0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
1a8f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1a900 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
1a910 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1a920 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
1a930 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1a940 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  E */./*.** The c
1a950 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65  ode above is the
1a960 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
1a970 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63  entation.  The c
1a980 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a  ode is specific.
1a990 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64  ** to MacOSX and
1a9a0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
1a9b0 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61  n other unix pla
1a9c0 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65  tforms.  No alte
1a9d0 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76  rnative.** is av
1a9e0 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75  ailable.  If you
1a9f0 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66   don't compile f
1aa00 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74  or a mac, then t
1aa10 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a  he "unix-afp".**
1aa20 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69   VFS is not avai
1aa30 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  lable..**.******
1aa40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1aa50 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c  End of the AFP l
1aa60 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
1aa70 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
1aa80 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1aa90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aaa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aad0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
1aae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aaf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab00 2a 2a 2a 2a 2a 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 0a 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 20 42 65 67 69 6e 20 4e 46 53  ****** Begin NFS
1ab50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
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 2f 0a 0a 23 69 66 20  *********/..#if 
1ab80 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1ab90 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
1aba0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1abb0 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74  E./*. ** Lower t
1abc0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
1abd0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
1abe0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
1abf0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
1ac00 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65  ck. ** must be e
1ac10 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
1ac20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a   SHARED_LOCK.. *
1ac30 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  *. ** If the loc
1ac40 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
1ac50 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1ac60 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
1ac70 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65  or below. ** the
1ac80 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
1ac90 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
1aca0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1acb0 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  p.. */.static in
1acc0 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  t nfsUnlock(sqli
1acd0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1ace0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
1acf0 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f  return posixUnlo
1ad00 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
1ad10 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  , 1);.}..#endif 
1ad20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
1ad30 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
1ad40 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1ad50 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
1ad60 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
1ad70 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
1ad80 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
1ad90 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
1ada0 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
1adb0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
1adc0 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
1add0 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
1ade0 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
1adf0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a   available.  .**
1ae00 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1ae10 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
1ae20 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
1ae30 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
1ae40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae50 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1ae60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1aea0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
1aeb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1af00 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73  ** Non-locking s
1af10 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
1af20 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
1af30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af40 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
1af50 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
1af60 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ns implementatio
1af70 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f  ns for all metho
1af80 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71  ds of the .** sq
1af90 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
1afa0 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  t other than the
1afb0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
1afc0 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  .  The locking.*
1afd0 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64  * methods were d
1afe0 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69  efined in divisi
1aff0 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c  ons above (one l
1b000 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65  ocking method pe
1b010 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20  r.** division). 
1b020 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74   Those methods t
1b030 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74  hat are common t
1b040 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f  o all locking mo
1b050 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65  des.** are gathe
1b060 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20  r together into 
1b070 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  this division..*
1b080 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  /../*.** Seek to
1b090 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73   the offset pass
1b0a0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1b0b0 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20   argument, then 
1b0c0 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74  read cnt .** byt
1b0d0 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65  es into pBuf. Re
1b0e0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1b0f0 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
1b100 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42  y read..**.** NB
1b110 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65  :  If you define
1b120 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53   USE_PREAD or US
1b130 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20  E_PREAD64, then 
1b140 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a  it might also.**
1b150 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
1b160 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
1b170 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e  OURCE to be 500.
1b180 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72    This varies fr
1b190 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d  om.** one system
1b1a0 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69   to another.  Si
1b1b0 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20  nce SQLite does 
1b1c0 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50  not define USE_P
1b1d0 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20  READ.** any any 
1b1e0 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c  form by default,
1b1f0 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74   we will not att
1b200 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f  empt to define _
1b210 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a  XOPEN_SOURCE..**
1b220 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37   See tickets #27
1b230 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a  41 and #2681..**
1b240 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
1b250 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
1b260 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
1b270 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45  d read the lastE
1b280 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
1b290 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
1b2a0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
1b2b0 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64   int seekAndRead
1b2c0 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73  (unixFile *id, s
1b2d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1b2e0 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  set, void *pBuf,
1b2f0 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
1b300 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69   got;.#if (!defi
1b310 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
1b320 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
1b330 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
1b340 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
1b350 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
1b360 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
1b370 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f 74  PREAD).  do{ got
1b380 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68   = osPread(id->h
1b390 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
1b3a0 73 65 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f  set); }while( go
1b3b0 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
1b3c0 4e 54 52 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  NTR );.  Simulat
1b3d0 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
1b3e0 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  -1 );.#elif defi
1b3f0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
1b400 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50  .  do{ got = osP
1b410 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42  read64(id->h, pB
1b420 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
1b430 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  ; }while( got<0 
1b440 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29  && errno==EINTR)
1b450 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1b460 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
1b470 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73  .#else.  newOffs
1b480 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
1b490 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
1b4a0 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ET);.  SimulateI
1b4b0 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
1b4c0 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65 77  t-- );.  if( new
1b4d0 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29  Offset!=offset )
1b4e0 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  {.    if( newOff
1b4f0 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  set == -1 ){.   
1b500 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1b510 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
1b520 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65  errno;.    }else
1b530 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
1b540 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
1b550 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d  no = 0;....    }
1b560 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
1b570 20 20 7d 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20    }.  do{ got = 
1b580 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  osRead(id->h, pB
1b590 75 66 2c 20 63 6e 74 29 3b 20 7d 77 68 69 6c 65  uf, cnt); }while
1b5a0 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
1b5b0 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69  ==EINTR );.#endi
1b5c0 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  f.  TIMER_END;. 
1b5d0 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
1b5e0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
1b5f0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
1b600 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  rrno;.  }.  OSTR
1b610 41 43 45 28 28 22 52 45 41 44 20 20 20 20 25 2d  ACE(("READ    %-
1b620 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
1b630 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74  u\n", id->h, got
1b640 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f  , offset, TIMER_
1b650 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74  ELAPSED));.  ret
1b660 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn got;.}../*.*
1b670 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
1b680 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
1b690 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
1b6a0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
1b6b0 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
1b6c0 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
1b6d0 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
1b6e0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
1b6f0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
1b700 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65  tatic int unixRe
1b710 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
1b720 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20  le *id, .  void 
1b730 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d  *pBuf, .  int am
1b740 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
1b750 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75  64 offset.){.  u
1b760 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1b770 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
1b780 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73  .  int got;.  as
1b790 73 65 72 74 28 20 69 64 20 29 3b 0a 0a 20 20 2f  sert( id );..  /
1b7a0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
1b7b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
1b7c0 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73  t a journal, mas
1b7d0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ter-journal or t
1b7e0 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20  emp.  ** file), 
1b7f0 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
1b800 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73   locking range s
1b810 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72  hould never be r
1b820 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
1b830 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
1b840 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  t( pFile->pUnuse
1b850 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
1b860 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
1b870 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
1b880 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
1b890 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
1b8a0 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d  .#endif..  got =
1b8b0 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69   seekAndRead(pFi
1b8c0 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
1b8d0 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f  , amt);.  if( go
1b8e0 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65  t==amt ){.    re
1b8f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b900 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c    }else if( got<
1b910 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74  0 ){.    /* last
1b920 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
1b930 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
1b940 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1b950 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ERR_READ;.  }els
1b960 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
1b970 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20  stErrno = 0; /* 
1b980 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72  not a system err
1b990 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72  or */.    /* Unr
1b9a0 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65  ead parts of the
1b9b0 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
1b9c0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20  zero-filled */. 
1b9d0 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
1b9e0 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30  r*)pBuf)[got], 0
1b9f0 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20  , amt-got);.    
1ba00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1ba10 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
1ba20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65    }.}../*.** See
1ba30 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
1ba40 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68  in id->offset th
1ba50 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65  en read cnt byte
1ba60 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20  s into pBuf..** 
1ba70 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1ba80 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
1ba90 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74  lly read.  Updat
1baa0 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a  e the offset..**
1bab0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
1bac0 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
1bad0 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
1bae0 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74  d write the last
1baf0 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
1bb00 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
1bb10 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
1bb20 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69  c int seekAndWri
1bb30 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  te(unixFile *id,
1bb40 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e   i64 offset, con
1bb50 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  st void *pBuf, i
1bb60 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
1bb70 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65  ot;.#if (!define
1bb80 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20  d(USE_PREAD) && 
1bb90 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
1bba0 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77  AD64)).  i64 new
1bbb0 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20  Offset;.#endif. 
1bbc0 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69   TIMER_START;.#i
1bbd0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
1bbe0 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d  EAD).  do{ got =
1bbf0 20 6f 73 50 77 72 69 74 65 28 69 64 2d 3e 68 2c   osPwrite(id->h,
1bc00 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
1bc10 65 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74  et); }while( got
1bc20 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
1bc30 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  TR );.#elif defi
1bc40 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
1bc50 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50  .  do{ got = osP
1bc60 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70  write64(id->h, p
1bc70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
1bc80 29 3b 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  );}while( got<0 
1bc90 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29  && errno==EINTR)
1bca0 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20  ;.#else.  do{.  
1bcb0 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
1bcc0 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
1bcd0 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
1bce0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1bcf0 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29  r( newOffset-- )
1bd00 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  ;.    if( newOff
1bd10 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
1bd20 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73       if( newOffs
1bd30 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
1bd40 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1bd50 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
1bd60 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65   errno;.      }e
1bd70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75  lse{.        ((u
1bd80 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
1bd90 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a  stErrno = 0;....
1bda0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1bdb0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
1bdc0 20 20 20 67 6f 74 20 3d 20 6f 73 57 72 69 74 65     got = osWrite
1bdd0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
1bde0 74 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f  t);.  }while( go
1bdf0 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
1be00 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NTR );.#endif.  
1be10 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28  TIMER_END;.  if(
1be20 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28   got<0 ){.    ((
1be30 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
1be40 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1be50 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
1be60 28 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20  (("WRITE   %-3d 
1be70 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
1be80 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f  ", id->h, got, o
1be90 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41  ffset, TIMER_ELA
1bea0 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e  PSED));.  return
1beb0 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   got;.}.../*.** 
1bec0 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
1bed0 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
1bee0 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
1bef0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1bf00 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
1bf10 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
1bf20 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
1bf30 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69  atic int unixWri
1bf40 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
1bf50 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74  le *id, .  const
1bf60 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
1bf70 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
1bf80 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
1bf90 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
1bfa0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1bfb0 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f  e*)id;.  int wro
1bfc0 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  te = 0;.  assert
1bfd0 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
1bfe0 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ( amt>0 );..  /*
1bff0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61   If this is a da
1c000 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
1c010 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74   a journal, mast
1c020 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65  er-journal or te
1c030 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74  mp.  ** file), t
1c040 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
1c050 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68  locking range sh
1c060 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65  ould never be re
1c070 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a  ad or written. *
1c080 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
1c090 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  ( pFile->pUnused
1c0a0 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  ==0.       || of
1c0b0 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59  fset>=PENDING_BY
1c0c0 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c  TE+512.       ||
1c0d0 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e   offset+amt<=PEN
1c0e0 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a  DING_BYTE .  );.
1c0f0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1c100 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77  NDEBUG.  /* If w
1c110 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f  e are doing a no
1c120 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20  rmal write to a 
1c130 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
1c140 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a  s opposed to.  *
1c150 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
1c160 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
1c170 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
1c180 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
1c190 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  n a.  ** normal 
1c1a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74  database file) t
1c1b0 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66  hen record the f
1c1c0 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74  act that the dat
1c1d0 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63  abase.  ** has c
1c1e0 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
1c1f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1c200 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c  ter is modified,
1c210 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a   record that.  *
1c220 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f  * fact too..  */
1c230 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e  .  if( pFile->in
1c240 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20  NormalWrite ){. 
1c250 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
1c260 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20  te = 1;  /* The 
1c270 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
1c280 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20  n modified */.  
1c290 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34    if( offset<=24
1c2a0 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d   && offset+amt>=
1c2b0 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  27 ){.      int 
1c2c0 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f  rc;.      char o
1c2d0 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20  ldCntr[4];.     
1c2e0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1c2f0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
1c300 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61   rc = seekAndRea
1c310 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64  d(pFile, 24, old
1c320 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cntr, 4);.      
1c330 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1c340 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1c350 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d  if( rc!=4 || mem
1c360 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28  cmp(oldCntr, &((
1c370 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f  char*)pBuf)[24-o
1c380 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b  ffset], 4)!=0 ){
1c390 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
1c3a0 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
1c3b0 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73  1;  /* The trans
1c3c0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68  action counter h
1c3d0 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  as changed */.  
1c3e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c3f0 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28  #endif..  while(
1c400 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65   amt>0 && (wrote
1c410 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
1c420 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
1c430 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a  Buf, amt))>0 ){.
1c440 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65      amt -= wrote
1c450 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  ;.    offset += 
1c460 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20  wrote;.    pBuf 
1c470 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  = &((char*)pBuf)
1c480 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53  [wrote];.  }.  S
1c490 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28  imulateIOError((
1c4a0 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74   wrote=(-1), amt
1c4b0 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74  =1 ));.  Simulat
1c4c0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28  eDiskfullError((
1c4d0 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20   wrote=0, amt=1 
1c4e0 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30  ));..  if( amt>0
1c4f0 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74   ){.    if( wrot
1c500 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61  e<0 && pFile->la
1c510 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20  stErrno!=ENOSPC 
1c520 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74  ){.      /* last
1c530 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
1c540 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20  kAndWrite */.   
1c550 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c560 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
1c570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1c580 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1c590 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
1c5a0 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
1c5b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c5c0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
1c5d0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1c5e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
1c5f0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
1c600 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
1c610 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
1c620 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
1c630 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
1c640 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
1c650 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
1c660 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69  yncs are occurri
1c670 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
1c680 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
1c690 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
1c6a0 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
1c6b0 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
1c6c0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
1c6d0 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72  .** We do not tr
1c6e0 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70  ust systems to p
1c6f0 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67  rovide a working
1c700 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53   fdatasync().  S
1c710 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72  ome do..** Other
1c720 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20  s do no.  To be 
1c730 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74  safe, we will st
1c740 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c  ick with the (sl
1c750 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a  ightly slower).*
1c760 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f  * fsync(). If yo
1c770 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72  u know that your
1c780 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70   system does sup
1c790 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28 29  port fdatasync()
1c7a0 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74   correctly,.** t
1c7b0 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69  hen simply compi
1c7c0 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61 73  le with -Dfdatas
1c7d0 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a 2f  ync=fdatasync.*/
1c7e0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66 64  .#if !defined(fd
1c7f0 61 74 61 73 79 6e 63 29 0a 23 20 64 65 66 69 6e  atasync).# defin
1c800 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e  e fdatasync fsyn
1c810 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  c.#endif../*.** 
1c820 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  Define HAVE_FULL
1c830 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20  FSYNC to 0 or 1 
1c840 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
1c850 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
1c860 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d  he F_FULLFSYNC m
1c870 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e  acro is defined.
1c880 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73    F_FULLFSYNC is
1c890 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e   currently.** on
1c8a0 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
1c8b0 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74  Mac OS X.  But t
1c8c0 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65  hat could change
1c8d0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55  ..*/.#ifdef F_FU
1c8e0 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  LLFSYNC.# define
1c8f0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1c900 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  1.#else.# define
1c910 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1c920 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  0.#endif..#ifdef
1c930 20 53 51 4c 49 54 45 5f 55 53 45 5f 52 45 51 55   SQLITE_USE_REQU
1c940 45 53 54 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 69  EST_FULLFSYNC.#i
1c950 6d 70 6f 72 74 20 3c 6e 6f 74 69 66 79 2e 68 3e  mport <notify.h>
1c960 0a 23 69 6d 70 6f 72 74 20 3c 6c 69 62 6b 65 72  .#import <libker
1c970 6e 2f 4f 53 41 74 6f 6d 69 63 2e 68 3e 0a 73 74  n/OSAtomic.h>.st
1c980 61 74 69 63 20 4f 53 53 70 69 6e 4c 6f 63 6b 20  atic OSSpinLock 
1c990 6e 6f 74 69 66 79 5f 6c 6f 63 6b 20 3d 20 30 3b  notify_lock = 0;
1c9a0 0a 23 64 65 66 69 6e 65 20 52 45 51 55 45 53 54  .#define REQUEST
1c9b0 5f 46 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46 49  _FULLSYNC_NOTIFI
1c9c0 43 41 54 49 4f 4e 20 20 20 20 22 63 6f 6d 2e 61  CATION    "com.a
1c9d0 70 70 6c 65 2e 72 65 71 73 79 6e 63 22 0a 23 65  pple.reqsync".#e
1c9e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1c9f0 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63  fsync() system c
1ca00 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  all does not wor
1ca10 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20  k as advertised 
1ca20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20  on many.** unix 
1ca30 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f  systems.  The fo
1ca40 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72  llowing procedur
1ca50 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  e is an attempt 
1ca60 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f  to make.** it wo
1ca70 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  rk better..**.**
1ca80 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   The SQLITE_NO_S
1ca90 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c  YNC macro disabl
1caa0 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e  es all fsync()s.
1cab0 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c    This is useful
1cac0 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20  .** for testing 
1cad0 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
1cae0 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  run through the 
1caf0 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b  test suite quick
1cb00 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73  ly..** You are s
1cb10 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20  trongly advised 
1cb20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20  *not* to deploy 
1cb30 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
1cb40 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  YNC.** enabled, 
1cb50 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77  however, since w
1cb60 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
1cb70 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f  NC enabled, an O
1cb80 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f  S crash.** or po
1cb90 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c  wer failure will
1cba0 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20   likely corrupt 
1cbb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cbc0 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  e..**.** SQLite 
1cbd0 73 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c  sets the dataOnl
1cbe0 79 20 66 6c 61 67 20 69 66 20 74 68 65 20 73 69  y flag if the si
1cbf0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
1cc00 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  s unchanged..** 
1cc10 54 68 65 20 69 64 65 61 20 62 65 68 69 6e 64 20  The idea behind 
1cc20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74  dataOnly is that
1cc30 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20   it should only 
1cc40 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 63  write the file c
1cc50 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73  ontent.** to dis
1cc60 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65  k, not the inode
1cc70 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64  .  We only set d
1cc80 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66  ataOnly if the f
1cc90 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20  ile size is .** 
1cca0 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20  unchanged since 
1ccb0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73  the file size is
1ccc0 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f   part of the ino
1ccd0 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a  de.  However, .*
1cce0 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73  * Ted Ts'o tells
1ccf0 20 75 73 20 74 68 61 74 20 66 64 61 74 61 73 79   us that fdatasy
1cd00 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77  nc() will also w
1cd10 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69  rite the inode i
1cd20 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69  f the.** file si
1cd30 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ze has changed. 
1cd40 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64   The only real d
1cd50 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1cd60 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a  n fdatasync().**
1cd70 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65   and fsync(), Te
1cd80 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74  d tells us, is t
1cd90 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
1cda0 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74  will not flush t
1cdb0 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74  he.** inode if t
1cdc0 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65  he mtime or owne
1cdd0 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65  r or other inode
1cde0 20 61 74 74 72 69 62 75 74 65 73 20 68 61 76 65   attributes have
1cdf0 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20   changed..** We 
1ce00 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
1ce10 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e  the file size, n
1ce20 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c  ot the other fil
1ce30 65 20 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f  e attributes, so
1ce40 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53 51  .** as far as SQ
1ce50 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65  Lite is concerne
1ce60 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28  d, an fdatasync(
1ce70 29 20 69 73 20 61 6c 77 61 79 73 20 61 64 65 71  ) is always adeq
1ce80 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20  uate..** So, we 
1ce90 61 6c 77 61 79 73 20 75 73 65 20 66 64 61 74 61  always use fdata
1cea0 73 79 6e 63 28 29 20 69 66 20 69 74 20 69 73 20  sync() if it is 
1ceb0 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72  available, regar
1cec0 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20  dless of.** the 
1ced0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
1cee0 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73  aOnly flag..*/.s
1cef0 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66  tatic int full_f
1cf00 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74  sync(int fd, int
1cf10 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64   fullSync, int d
1cf20 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  ataOnly){.  int 
1cf30 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  rc;..  /* The fo
1cf40 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65  llowing "ifdef/e
1cf50 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b  lif/else/" block
1cf60 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73 74   has the same st
1cf70 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20  ructure as.  ** 
1cf80 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49  the one below. I
1cf90 74 20 69 73 20 72 65 70 6c 69 63 61 74 65 64 20  t is replicated 
1cfa0 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61  here solely to a
1cfb0 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20  void cluttering 
1cfc0 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61  .  ** up the rea
1cfd0 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20  l code with the 
1cfe0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1cff0 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a  () macros..  */.
1d000 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
1d010 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50  _SYNC.  UNUSED_P
1d020 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
1d030 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1d040 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
1d050 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
1d060 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20  ataOnly);.#elif 
1d070 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
1d080 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d090 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
1d0a0 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
1d0b0 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b  METER(fullSync);
1d0c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1d0d0 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1d0e0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f  endif..  /* Reco
1d0f0 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
1d100 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64   times that we d
1d110 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63  o a normal fsync
1d120 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c  () and .  ** FUL
1d130 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20  LSYNC.  This is 
1d140 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74  used during test
1d150 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  ing to verify th
1d160 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  at this procedur
1d170 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c  e.  ** gets call
1d180 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  ed with the corr
1d190 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20  ect arguments.. 
1d1a0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1d1b0 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c  E_TEST.  if( ful
1d1c0 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f  lSync ) sqlite3_
1d1d0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
1d1e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  ;.  sqlite3_sync
1d1f0 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
1d200 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d  ..  /* If we com
1d210 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53  piled with the S
1d220 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c  QLITE_NO_SYNC fl
1d230 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67  ag, then syncing
1d240 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70   is a.  ** no-op
1d250 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1d260 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63  ITE_NO_SYNC.  rc
1d270 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65   = SQLITE_OK;.#e
1d280 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1d290 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  NC.  if( fullSyn
1d2a0 63 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  c ){.#ifdef SQLI
1d2b0 54 45 5f 55 53 45 5f 52 45 51 55 45 53 54 5f 46  TE_USE_REQUEST_F
1d2c0 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 72 63 20  ULLFSYNC.    rc 
1d2d0 3d 20 6f 73 46 73 79 6e 63 28 66 64 29 3b 0a 20  = osFsync(fd);. 
1d2e0 20 20 20 69 66 20 28 21 72 63 29 20 7b 0a 20 20     if (!rc) {.  
1d2f0 20 20 20 20 4f 53 53 70 69 6e 4c 6f 63 6b 4c 6f      OSSpinLockLo
1d300 63 6b 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29  ck(&notify_lock)
1d310 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 74  ;.      rc = not
1d320 69 66 79 5f 70 6f 73 74 28 52 45 51 55 45 53 54  ify_post(REQUEST
1d330 5f 46 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46 49  _FULLSYNC_NOTIFI
1d340 43 41 54 49 4f 4e 29 3b 0a 20 20 20 20 20 20 4f  CATION);.      O
1d350 53 53 70 69 6e 4c 6f 63 6b 55 6e 6c 6f 63 6b 28  SSpinLockUnlock(
1d360 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a 20  &notify_lock);. 
1d370 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72     }.#else.    r
1d380 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  c = osFcntl(fd, 
1d390 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b  F_FULLFSYNC, 0);
1d3a0 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
1d3b0 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
1d3c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c  .  /* If the FUL
1d3d0 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66  LFSYNC failed, f
1d3e0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65  all back to atte
1d3f0 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28  mpting an fsync(
1d400 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c  )..  ** It shoul
1d410 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65  dn't be possible
1d420 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74   for fullfsync t
1d430 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f  o fail on the lo
1d440 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73  cal .  ** file s
1d450 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20  ystem (on OSX), 
1d460 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63  so failure indic
1d470 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53  ates that FULLFS
1d480 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73  YNC.  ** isn't s
1d490 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69  upported for thi
1d4a0 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53  s file system. S
1d4b0 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73  o, attempt an fs
1d4c0 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66  ync .  ** and (f
1d4d0 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74  or now) ignore t
1d4e0 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61  he overhead of a
1d4f0 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e   superfluous fcn
1d500 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20  tl call.  .  ** 
1d510 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74  It'd be better t
1d520 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79  o detect fullfsy
1d530 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20  nc support once 
1d540 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20  and avoid .  ** 
1d550 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65  the fcntl call e
1d560 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69  very time sync i
1d570 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20  s called..  */. 
1d580 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66   if( rc ) rc = f
1d590 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66  sync(fd);..#elif
1d5a0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1d5b0 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79  __).  /* fdatasy
1d5c0 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65  nc() on HFS+ doe
1d5d0 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74  sn't yet flush t
1d5e0 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20  he file size if 
1d5f0 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65  it changed corre
1d600 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72  ctly.  ** so cur
1d610 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c  rently we defaul
1d620 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74  t to the macro t
1d630 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64  hat redefines fd
1d640 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63  atasync to fsync
1d650 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79  .  */.  rc = fsy
1d660 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20  nc(fd);.#else . 
1d670 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28   rc = fdatasync(
1d680 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  fd);.#if OS_VXWO
1d690 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31  RKS.  if( rc==-1
1d6a0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53   && errno==ENOTS
1d6b0 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  UP ){.    rc = f
1d6c0 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65  sync(fd);.  }.#e
1d6d0 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
1d6e0 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  KS */.#endif /* 
1d6f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
1d700 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46  SYNC elif HAVE_F
1d710 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69  ULLFSYNC */..  i
1d720 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  f( OS_VXWORKS &&
1d730 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20   rc!= -1 ){.    
1d740 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  rc = 0;.  }.  re
1d750 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d760 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65  * Open a file de
1d770 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
1d780 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
1d790 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e  ning file zFilen
1d7a0 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  ame..** If succe
1d7b0 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73  ssful, *pFd is s
1d7c0 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64  et to the opened
1d7d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1d7e0 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
1d7f0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
1d800 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1d810 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  s, either SQLITE
1d820 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c  _NOMEM.** or SQL
1d830 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20  ITE_CANTOPEN is 
1d840 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46  returned and *pF
1d850 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75  d is set to an u
1d860 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75  ndefined.** valu
1d870 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72  e..**.** The dir
1d880 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
1d890 72 69 70 74 6f 72 20 69 73 20 75 73 65 64 20 66  riptor is used f
1d8a0 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e  or only one thin
1d8b0 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28  g - to.** fsync(
1d8c0 29 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f  ) a directory to
1d8d0 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20   make sure file 
1d8e0 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c  creation and del
1d8f0 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20  etion events.** 
1d900 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64  are flushed to d
1d910 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63  isk.  Such fsync
1d920 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64  s are not needed
1d930 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75   on newer.** jou
1d940 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74  rnaling filesyst
1d950 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65 71  ems, but are req
1d960 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66  uired on older f
1d970 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a  ilesystems..**.*
1d980 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1d990 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  an be overridden
1d9a0 20 75 73 69 6e 67 20 74 68 65 20 78 53 65 74 53   using the xSetS
1d9b0 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65  ysCall interface
1d9c0 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79  ..** The ability
1d9d0 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69   to override thi
1d9e0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64  s routine was ad
1d9f0 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f  ded in support o
1da00 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75  f the.** chromiu
1da10 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e  m sandbox.  Open
1da20 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20  ing a directory 
1da30 69 73 20 61 20 73 65 63 75 72 69 74 79 20 72 69  is a security ri
1da40 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f  sk (we are.** to
1da50 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74  ld) so making it
1da60 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c   overrideable al
1da70 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75  lows the chromiu
1da80 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20  m sandbox to.** 
1da90 72 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75  replace this rou
1daa0 74 69 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d  tine with a harm
1dab0 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20  less no-op.  To 
1dac0 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e  make this routin
1dad0 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65  e.** a no-op, re
1dae0 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20  place it with a 
1daf0 73 74 75 62 20 74 68 61 74 20 72 65 74 75 72 6e  stub that return
1db00 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  s SQLITE_OK but 
1db10 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73  leaves.** *pFd s
1db20 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65  et to a negative
1db30 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   number..**.** I
1db40 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
1db50 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c  eturned, the cal
1db60 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
1db70 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a  le for closing.*
1db80 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  * the file descr
1db90 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67  iptor *pFd using
1dba0 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61   close()..*/.sta
1dbb0 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65  tic int openDire
1dbc0 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72  ctory(const char
1dbd0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74   *zFilename, int
1dbe0 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69   *pFd){.  int ii
1dbf0 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
1dc00 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65  .  char zDirname
1dc10 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
1dc20 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
1dc30 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
1dc40 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25  ME, zDirname, "%
1dc50 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  s", zFilename);.
1dc60 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74    for(ii=(int)st
1dc70 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20  rlen(zDirname); 
1dc80 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65  ii>1 && zDirname
1dc90 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29  [ii]!='/'; ii--)
1dca0 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a  ;.  if( ii>0 ){.
1dcb0 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d      zDirname[ii]
1dcc0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20   = '\0';.    fd 
1dcd0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44  = robust_open(zD
1dce0 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  irname, O_RDONLY
1dcf0 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  |O_BINARY, 0);. 
1dd00 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
1dd10 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45  #ifdef FD_CLOEXE
1dd20 43 0a 20 20 20 20 20 20 6f 73 46 63 6e 74 6c 28  C.      osFcntl(
1dd30 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46  fd, F_SETFD, osF
1dd40 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44  cntl(fd, F_GETFD
1dd50 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45  , 0) | FD_CLOEXE
1dd60 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  C);.#endif.     
1dd70 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44   OSTRACE(("OPEND
1dd80 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
1dd90 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20  d, zDirname));. 
1dda0 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20     }.  }.  *pFd 
1ddb0 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28  = fd;.  return (
1ddc0 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a  fd>=0?SQLITE_OK:
1ddd0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1dde0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
1ddf0 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e  T, "open", zDirn
1de00 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ame));.}../*.** 
1de10 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
1de20 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
1de30 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
1de40 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
1de50 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
1de60 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
1de70 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
1de80 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
1de90 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
1dea0 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
1deb0 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
1dec0 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
1ded0 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
1dee0 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
1def0 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
1df00 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
1df10 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
1df20 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
1df30 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
1df40 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
1df50 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
1df60 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
1df70 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
1df80 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
1df90 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
1dfa0 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
1dfb0 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
1dfc0 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
1dfd0 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
1dfe0 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
1dff0 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
1e000 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
1e010 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
1e020 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
1e030 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
1e040 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
1e050 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1e060 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1e070 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1e080 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
1e090 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
1e0a0 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
1e0b0 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
1e0c0 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
1e0d0 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
1e0e0 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
1e0f0 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
1e100 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1e110 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
1e120 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
1e130 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1e140 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
1e150 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
1e160 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
1e170 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
1e180 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
1e190 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1e1a0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
1e1b0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1e1c0 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
1e1d0 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
1e1e0 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
1e1f0 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
1e200 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
1e210 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
1e220 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
1e230 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1e240 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
1e250 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
1e260 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
1e270 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1e280 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
1e290 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
1e2a0 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
1e2b0 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
1e2c0 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
1e2d0 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
1e2e0 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1e2f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1e300 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
1e310 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
1e320 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25  RACE(("SYNC    %
1e330 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
1e340 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  ));.  rc = full_
1e350 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
1e360 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
1e370 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
1e380 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
1e390 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
1e3a0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1e3b0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1e3c0 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1e3d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1e3e0 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f  RR_FSYNC, "full_
1e3f0 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a  fsync", pFile->z
1e400 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Path);.  }..  /*
1e410 20 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20   Also fsync the 
1e420 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
1e430 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66  ning the file if
1e440 20 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61   the DIRSYNC fla
1e450 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20  g.  ** is set.  
1e460 54 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69  This is a one-ti
1e470 6d 65 20 6f 63 63 75 72 72 61 6e 63 65 2e 20 20  me occurrance.  
1e480 4d 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78  Many systems (ex
1e490 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a  amples: AIX).  *
1e4a0 2a 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  * are unable to 
1e4b0 66 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72  fsync a director
1e4c0 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72  y, so ignore err
1e4d0 6f 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63  ors on the fsync
1e4e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
1e4f0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
1e500 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
1e510 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66   ){.    int dirf
1e520 64 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  d;.    OSTRACE((
1e530 22 44 49 52 53 59 4e 43 20 25 73 20 28 68 61 76  "DIRSYNC %s (hav
1e540 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66  e_fullfsync=%d f
1e550 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20  ullsync=%d)\n", 
1e560 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20  pFile->zPath,.  
1e570 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46            HAVE_F
1e580 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c  ULLFSYNC, isFull
1e590 73 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d  sync));.    rc =
1e5a0 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   osOpenDirectory
1e5b0 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26  (pFile->zPath, &
1e5c0 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20  dirfd);.    if( 
1e5d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1e5e0 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20   dirfd>=0 ){.   
1e5f0 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69     full_fsync(di
1e600 72 66 64 2c 20 30 2c 20 30 29 3b 0a 23 69 66 20  rfd, 0, 0);.#if 
1e610 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c  OSCLOSE_CHECK_CL
1e620 4f 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  OSE_IOERR.      
1e630 69 66 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d  if( close(pFile-
1e640 3e 64 69 72 66 64 29 20 29 7b 0a 20 20 20 20 20  >dirfd) ){.     
1e650 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1e660 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1e670 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e680 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45  _IOERR_DIR_CLOSE
1e690 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ;.      }.#else.
1e6a0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
1e6b0 73 65 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c  se(pFile, dirfd,
1e6c0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 23 65 6e 64   __LINE__);.#end
1e6d0 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  if.    }else if(
1e6e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
1e6f0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63  OPEN ){.      rc
1e700 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e710 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63    }.    pFile->c
1e720 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49  trlFlags &= ~UNI
1e730 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 0a  XFILE_DIRSYNC;..
1e740 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1e750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
1e760 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
1e770 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
1e780 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
1e790 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73  t unixTruncate(s
1e7a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1e7b0 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75   i64 nByte){.  u
1e7c0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1e7d0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
1e7e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
1e7f0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1e800 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1e810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1e820 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b  OERR_TRUNCATE );
1e830 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
1e840 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
1e850 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
1e860 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72  or this file, tr
1e870 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
1e880 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
1e890 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69  consists of an i
1e8a0 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
1e8b0 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68   chunks (i.e. th
1e8c0 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69  e.  ** actual fi
1e8d0 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  le size after th
1e8e0 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20  e operation may 
1e8f0 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
1e900 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a  he requested.  *
1e910 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20  * size)..  */.  
1e920 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1e930 6e 6b 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  nk ){.    nByte 
1e940 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
1e950 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
1e960 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
1e970 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
1e980 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f  ;.  }..  rc = ro
1e990 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
1e9a0 46 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29  File->h, (off_t)
1e9b0 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63  nByte);.  if( rc
1e9c0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
1e9d0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1e9e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69  ;.    return uni
1e9f0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1ea00 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
1ea10 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46   "ftruncate", pF
1ea20 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
1ea30 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44  else{.#ifndef ND
1ea40 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77  EBUG.    /* If w
1ea50 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f  e are doing a no
1ea60 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20  rmal write to a 
1ea70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
1ea80 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20  s opposed to.   
1ea90 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
1eaa0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1eab0 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
1eac0 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
1ead0 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72  han a.    ** nor
1eae0 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  mal database fil
1eaf0 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61  e) and we trunca
1eb00 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
1eb10 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20  ero length,.    
1eb20 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76  ** that effectiv
1eb30 65 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20  ely updates the 
1eb40 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20  change counter. 
1eb50 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70   This might happ
1eb60 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72  en.    ** when r
1eb70 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62  estoring a datab
1eb80 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61  ase using the ba
1eb90 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20  ckup API from a 
1eba0 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20  zero-length.    
1ebb0 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a  ** source..    *
1ebc0 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  /.    if( pFile-
1ebd0 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26  >inNormalWrite &
1ebe0 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  & nByte==0 ){.  
1ebf0 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
1ec00 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20  CntrChng = 1;.  
1ec10 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1ec20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ec30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
1ec40 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
1ec50 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
1ec60 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
1ec70 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
1ec80 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
1ec90 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70  file *id, i64 *p
1eca0 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
1ecb0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
1ecc0 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  uf;.  assert( id
1ecd0 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74   );.  rc = osFst
1ece0 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  at(((unixFile*)i
1ecf0 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  d)->h, &buf);.  
1ed00 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1ed10 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
1ed20 63 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e  c!=0 ){.    ((un
1ed30 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
1ed40 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1ed50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ed60 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1ed70 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75   }.  *pSize = bu
1ed80 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a  f.st_size;..  /*
1ed90 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
1eda0 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61  zero-size databa
1edb0 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64  se, the findInod
1edc0 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72  eInfo() procedur
1edd0 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20  e.  ** writes a 
1ede0 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f  single byte into
1edf0 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72   that file in or
1ee00 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  der to work arou
1ee10 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e  nd a bug.  ** in
1ee20 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20   the OS-X msdos 
1ee30 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20  filesystem.  In 
1ee40 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70  order to avoid p
1ee50 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70  roblems with upp
1ee60 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20  er.  ** layers, 
1ee70 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72  we need to repor
1ee80 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65  t this file size
1ee90 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68   as zero even th
1eea0 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20  ough it is.  ** 
1eeb0 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b  really 1.   Tick
1eec0 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20  et #3260..  */. 
1eed0 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29   if( *pSize==1 )
1eee0 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20   *pSize = 0;... 
1eef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ef00 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
1ef10 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1ef20 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1ef30 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
1ef40 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72  * Handler for pr
1ef50 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65  oxy-locking file
1ef60 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20  -control verbs. 
1ef70 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69   Defined below i
1ef80 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e  n the.** proxyin
1ef90 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69  g locking divisi
1efa0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1efb0 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  t proxyFileContr
1efc0 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ol(sqlite3_file*
1efd0 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e  ,int,void*);.#en
1efe0 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  dif../* .** This
1eff0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1f000 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  led to handle th
1f010 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
1f020 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c  IZE_HINT .** fil
1f030 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74  e-control operat
1f040 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68  ion.  Enlarge th
1f050 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42  e database to nB
1f060 79 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20  ytes in size.** 
1f070 28 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74  (rounded up to t
1f080 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69  he next chunk-si
1f090 7a 65 29 2e 20 20 49 66 20 74 68 65 20 64 61 74  ze).  If the dat
1f0a0 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
1f0b0 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61  .** nBytes or la
1f0c0 72 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69  rger, this routi
1f0d0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
1f0e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e  /.static int fcn
1f0f0 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46  tlSizeHint(unixF
1f100 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20  ile *pFile, i64 
1f110 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46  nByte){.  if( pF
1f120 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
1f130 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b  {.    i64 nSize;
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f150 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1f160 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
1f170 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1f180 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1f190 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72  * Used to hold r
1f1a0 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20  eturn values of 
1f1b0 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20  fstat() */.   . 
1f1c0 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
1f1d0 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29  File->h, &buf) )
1f1e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1f1f0 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20  OERR_FSTAT;..   
1f200 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65   nSize = ((nByte
1f210 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d  +pFile->szChunk-
1f220 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68  1) / pFile->szCh
1f230 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1f240 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e  Chunk;.    if( n
1f250 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74  Size>(i64)buf.st
1f260 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65  _size ){..#if de
1f270 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58  fined(HAVE_POSIX
1f280 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48  _FALLOCATE) && H
1f290 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1f2a0 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  ATE.      /* The
1f2b0 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68   code below is h
1f2c0 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75  andling the retu
1f2d0 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61  rn value of osFa
1f2e0 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20  llocate() .     
1f2f0 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70   ** correctly. p
1f300 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1f310 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22   is defined to "
1f320 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20  returns zero on 
1f330 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20  success, .      
1f340 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e  ** or an error n
1f350 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72  umber on  failur
1f360 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70  e". See the manp
1f370 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  age for details.
1f380 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72   */.      int er
1f390 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  r;.      do{.   
1f3a0 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c       err = osFal
1f3b0 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  locate(pFile->h,
1f3c0 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53   buf.st_size, nS
1f3d0 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29  ize-buf.st_size)
1f3e0 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1f3f0 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  err==EINTR );.  
1f400 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65      if( err ) re
1f410 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1f420 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20  R_WRITE;.#else. 
1f430 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f       /* If the O
1f440 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  S does not have 
1f450 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1f460 29 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73  ), fake it. Firs
1f470 74 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  t use.      ** f
1f480 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65  truncate() to se
1f490 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
1f4a0 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 73 69   then write a si
1f4b0 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20  ngle byte to.   
1f4c0 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62     ** the last b
1f4d0 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63  yte in each bloc
1f4e0 6b 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74  k within the ext
1f4f0 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68  ended region. Th
1f500 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  is.      ** is t
1f510 68 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75  he same techniqu
1f520 65 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20  e used by glibc 
1f530 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73  to implement pos
1f540 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20  ix_fallocate(). 
1f550 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65       ** on syste
1f560 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68  ms that do not h
1f570 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f  ave a real fallo
1f580 63 61 74 65 28 29 20 73 79 73 74 65 6d 20 63 61  cate() system ca
1f590 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ll..      */.   
1f5a0 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75     int nBlk = bu
1f5b0 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f  f.st_blksize;  /
1f5c0 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c  * File-system bl
1f5d0 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ock size */.    
1f5e0 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20    i64 iWrite;   
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f600 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20   Next offset to 
1f610 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20  write to */..   
1f620 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74     if( robust_ft
1f630 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  runcate(pFile->h
1f640 2c 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  , nSize) ){.    
1f650 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1f660 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1f670 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
1f680 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1f690 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
1f6a0 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46   "ftruncate", pF
1f6b0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1f6c0 20 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74     }.      iWrit
1f6d0 65 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a  e = ((buf.st_siz
1f6e0 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f  e + 2*nBlk - 1)/
1f6f0 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20  nBlk)*nBlk-1;.  
1f700 20 20 20 20 77 68 69 6c 65 28 20 69 57 72 69 74      while( iWrit
1f710 65 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  e<nSize ){.     
1f720 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20     int nWrite = 
1f730 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
1f740 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20  le, iWrite, "", 
1f750 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1f760 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75  nWrite!=1 ) retu
1f770 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1f780 57 52 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69  WRITE;.        i
1f790 57 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20  Write += nBlk;. 
1f7a0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1f7b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1f7c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f7d0 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42  #if (SQLITE_ENAB
1f7e0 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20  LE_APPLE_SPI>0) 
1f7f0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
1f800 4c 45 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22  LE__).#include "
1f810 73 71 6c 69 74 65 33 5f 70 72 69 76 61 74 65 2e  sqlite3_private.
1f820 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 6f 70  h".#include <cop
1f830 79 66 69 6c 65 2e 68 3e 0a 73 74 61 74 69 63 20  yfile.h>.static 
1f840 69 6e 74 20 67 65 74 44 62 50 61 74 68 46 6f 72  int getDbPathFor
1f850 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
1f860 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a  e *pFile, char *
1f870 64 62 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a  dbPath);.#endif.
1f880 73 74 61 74 69 63 20 69 6e 74 20 69 73 50 72 6f  static int isPro
1f890 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 75 6e  xyLockingMode(un
1f8a0 69 78 46 69 6c 65 20 2a 29 3b 0a 0a 23 69 66 20  ixFile *);..#if 
1f8b0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
1f8c0 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64  PPLE_SPI>0) && d
1f8d0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1f8e0 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  ).static int uni
1f8f0 78 54 72 75 6e 63 61 74 65 44 61 74 61 62 61 73  xTruncateDatabas
1f900 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
1f910 65 2c 20 69 6e 74 20 62 46 6c 61 67 73 29 20 7b  e, int bFlags) {
1f920 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1f930 2a 69 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  *id = (sqlite3_f
1f940 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69  ile *)pFile;.  i
1f950 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1f960 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 4c 6f 63 6b  K;.  void *pLock
1f970 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 66   = NULL;.  int f
1f980 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lags = 0;.  int 
1f990 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b 20  corruptFileLock 
1f9a0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 43 6f 72  = 0;.  int isCor
1f9b0 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20 0a 23  rupt = 0;.    .#
1f9c0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1f9d0 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e  _DATA_PROTECTION
1f9e0 0a 20 20 66 6c 61 67 73 20 7c 3d 20 70 46 69 6c  .  flags |= pFil
1f9f0 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65  e->protFlags;.#e
1fa00 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1fa10 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1fa20 54 59 4c 45 0a 20 20 69 66 28 20 69 73 50 72 6f  TYLE.  if( isPro
1fa30 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 46  xyLockingMode(pF
1fa40 69 6c 65 29 20 29 7b 0a 20 20 20 20 66 6c 61 67  ile) ){.    flag
1fa50 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
1fa60 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20 20 7d 0a  _AUTOPROXY;.  }.
1fa70 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d  #endif.  .  rc =
1fa80 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
1fa90 65 72 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 7a 50  erlock(pFile->zP
1faa0 61 74 68 2c 20 30 2c 20 66 6c 61 67 73 2c 20 30  ath, 0, flags, 0
1fab0 2c 20 30 2c 20 26 70 4c 6f 63 6b 29 3b 0a 20 20  , 0, &pLock);.  
1fac0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
1fad0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  ( rc==SQLITE_COR
1fae0 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  RUPT || rc==SQLI
1faf0 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20 20  TE_NOTADB ){.   
1fb00 20 20 20 69 73 43 6f 72 72 75 70 74 20 3d 20 31     isCorrupt = 1
1fb10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1fb20 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f  ite3demo_superlo
1fb30 63 6b 5f 63 6f 72 72 75 70 74 28 69 64 2c 20 53  ck_corrupt(id, S
1fb40 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55  QLITE_LOCK_EXCLU
1fb50 53 49 56 45 2c 20 26 63 6f 72 72 75 70 74 46 69  SIVE, &corruptFi
1fb60 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20  leLock);.    }. 
1fb70 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1fb80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1fb90 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70    }.  }.  rc = p
1fba0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
1fbb0 54 72 75 6e 63 61 74 65 28 69 64 2c 20 28 28 70  Truncate(id, ((p
1fbc0 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20  File->fsFlags & 
1fbd0 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
1fbe0 53 5f 4d 53 44 4f 53 29 20 21 3d 20 30 29 20 3f  S_MSDOS) != 0) ?
1fbf0 20 31 4c 20 3a 20 30 4c 29 3b 0a 20 20 69 66 28   1L : 0L);.  if(
1fc00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1fc10 7b 0a 20 20 20 20 75 6e 69 78 49 6e 76 61 6c 69  {.    unixInvali
1fc20 64 61 74 65 53 75 70 70 6f 72 74 46 69 6c 65 73  dateSupportFiles
1fc30 28 70 46 69 6c 65 2c 20 30 29 3b 0a 20 20 7d 0a  (pFile, 0);.  }.
1fc40 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
1fc50 2d 3e 78 53 79 6e 63 28 69 64 2c 20 53 51 4c 49  ->xSync(id, SQLI
1fc60 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 29 3b 0a 0a  TE_SYNC_FULL);..
1fc70 0a 20 20 69 66 28 20 69 73 43 6f 72 72 75 70 74  .  if( isCorrupt
1fc80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64   ){.    sqlite3d
1fc90 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f  emo_superunlock_
1fca0 63 6f 72 72 75 70 74 28 69 64 2c 20 63 6f 72 72  corrupt(id, corr
1fcb0 75 70 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20  uptFileLock);.  
1fcc0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1fcd0 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f  e3demo_superunlo
1fce0 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20  ck(pLock);.  }. 
1fcf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
1fd00 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 49 6e  tatic int unixIn
1fd10 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46  validateSupportF
1fd20 69 6c 65 73 28 75 6e 69 78 46 69 6c 65 20 2a 70  iles(unixFile *p
1fd30 46 69 6c 65 2c 20 69 6e 74 20 73 6b 69 70 57 41  File, int skipWA
1fd40 4c 29 20 7b 0a 20 20 63 68 61 72 20 6a 50 61 74  L) {.  char jPat
1fd50 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 39 5d 3b  h[MAXPATHLEN+9];
1fd60 0a 20 20 69 6e 74 20 7a 4c 65 6e 20 3d 20 73 74  .  int zLen = st
1fd70 72 6c 63 70 79 28 6a 50 61 74 68 2c 20 70 46 69  rlcpy(jPath, pFi
1fd80 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41  le->zPath, MAXPA
1fd90 54 48 4c 45 4e 2b 39 29 3b 0a 20 20 69 66 28 20  THLEN+9);.  if( 
1fda0 7a 4c 65 6e 3c 4d 41 58 50 41 54 48 4c 45 4e 20  zLen<MAXPATHLEN 
1fdb0 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6a 4c  ){.    size_t jL
1fdc0 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  en;.    const ch
1fdd0 61 72 20 65 78 74 65 6e 73 69 6f 6e 73 5b 33 5d  ar extensions[3]
1fde0 5b 39 5d 20 3d 20 7b 20 22 2d 77 61 6c 22 2c 20  [9] = { "-wal", 
1fdf0 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 22 2d 73 68  "-journal", "-sh
1fe00 6d 22 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6a 20  m" };.    int j 
1fe10 3d 20 28 73 6b 69 70 57 41 4c 20 3f 20 31 20 3a  = (skipWAL ? 1 :
1fe20 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 20 3b 20   0);.    for( ; 
1fe30 6a 3c 33 3b 20 6a 2b 2b 20 29 7b 0a 20 20 20 20  j<3; j++ ){.    
1fe40 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63    .      /* Chec
1fe50 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1fe60 73 68 6d 20 66 69 6c 65 20 69 73 20 61 6c 72 65  shm file is alre
1fe70 61 64 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 74  ady opened for t
1fe80 68 69 73 20 70 46 69 6c 65 20 2a 2f 0a 20 20 20  his pFile */.   
1fe90 20 20 20 69 66 28 20 6a 3d 3d 32 20 29 7b 0a 20     if( j==2 ){. 
1fea0 20 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72         unixEnter
1feb0 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
1fec0 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
1fed0 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
1fee0 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
1fef0 20 20 20 20 20 20 75 6e 69 78 53 68 6d 4e 6f 64        unixShmNod
1ff00 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46  e *pShmNode = pF
1ff10 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  ile->pInode->pSh
1ff20 6d 4e 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69  mNode;.        i
1ff30 66 28 20 70 53 68 6d 4e 6f 64 65 20 26 26 20 21  f( pShmNode && !
1ff40 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
1ff50 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  only ){.        
1ff60 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
1ff70 74 61 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73  tat;.          s
1ff80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1ff90 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1ffa0 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a  ex);.          .
1ffb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
1ffc0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 26 26 20  hmNode->h>=0 && 
1ffd0 21 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64  !osFstat(pShmNod
1ffe0 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  e->h, &sStat) ){
1fff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73  .            uns
20000 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 7a 65 20  igned long size 
20010 3d 20 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  = (sStat.st_size
20020 3c 34 29 20 3f 20 73 53 74 61 74 2e 73 74 5f 73  <4) ? sStat.st_s
20030 69 7a 65 20 3a 20 34 3b 0a 20 20 20 20 20 20 20  ize : 4;.       
20040 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 30 20       if( size>0 
20050 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
20060 20 62 7a 65 72 6f 28 70 53 68 6d 4e 6f 64 65 2d   bzero(pShmNode-
20070 3e 61 70 52 65 67 69 6f 6e 5b 30 5d 2c 20 73 69  >apRegion[0], si
20080 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ze);.           
20090 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
200a0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
200b0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20  >mutex);.       
200c0 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65         unixLeave
200d0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20  Mutex();.       
200e0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
200f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
20100 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20110 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
20120 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
20130 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  e->mutex);.     
20140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 6e 69     }.        uni
20150 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
20160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 4c 65       }.      jLe
20170 6e 20 3d 20 73 74 72 6c 63 70 79 28 26 6a 50 61  n = strlcpy(&jPa
20180 74 68 5b 7a 4c 65 6e 5d 2c 20 65 78 74 65 6e 73  th[zLen], extens
20190 69 6f 6e 73 5b 6a 5d 2c 20 39 29 3b 0a 20 20 20  ions[j], 9);.   
201a0 20 20 20 69 66 28 20 6a 4c 65 6e 20 3c 20 39 20     if( jLen < 9 
201b0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
201c0 66 6c 61 67 73 20 3d 20 28 6a 3c 32 29 20 3f 20  flags = (j<2) ? 
201d0 4f 5f 54 52 55 4e 43 20 3a 20 4f 5f 52 44 57 52  O_TRUNC : O_RDWR
201e0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 66  ;.        int jf
201f0 64 20 3d 20 6f 70 65 6e 28 6a 50 61 74 68 2c 20  d = open(jPath, 
20200 6a 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  jflags);.       
20210 20 69 66 28 20 6a 66 64 3d 3d 28 2d 31 29 20 29   if( jfd==(-1) )
20220 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
20230 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
20240 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 65 72  .            per
20250 72 6f 72 28 6a 50 61 74 68 29 3b 0a 20 20 20 20  ror(jPath);.    
20260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20270 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
20280 20 20 20 69 66 28 20 6a 3d 3d 32 20 29 7b 0a 20     if( j==2 ){. 
20290 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
202a0 74 20 73 74 61 74 20 73 53 74 61 74 3b 0a 20 20  t stat sStat;.  
202b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6f            if( !o
202c0 73 46 73 74 61 74 28 6a 66 64 2c 20 26 73 53 74  sFstat(jfd, &sSt
202d0 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  at) ){.         
202e0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f       unsigned lo
202f0 6e 67 20 73 69 7a 65 20 3d 20 28 73 53 74 61 74  ng size = (sStat
20300 2e 73 74 5f 73 69 7a 65 3c 34 29 20 3f 20 73 53  .st_size<4) ? sS
20310 74 61 74 2e 73 74 5f 73 69 7a 65 20 3a 20 34 3b  tat.st_size : 4;
20320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
20330 66 28 20 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20  f( size>0 ){.   
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 75 69 6e               uin
20350 74 33 32 5f 74 20 7a 65 72 6f 20 3d 20 30 3b 0a  t32_t zero = 0;.
20360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20370 70 77 72 69 74 65 28 6a 66 64 2c 20 26 7a 65 72  pwrite(jfd, &zer
20380 6f 2c 20 28 73 69 7a 65 5f 74 29 73 69 7a 65 2c  o, (size_t)size,
20390 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
203a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
203b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
203c0 20 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 6a           fsync(j
203d0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  fd);.          c
203e0 6c 6f 73 65 28 6a 66 64 29 3b 0a 20 20 20 20 20  lose(jfd);.     
203f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
20400 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
20410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
20420 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 70  atic int unixRep
20430 6c 61 63 65 44 61 74 61 62 61 73 65 28 75 6e 69  laceDatabase(uni
20440 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71  xFile *pFile, sq
20450 6c 69 74 65 33 20 2a 73 72 63 64 62 29 20 7b 0a  lite3 *srcdb) {.
20460 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
20470 69 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  id = (sqlite3_fi
20480 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 42 74  le *)pFile;.  Bt
20490 72 65 65 20 2a 70 53 72 63 42 74 72 65 65 20 3d  ree *pSrcBtree =
204a0 20 4e 55 4c 4c 3b 0a 20 20 73 71 6c 69 74 65 33   NULL;.  sqlite3
204b0 5f 66 69 6c 65 20 2a 73 72 63 5f 66 69 6c 65 20  _file *src_file 
204c0 3d 20 4e 55 4c 4c 3b 0a 20 20 75 6e 69 78 46 69  = NULL;.  unixFi
204d0 6c 65 20 2a 70 53 72 63 46 69 6c 65 20 3d 20 4e  le *pSrcFile = N
204e0 55 4c 4c 3b 0a 20 20 63 68 61 72 20 73 72 63 57  ULL;.  char srcW
204f0 61 6c 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  alPath[MAXPATHLE
20500 4e 2b 35 5d 3b 0a 20 20 69 6e 74 20 73 72 63 57  N+5];.  int srcW
20510 61 6c 46 44 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  alFD = -1;.  int
20520 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20530 0a 20 20 76 6f 69 64 20 2a 70 4c 6f 63 6b 20 3d  .  void *pLock =
20540 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 66 6c 61   NULL;.  int fla
20550 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  gs = 0;.  sqlite
20560 33 20 2a 73 72 63 64 62 32 20 3d 20 4e 55 4c 4c  3 *srcdb2 = NULL
20570 3b 0a 20 20 63 6f 70 79 66 69 6c 65 5f 73 74 61  ;.  copyfile_sta
20580 74 65 5f 74 20 73 3b 0a 20 20 69 6e 74 20 63 6f  te_t s;.  int co
20590 72 72 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b  rruptSrcFileLock
205a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6f 72 72   = 0;.  int corr
205b0 75 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b 20 3d  uptDstFileLock =
205c0 20 30 3b 0a 20 20 69 6e 74 20 69 73 53 72 63 43   0;.  int isSrcC
205d0 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 69 6e  orrupt = 0;.  in
205e0 74 20 69 73 44 73 74 43 6f 72 72 75 70 74 20 3d  t isDstCorrupt =
205f0 20 30 3b 0a 20 20 0a 20 20 69 66 28 20 21 73 71   0;.  .  if( !sq
20600 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
20610 4f 6b 28 73 72 63 64 62 29 20 29 7b 0a 20 20 20  Ok(srcdb) ){.   
20620 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
20630 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 20 20 0a  ISUSE;.  }.    .
20640 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
20650 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f  E_DATA_PROTECTIO
20660 4e 0a 20 20 66 6c 61 67 73 20 7c 3d 20 70 46 69  N.  flags |= pFi
20670 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b 0a 23  le->protFlags;.#
20680 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
20690 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
206a0 53 54 59 4c 45 0a 20 20 69 66 28 20 69 73 50 72  STYLE.  if( isPr
206b0 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  oxyLockingMode(p
206c0 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 66 6c 61  File) ){.    fla
206d0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
206e0 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20 20 7d  N_AUTOPROXY;.  }
206f0 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20  .#endif.  .  rc 
20700 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  = sqlite3demo_su
20710 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 7a  perlock(pFile->z
20720 50 61 74 68 2c 20 30 2c 20 66 6c 61 67 73 2c 20  Path, 0, flags, 
20730 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29 3b 0a 20  0, 0, &pLock);. 
20740 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
20750 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  f( rc==SQLITE_CO
20760 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c  RRUPT || rc==SQL
20770 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20  ITE_NOTADB ){.  
20780 20 20 20 20 69 73 44 73 74 43 6f 72 72 75 70 74      isDstCorrupt
20790 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
207a0 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
207b0 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69  erlock_corrupt(i
207c0 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45  d, SQLITE_LOCK_E
207d0 58 43 4c 55 53 49 56 45 2c 20 26 63 6f 72 72 75  XCLUSIVE, &corru
207e0 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a  ptDstFileLock);.
207f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
20800 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20810 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
20820 20 2f 2a 20 67 65 74 20 74 68 65 20 73 72 63 20   /* get the src 
20830 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
20840 61 64 68 65 72 69 6e 67 20 74 6f 20 74 68 65 20  adhering to the 
20850 64 62 20 73 74 72 75 63 74 20 61 63 63 65 73 73  db struct access
20860 20 72 75 6c 65 73 20 0a 20 20 20 2a 2a 20 74 68   rules .   ** th
20870 69 73 20 63 6f 64 65 20 69 73 20 6d 6f 64 65 6c  is code is model
20880 65 64 20 61 66 74 65 72 20 73 71 6c 69 74 65 33  ed after sqlite3
20890 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20  _file_control() 
208a0 69 6e 20 6d 61 69 6e 2e 63 0a 20 20 20 2a 2f 20  in main.c.   */ 
208b0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
208c0 5f 65 6e 74 65 72 28 73 72 63 64 62 2d 3e 6d 75  _enter(srcdb->mu
208d0 74 65 78 29 3b 0a 20 20 69 66 28 20 73 72 63 64  tex);.  if( srcd
208e0 62 2d 3e 6e 44 62 3e 30 20 29 7b 0a 20 20 20 20  b->nDb>0 ){.    
208f0 70 53 72 63 42 74 72 65 65 20 3d 20 73 72 63 64  pSrcBtree = srcd
20900 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3b 0a 20  b->aDb[0].pBt;. 
20910 20 7d 0a 20 20 69 66 28 20 70 53 72 63 42 74 72   }.  if( pSrcBtr
20920 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  ee ){.    Pager 
20930 2a 70 53 72 63 50 61 67 65 72 3b 0a 20 20 20 20  *pSrcPager;.    
20940 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
20950 72 28 70 53 72 63 42 74 72 65 65 29 3b 0a 20 20  r(pSrcBtree);.  
20960 20 20 70 53 72 63 50 61 67 65 72 20 3d 20 73 71    pSrcPager = sq
20970 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
20980 70 53 72 63 42 74 72 65 65 29 3b 0a 20 20 20 20  pSrcBtree);.    
20990 61 73 73 65 72 74 28 20 70 53 72 63 50 61 67 65  assert( pSrcPage
209a0 72 21 3d 30 20 29 3b 0a 20 20 20 20 73 72 63 5f  r!=0 );.    src_
209b0 66 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61  file = sqlite3Pa
209c0 67 65 72 46 69 6c 65 28 70 53 72 63 50 61 67 65  gerFile(pSrcPage
209d0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
209e0 73 72 63 5f 66 69 6c 65 21 3d 30 20 29 3b 0a 20  src_file!=0 );. 
209f0 20 20 20 69 66 28 20 73 72 63 5f 66 69 6c 65 2d     if( src_file-
20a00 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
20a10 20 20 20 69 6e 74 20 73 72 63 46 6c 61 67 73 20     int srcFlags 
20a20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 72 63 46  = 0;.      pSrcF
20a30 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
20a40 2a 29 73 72 63 5f 66 69 6c 65 3b 0a 20 20 20 20  *)src_file;.    
20a50 20 20 2f 2a 20 77 61 6c 20 6d 6f 64 65 20 64 62    /* wal mode db
20a60 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
20a70 64 20 72 65 61 64 6f 6e 6c 79 20 2a 2f 0a 20 20  d readonly */.  
20a80 20 20 20 20 69 66 20 28 28 70 53 72 63 46 69 6c      if ((pSrcFil
20a90 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f  e->openFlags & O
20aa0 5f 52 44 57 52 29 20 3d 3d 20 4f 5f 52 44 57 52  _RDWR) == O_RDWR
20ab0 29 20 7b 0a 20 20 20 20 20 20 20 20 73 72 63 46  ) {.        srcF
20ac0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
20ad0 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  EN_READWRITE;.  
20ae0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
20af0 20 20 20 20 20 73 72 63 46 6c 61 67 73 20 3d 20       srcFlags = 
20b00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
20b10 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 23 69  ONLY;.      }.#i
20b20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20b30 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a  DATA_PROTECTION.
20b40 20 20 20 20 20 20 73 72 63 46 6c 61 67 73 20 7c        srcFlags |
20b50 3d 20 70 53 72 63 46 69 6c 65 2d 3e 70 72 6f 74  = pSrcFile->prot
20b60 46 6c 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23 69  Flags;.#endif.#i
20b70 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20b80 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
20b90 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 4c      if( isProxyL
20ba0 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 53 72 63 46  ockingMode(pSrcF
20bb0 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ile) ){.        
20bc0 73 72 63 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  srcFlags |= SQLI
20bd0 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
20be0 59 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  Y;.      }.#endi
20bf0 66 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  f.      rc = sql
20c00 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70 53 72  ite3_open_v2(pSr
20c10 63 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 73  cFile->zPath, &s
20c20 72 63 64 62 32 2c 20 73 72 63 46 6c 61 67 73 2c  rcdb2, srcFlags,
20c30 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
20c40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20c50 20 20 20 20 20 20 20 20 2f 2a 20 73 74 61 72 74          /* start
20c60 20 61 20 64 65 66 65 72 72 65 64 20 74 72 61 6e   a deferred tran
20c70 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 61 64  saction and read
20c80 20 74 6f 20 65 73 74 61 62 6c 69 73 68 20 61 20   to establish a 
20c90 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read lock */.   
20ca0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20cb0 33 5f 65 78 65 63 28 73 72 63 64 62 32 2c 20 22  3_exec(srcdb2, "
20cc0 42 45 47 49 4e 20 44 45 46 45 52 52 45 44 3b 20  BEGIN DEFERRED; 
20cd0 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65  PRAGMA schema_ve
20ce0 72 73 69 6f 6e 22 2c 20 30 2c 20 30 2c 20 30 29  rsion", 0, 0, 0)
20cf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
20d00 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
20d10 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
20d20 4f 54 41 44 42 20 29 7b 0a 20 20 20 20 20 20 20  OTADB ){.       
20d30 20 20 20 69 73 53 72 63 43 6f 72 72 75 70 74 20     isSrcCorrupt 
20d40 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 1;.          r
20d50 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  c = sqlite3demo_
20d60 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70  superlock_corrup
20d70 74 28 73 72 63 5f 66 69 6c 65 2c 20 53 51 4c 49  t(src_file, SQLI
20d80 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 2c 20  TE_LOCK_SHARED, 
20d90 26 63 6f 72 72 75 70 74 53 72 63 46 69 6c 65 4c  &corruptSrcFileL
20da0 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ock);.        }.
20db0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20dc0 7d 0a 20 20 69 66 28 20 21 73 72 63 64 62 32 20  }.  if( !srcdb2 
20dd0 7c 7c 20 70 53 72 63 46 69 6c 65 3d 3d 4e 55 4c  || pSrcFile==NUL
20de0 4c 20 7c 7c 20 70 53 72 63 46 69 6c 65 2d 3e 68  L || pSrcFile->h
20df0 3c 30 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  <0){.    rc = SQ
20e00 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20  LITE_INTERNAL;. 
20e10 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
20e20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
20e30 74 6f 20 65 6e 64 5f 72 65 70 6c 61 63 65 5f 64  to end_replace_d
20e40 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20 2f  atabase;.  }.  /
20e50 2a 20 62 6f 74 68 20 64 61 74 61 62 61 73 65 73  * both databases
20e60 20 61 72 65 20 6c 6f 63 6b 65 64 20 61 70 70 72   are locked appr
20e70 6f 70 72 69 61 74 65 6c 79 2c 20 63 6f 70 79 20  opriately, copy 
20e80 74 68 65 20 73 72 63 20 77 61 6c 20 6a 6f 75 72  the src wal jour
20e90 6e 61 6c 20 69 66 20 0a 20 20 20 2a 2a 20 6f 6e  nal if .   ** on
20ea0 65 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65  e exists and the
20eb0 6e 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74  n the actual dat
20ec0 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 2a 2f  abase file.   */
20ed0 0a 20 20 73 74 72 6c 63 70 79 28 73 72 63 57 61  .  strlcpy(srcWa
20ee0 6c 50 61 74 68 2c 20 70 53 72 63 46 69 6c 65 2d  lPath, pSrcFile-
20ef0 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  >zPath, MAXPATHL
20f00 45 4e 2b 35 29 3b 0a 20 20 73 74 72 6c 63 61 74  EN+5);.  strlcat
20f10 28 73 72 63 57 61 6c 50 61 74 68 2c 20 22 2d 77  (srcWalPath, "-w
20f20 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b  al", MAXPATHLEN+
20f30 35 29 3b 0a 20 20 73 72 63 57 61 6c 46 44 20 3d  5);.  srcWalFD =
20f40 20 6f 70 65 6e 28 73 72 63 57 61 6c 50 61 74 68   open(srcWalPath
20f50 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 69  , O_RDONLY);.  i
20f60 66 28 20 21 28 73 72 63 57 61 6c 46 44 3c 30 29  f( !(srcWalFD<0)
20f70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 64 73 74   ){.    char dst
20f80 57 61 6c 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  WalPath[MAXPATHL
20f90 45 4e 2b 35 5d 3b 0a 20 20 20 20 69 6e 74 20 64  EN+5];.    int d
20fa0 73 74 57 61 6c 46 44 20 3d 20 2d 31 3b 0a 20 20  stWalFD = -1;.  
20fb0 20 20 73 74 72 6c 63 70 79 28 64 73 74 57 61 6c    strlcpy(dstWal
20fc0 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  Path, pFile->zPa
20fd0 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35  th, MAXPATHLEN+5
20fe0 29 3b 0a 20 20 20 20 73 74 72 6c 63 61 74 28 64  );.    strlcat(d
20ff0 73 74 57 61 6c 50 61 74 68 2c 20 22 2d 77 61 6c  stWalPath, "-wal
21000 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29  ", MAXPATHLEN+5)
21010 3b 0a 20 20 20 20 64 73 74 57 61 6c 46 44 20 3d  ;.    dstWalFD =
21020 20 6f 70 65 6e 28 64 73 74 57 61 6c 50 61 74 68   open(dstWalPath
21030 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
21040 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
21050 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
21060 53 29 3b 0a 20 20 20 20 69 66 28 20 21 28 64 73  S);.    if( !(ds
21070 74 57 61 6c 46 44 3c 30 29 20 29 7b 0a 20 20 20  tWalFD<0) ){.   
21080 20 20 20 73 20 3d 20 63 6f 70 79 66 69 6c 65 5f     s = copyfile_
21090 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20  state_alloc();. 
210a0 20 20 20 20 20 6c 73 65 65 6b 28 73 72 63 57 61       lseek(srcWa
210b0 6c 46 44 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54  lFD, 0, SEEK_SET
210c0 29 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 64  );.      lseek(d
210d0 73 74 57 61 6c 46 44 2c 20 30 2c 20 53 45 45 4b  stWalFD, 0, SEEK
210e0 5f 53 45 54 29 3b 0a 20 20 20 20 20 20 69 66 28  _SET);.      if(
210f0 20 66 63 6f 70 79 66 69 6c 65 28 73 72 63 57 61   fcopyfile(srcWa
21100 6c 46 44 2c 20 64 73 74 57 61 6c 46 44 2c 20 73  lFD, dstWalFD, s
21110 2c 20 43 4f 50 59 46 49 4c 45 5f 41 4c 4c 29 20  , COPYFILE_ALL) 
21120 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  ){.        int e
21130 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
21140 20 20 73 77 69 74 63 68 28 65 72 72 29 20 7b 0a    switch(err) {.
21150 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 45            case E
21160 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20 20  NOMEM:.         
21170 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
21180 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
21190 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
211a0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
211b0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
211c0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 3b 0a  astErrno = err;.
211d0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
211e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
211f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21200 0a 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f  .      copyfile_
21210 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a 20  state_free(s);. 
21220 20 20 20 20 20 63 6c 6f 73 65 28 64 73 74 57 61       close(dstWa
21230 6c 46 44 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lFD);.    }.    
21240 63 6c 6f 73 65 28 73 72 63 57 61 6c 46 44 29 3b  close(srcWalFD);
21250 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
21260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21270 2f 2a 20 62 65 66 6f 72 65 20 77 65 20 63 6f 70  /* before we cop
21280 79 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  y, ensure that t
21290 68 65 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63  he file change c
212a0 6f 75 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 6d  ounter will be m
212b0 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 75  odified */.    u
212c0 69 6e 74 33 32 5f 74 20 73 72 63 43 68 61 6e 67  int32_t srcChang
212d0 65 20 3d 20 30 3b 0a 20 20 20 20 75 69 6e 74 33  e = 0;.    uint3
212e0 32 5f 74 20 64 73 74 43 68 61 6e 67 65 20 3d 20  2_t dstChange = 
212f0 30 3b 0a 20 20 20 20 70 72 65 61 64 28 70 53 72  0;.    pread(pSr
21300 63 46 69 6c 65 2d 3e 68 2c 20 26 73 72 63 43 68  cFile->h, &srcCh
21310 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20  ange, 4, 24);.  
21320 20 20 70 72 65 61 64 28 70 46 69 6c 65 2d 3e 68    pread(pFile->h
21330 2c 20 26 64 73 74 43 68 61 6e 67 65 2c 20 34 2c  , &dstChange, 4,
21340 20 32 34 29 3b 0a 20 20 20 20 0a 20 20 20 20 2f   24);.    .    /
21350 2a 20 63 6f 70 79 20 74 68 65 20 61 63 74 75 61  * copy the actua
21360 6c 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  l database */.  
21370 20 20 73 20 3d 20 63 6f 70 79 66 69 6c 65 5f 73    s = copyfile_s
21380 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20  tate_alloc();.  
21390 20 20 6c 73 65 65 6b 28 70 53 72 63 46 69 6c 65    lseek(pSrcFile
213a0 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54  ->h, 0, SEEK_SET
213b0 29 3b 0a 20 20 20 20 6c 73 65 65 6b 28 70 46 69  );.    lseek(pFi
213c0 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53  le->h, 0, SEEK_S
213d0 45 54 29 3b 0a 20 20 20 20 69 66 28 20 66 63 6f  ET);.    if( fco
213e0 70 79 66 69 6c 65 28 70 53 72 63 46 69 6c 65 2d  pyfile(pSrcFile-
213f0 3e 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 2c  >h, pFile->h, s,
21400 20 43 4f 50 59 46 49 4c 45 5f 41 4c 4c 29 20 29   COPYFILE_ALL) )
21410 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d  {.      int err=
21420 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 73 77 69  errno;.      swi
21430 74 63 68 28 65 72 72 29 20 7b 0a 20 20 20 20 20  tch(err) {.     
21440 20 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a     case ENOMEM:.
21450 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
21460 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
21470 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21480 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
21490 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
214a0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 3b  lastErrno = err;
214b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
214c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
214d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
214e0 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66  copyfile_state_f
214f0 72 65 65 28 73 29 3b 0a 20 20 20 20 0a 20 20 20  ree(s);.    .   
21500 20 69 66 20 28 73 72 63 43 68 61 6e 67 65 20 3d   if (srcChange =
21510 3d 20 64 73 74 43 68 61 6e 67 65 29 20 7b 0a 20  = dstChange) {. 
21520 20 20 20 20 20 2f 2a 20 6d 6f 64 69 66 79 20 74       /* modify t
21530 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
21540 72 20 74 6f 20 66 6f 72 63 65 20 70 61 67 65 20  r to force page 
21550 7a 65 72 6f 20 74 6f 20 62 65 20 72 65 6c 6f 61  zero to be reloa
21560 64 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 73 74  ded */.      dst
21570 43 68 61 6e 67 65 20 2b 2b 3b 0a 20 20 20 20 20  Change ++;.     
21580 20 70 77 72 69 74 65 28 70 46 69 6c 65 2d 3e 68   pwrite(pFile->h
21590 2c 20 26 64 73 74 43 68 61 6e 67 65 2c 20 34 2c  , &dstChange, 4,
215a0 20 32 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   24);.    }.  }.
215b0 20 20 69 66 28 20 69 73 53 72 63 43 6f 72 72 75    if( isSrcCorru
215c0 70 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pt ){.    sqlite
215d0 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63  3demo_superunloc
215e0 6b 5f 63 6f 72 72 75 70 74 28 73 72 63 5f 66 69  k_corrupt(src_fi
215f0 6c 65 2c 20 63 6f 72 72 75 70 74 53 72 63 46 69  le, corruptSrcFi
21600 6c 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65  leLock);.  }else
21610 7b 0a 20 20 20 20 2f 2a 20 64 6f 6e 65 20 77 69  {.    /* done wi
21620 74 68 20 74 68 65 20 73 6f 75 72 63 65 20 64 62  th the source db
21630 20 73 6f 20 65 6e 64 20 74 68 65 20 74 72 61 6e   so end the tran
21640 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 73  saction */.    s
21650 71 6c 69 74 65 33 5f 65 78 65 63 28 73 72 63 64  qlite3_exec(srcd
21660 62 32 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  b2, "COMMIT", 0,
21670 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a   0, 0);.  }.  /*
21680 20 7a 65 72 6f 20 6f 75 74 20 61 6e 79 20 6f 6c   zero out any ol
21690 64 20 6a 6f 75 72 6e 61 6c 20 63 6c 75 74 74 65  d journal clutte
216a0 72 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  r */.  if( rc==S
216b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
216c0 69 6e 74 20 73 6b 69 70 57 41 4c 20 3d 20 28 73  int skipWAL = (s
216d0 72 63 57 61 6c 46 44 3c 30 29 3f 30 3a 31 3b 0a  rcWalFD<0)?0:1;.
216e0 20 20 20 20 75 6e 69 78 49 6e 76 61 6c 69 64 61      unixInvalida
216f0 74 65 53 75 70 70 6f 72 74 46 69 6c 65 73 28 70  teSupportFiles(p
21700 46 69 6c 65 2c 20 73 6b 69 70 57 41 4c 29 3b 0a  File, skipWAL);.
21710 20 20 7d 0a 20 20 0a 65 6e 64 5f 72 65 70 6c 61    }.  .end_repla
21720 63 65 5f 64 61 74 61 62 61 73 65 3a 0a 20 20 69  ce_database:.  i
21730 66 28 20 70 53 72 63 42 74 72 65 65 20 29 7b 0a  f( pSrcBtree ){.
21740 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
21750 65 28 73 72 63 64 62 32 29 3b 0a 20 20 20 20 73  e(srcdb2);.    s
21760 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
21770 28 70 53 72 63 42 74 72 65 65 29 3b 0a 20 20 7d  (pSrcBtree);.  }
21780 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
21790 5f 6c 65 61 76 65 28 73 72 63 64 62 2d 3e 6d 75  _leave(srcdb->mu
217a0 74 65 78 29 3b 0a 20 20 69 66 28 20 69 73 44 73  tex);.  if( isDs
217b0 74 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20  tCorrupt ){.    
217c0 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
217d0 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28  runlock_corrupt(
217e0 69 64 2c 20 63 6f 72 72 75 70 74 44 73 74 46 69  id, corruptDstFi
217f0 6c 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65  leLock);.  }else
21800 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d  {.    sqlite3dem
21810 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c  o_superunlock(pL
21820 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ock);.  }.  retu
21830 72 6e 20 72 63 3b 0a 7d 0a 23 64 65 66 69 6e 65  rn rc;.}.#define
21840 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41   SQLITE_FILE_HEA
21850 44 45 52 5f 4c 45 4e 20 31 36 0a 23 69 6e 63 6c  DER_LEN 16.#incl
21860 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
21870 0a 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20  ./* Check for a 
21880 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
21890 2e 20 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  .  If one is fou
218a0 6e 64 2c 20 70 72 69 6e 74 20 61 6e 20 74 68 69  nd, print an thi
218b0 73 0a 20 2a 2a 20 6f 6e 20 73 74 61 6e 64 61 72  s. ** on standar
218c0 64 20 6f 75 74 70 75 74 20 75 73 69 6e 67 20 74  d output using t
218d0 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  he format string
218e0 20 67 69 76 65 6e 20 61 6e 64 20 72 65 74 75 72   given and retur
218f0 6e 20 31 2e 0a 20 2a 2a 20 49 66 20 74 68 65 72  n 1.. ** If ther
21900 65 20 61 72 65 20 6e 6f 20 63 6f 6e 66 6c 69 63  e are no conflic
21910 74 69 6e 67 20 6c 6f 63 6b 73 2c 20 72 65 74 75  ting locks, retu
21920 72 6e 20 30 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  rn 0.. */.static
21930 20 69 6e 74 20 75 6e 69 78 49 73 4c 6f 63 6b 65   int unixIsLocke
21940 64 28 0a 20 20 70 69 64 5f 74 20 70 69 64 2c 20  d(.  pid_t pid, 
21950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 49             /* PI
21960 44 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6c 6f  D to test for lo
21970 63 6b 20 6f 77 6e 65 72 20 2a 2f 0a 20 20 69 6e  ck owner */.  in
21980 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  t h,            
21990 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
219a0 72 69 70 74 6f 72 20 74 6f 20 63 68 65 63 6b 20  riptor to check 
219b0 2a 2f 0a 20 20 69 6e 74 20 74 79 70 65 2c 20 20  */.  int type,  
219c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f             /* F_
219d0 52 44 4c 43 4b 20 6f 72 20 46 5f 57 52 4c 43 4b  RDLCK or F_WRLCK
219e0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
219f0 6e 74 20 69 4f 66 73 74 2c 20 20 20 2f 2a 20 46  nt iOfst,   /* F
21a00 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
21a10 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
21a20 6e 65 64 20 69 6e 74 20 69 43 6e 74 2c 20 20 20  ned int iCnt,   
21a30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
21a40 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 20  tes in the lock 
21a50 72 61 6e 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  range */.  const
21a60 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20   char *zType    
21a70 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b   /* Type of lock
21a80 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
21a90 66 6c 6f 63 6b 20 6c 6b 3b 0a 20 20 69 6e 74 20  flock lk;.  int 
21aa0 65 72 72 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74  err;.  .  memset
21ab0 28 26 6c 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&lk, 0, sizeof(
21ac0 6c 6b 29 29 3b 0a 20 20 6c 6b 2e 6c 5f 74 79 70  lk));.  lk.l_typ
21ad0 65 20 3d 20 74 79 70 65 3b 0a 20 20 6c 6b 2e 6c  e = type;.  lk.l
21ae0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
21af0 45 54 3b 0a 20 20 6c 6b 2e 6c 5f 73 74 61 72 74  ET;.  lk.l_start
21b00 20 3d 20 69 4f 66 73 74 3b 0a 20 20 6c 6b 2e 6c   = iOfst;.  lk.l
21b10 5f 6c 65 6e 20 3d 20 69 43 6e 74 3b 0a 20 20 0a  _len = iCnt;.  .
21b20 20 20 69 66 28 20 70 69 64 21 3d 53 51 4c 49 54    if( pid!=SQLIT
21b30 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 41 4e 59 50  E_LOCKSTATE_ANYP
21b40 49 44 20 29 7b 0a 23 69 66 6e 64 65 66 20 46 5f  ID ){.#ifndef F_
21b50 47 45 54 4c 4b 50 49 44 0a 23 20 77 61 72 6e 69  GETLKPID.# warni
21b60 6e 67 20 46 5f 47 45 54 4c 4b 50 49 44 20 75 6e  ng F_GETLKPID un
21b70 64 65 66 69 6e 65 64 2c 20 5f 73 71 6c 69 74 65  defined, _sqlite
21b80 33 5f 6c 6f 63 6b 73 74 61 74 65 20 66 61 6c 6c  3_lockstate fall
21b90 69 6e 67 20 62 61 63 6b 20 74 6f 20 46 5f 47 45  ing back to F_GE
21ba0 54 4c 4b 0a 20 20 20 20 65 72 72 20 3d 20 66 63  TLK.    err = fc
21bb0 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ntl(h, F_GETLK, 
21bc0 26 6c 6b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  &lk);.#else.    
21bd0 6c 6b 2e 6c 5f 70 69 64 20 3d 20 70 69 64 3b 0a  lk.l_pid = pid;.
21be0 20 20 20 20 65 72 72 20 3d 20 66 63 6e 74 6c 28      err = fcntl(
21bf0 68 2c 20 46 5f 47 45 54 4c 4b 50 49 44 2c 20 26  h, F_GETLKPID, &
21c00 6c 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  lk);.#endif.  }e
21c10 6c 73 65 7b 0a 20 20 20 20 65 72 72 20 3d 20 66  lse{.    err = f
21c20 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 2c  cntl(h, F_GETLK,
21c30 20 26 6c 6b 29 3b 0a 20 20 7d 0a 20 20 0a 20 20   &lk);.  }.  .  
21c40 69 66 28 20 65 72 72 3d 3d 28 2d 31 29 20 29 7b  if( err==(-1) ){
21c50 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
21c60 65 72 72 2c 20 22 66 63 6e 74 6c 28 25 64 29 20  err, "fcntl(%d) 
21c70 66 61 69 6c 65 64 3a 20 65 72 72 6e 6f 3d 25 64  failed: errno=%d
21c80 5c 6e 22 2c 20 68 2c 20 65 72 72 6e 6f 29 3b 0a  \n", h, errno);.
21c90 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
21ca0 20 7d 0a 20 20 0a 20 20 69 66 28 20 6c 6b 2e 6c   }.  .  if( lk.l
21cb0 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 26  _type!=F_UNLCK &
21cc0 26 20 28 70 69 64 3d 3d 53 51 4c 49 54 45 5f 4c  & (pid==SQLITE_L
21cd0 4f 43 4b 53 54 41 54 45 5f 41 4e 59 50 49 44 20  OCKSTATE_ANYPID 
21ce0 7c 7c 20 6c 6b 2e 6c 5f 70 69 64 3d 3d 70 69 64  || lk.l_pid==pid
21cf0 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) ){.#ifdef SQLI
21d00 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66 70 72  TE_DEBUG.    fpr
21d10 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
21d20 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 25 64   lock held by %d
21d30 5c 6e 22 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  \n", zType, (int
21d40 29 6c 6b 2e 6c 5f 70 69 64 29 3b 0a 23 65 6e 64  )lk.l_pid);.#end
21d50 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  if.    return 1;
21d60 0a 20 20 7d 20 0a 20 20 72 65 74 75 72 6e 20 30  .  } .  return 0
21d70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
21d80 74 65 73 74 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  test only works 
21d90 66 6f 72 20 6c 6f 63 6b 20 74 65 73 74 69 6e 67  for lock testing
21da0 20 6f 6e 20 75 6e 69 78 2f 70 6f 73 69 78 20 56   on unix/posix V
21db0 46 53 2e 0a 2a 2a 20 41 64 61 70 74 65 64 20 66  FS..** Adapted f
21dc0 72 6f 6d 20 74 6f 6f 6c 2f 67 65 74 6c 6f 63 6b  rom tool/getlock
21dd0 2e 63 20 66 34 63 33 39 62 36 35 31 33 37 30 31  .c f4c39b6513701
21de0 35 36 63 61 65 39 37 39 35 30 31 61 37 62 31 35  56cae979501a7b15
21df0 36 62 64 62 61 35 30 65 37 63 65 0a 2a 2f 0a 73  6bdba50e7ce.*/.s
21e00 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
21e10 63 6b 73 74 61 74 65 50 69 64 28 75 6e 69 78 46  ckstatePid(unixF
21e20 69 6c 65 20 2a 70 46 69 6c 65 2c 20 70 69 64 5f  ile *pFile, pid_
21e30 74 20 70 69 64 2c 20 69 6e 74 20 2a 70 4c 6f 63  t pid, int *pLoc
21e40 6b 73 74 61 74 65 29 7b 0a 20 20 69 6e 74 20 68  kstate){.  int h
21e50 44 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  Db;        /* Fi
21e60 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
21e70 72 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  r the open datab
21e80 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
21e90 74 20 68 53 68 6d 20 3d 20 2d 31 3b 20 20 2f 2a  t hShm = -1;  /*
21ea0 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
21eb0 20 66 6f 72 20 57 41 4c 20 73 68 61 72 65 64 2d   for WAL shared-
21ec0 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
21ed0 20 73 73 69 7a 65 5f 74 20 67 6f 74 3b 20 20 20   ssize_t got;   
21ee0 20 2f 2a 20 42 79 74 65 73 20 72 65 61 64 20 66   /* Bytes read f
21ef0 72 6f 6d 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  rom header */.  
21f00 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20  int isWal;      
21f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
21f20 75 65 20 69 66 20 69 6e 20 57 41 4c 20 6d 6f 64  ue if in WAL mod
21f30 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
21f40 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21f50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
21f60 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
21f70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 48 64  nsigned char aHd
21f80 72 5b 31 30 30 5d 3b 20 20 20 2f 2a 20 44 61 74  r[100];   /* Dat
21f90 61 62 61 73 65 20 68 65 61 64 65 72 20 2a 2f 0a  abase header */.
21fa0 20 20 0a 20 20 61 73 73 65 72 74 28 70 4c 6f 63    .  assert(pLoc
21fb0 6b 73 74 61 74 65 29 3b 0a 20 20 0a 20 20 2f 2a  kstate);.  .  /*
21fc0 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 61 72   make sure we ar
21fd0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
21fe0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
21ff0 2f 0a 20 20 68 44 62 20 3d 20 70 46 69 6c 65 2d  /.  hDb = pFile-
22000 3e 68 3b 0a 20 20 69 66 28 20 68 44 62 3c 30 20  >h;.  if( hDb<0 
22010 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61  ){.    *pLocksta
22020 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  te = SQLITE_LOCK
22030 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  STATE_ERROR;.   
22040 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
22050 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65  RROR;.  }.  asse
22060 72 74 28 20 28 73 74 72 6c 65 6e 28 53 51 4c 49  rt( (strlen(SQLI
22070 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 29 2b  TE_FILE_HEADER)+
22080 31 29 3d 3d 53 51 4c 49 54 45 5f 46 49 4c 45 5f  1)==SQLITE_FILE_
22090 48 45 41 44 45 52 5f 4c 45 4e 20 29 3b 0a 20 20  HEADER_LEN );.  
220a0 67 6f 74 20 3d 20 70 72 65 61 64 28 68 44 62 2c  got = pread(hDb,
220b0 20 61 48 64 72 2c 20 31 30 30 2c 20 30 29 3b 0a   aHdr, 100, 0);.
220c0 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20    if( got<0 ){. 
220d0 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d     *pLockstate =
220e0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54   SQLITE_LOCKSTAT
220f0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74  E_ERROR;.    ret
22100 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
22110 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 6f 74 21  ;.  }.  if( got!
22120 3d 31 30 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  =100 || memcmp(a
22130 48 64 72 2c 20 53 51 4c 49 54 45 5f 46 49 4c 45  Hdr, SQLITE_FILE
22140 5f 48 45 41 44 45 52 2c 20 53 51 4c 49 54 45 5f  _HEADER, SQLITE_
22150 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 29  FILE_HEADER_LEN)
22160 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63  !=0 ){.    *pLoc
22170 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  kstate = SQLITE_
22180 4c 4f 43 4b 53 54 41 54 45 5f 4e 4f 54 41 44 42  LOCKSTATE_NOTADB
22190 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
221a0 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 7d 0a  ITE_NOTADB;.  }.
221b0 20 20 0a 20 20 2f 2a 20 46 69 72 73 74 20 63 68    .  /* First ch
221c0 65 63 6b 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  eck for an exclu
221d0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 6e  sive lock */.  n
221e0 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78 49 73 4c 6f  Lock += unixIsLo
221f0 63 6b 65 64 28 70 69 64 2c 20 68 44 62 2c 20 46  cked(pid, hDb, F
22200 5f 52 44 4c 43 4b 2c 20 53 48 41 52 45 44 5f 46  _RDLCK, SHARED_F
22210 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a  IRST, SHARED_SIZ
22220 45 2c 20 22 45 58 43 4c 55 53 49 56 45 22 29 3b  E, "EXCLUSIVE");
22230 0a 20 20 69 73 57 61 6c 20 3d 20 61 48 64 72 5b  .  isWal = aHdr[
22240 31 38 5d 3d 3d 32 3b 0a 20 20 69 66 28 20 6e 4c  18]==2;.  if( nL
22250 6f 63 6b 3d 3d 30 20 26 26 20 69 73 57 61 6c 3d  ock==0 && isWal=
22260 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 6f 6c  =0 ){.    /* Rol
22270 6c 62 61 63 6b 20 6d 6f 64 65 20 2a 2f 0a 20 20  lback mode */.  
22280 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78 49    nLock += unixI
22290 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 44 62  sLocked(pid, hDb
222a0 2c 20 46 5f 57 52 4c 43 4b 2c 20 50 45 4e 44 49  , F_WRLCK, PENDI
222b0 4e 47 5f 42 59 54 45 2c 20 53 48 41 52 45 44 5f  NG_BYTE, SHARED_
222c0 53 49 5a 45 2b 32 2c 20 22 50 45 4e 44 49 4e 47  SIZE+2, "PENDING
222d0 7c 52 45 53 45 52 56 45 44 7c 53 48 41 52 45 44  |RESERVED|SHARED
222e0 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c  ");.  }.  if( nL
222f0 6f 63 6b 3d 3d 30 20 26 26 20 69 73 57 61 6c 21  ock==0 && isWal!
22300 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 6f  =0 ){.    /* loo
22310 6b 75 70 20 74 68 65 20 66 69 6c 65 20 64 65 73  kup the file des
22320 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
22330 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 66 69  shared memory fi
22340 6c 65 20 69 66 20 77 65 20 68 61 76 65 20 69 74  le if we have it
22350 20 6f 70 65 6e 20 69 6e 20 74 68 69 73 20 70 72   open in this pr
22360 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 75 6e 69  ocess */.    uni
22370 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
22380 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
22390 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
223a0 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
223b0 20 2a 2f 0a 20 20 20 20 75 6e 69 78 53 68 6d 4e   */.    unixShmN
223c0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
223d0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
223e0 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 69 66 28  ShmNode;.    if(
223f0 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20   pShmNode ){.   
22400 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
22410 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
22420 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 0a  >mutex);.      .
22430 20 20 20 20 20 20 68 53 68 6d 20 3d 20 70 53 68        hShm = pSh
22440 6d 4e 6f 64 65 2d 3e 68 3b 0a 20 20 20 20 20 20  mNode->h;.      
22450 69 66 28 20 68 53 68 6d 20 3e 3d 20 30 29 7b 0a  if( hShm >= 0){.
22460 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
22470 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53  IsLocked(pid, hS
22480 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d  hm, F_RDLCK, SHM
22490 5f 52 45 43 4f 56 45 52 2c 20 31 2c 20 22 57 41  _RECOVER, 1, "WA
224a0 4c 2d 52 45 43 4f 56 45 52 59 22 29 20 7c 7c 0a  L-RECOVERY") ||.
224b0 20 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 49             unixI
224c0 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53 68  sLocked(pid, hSh
224d0 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f  m, F_RDLCK, SHM_
224e0 57 52 49 54 45 2c 20 31 2c 20 22 57 41 4c 2d 57  WRITE, 1, "WAL-W
224f0 52 49 54 45 22 29 20 29 7b 0a 20 20 20 20 20 20  RITE") ){.      
22500 20 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20      nLock = 1;. 
22510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22520 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 73 71  .      .      sq
22530 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
22540 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
22550 78 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 0a  x);.    } .    .
22560 20 20 20 20 69 66 28 20 68 53 68 6d 3c 30 20 29      if( hShm<0 )
22570 7b 0a 20 20 20 20 20 20 2f 2a 20 74 68 65 20 73  {.      /* the s
22580 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 66 69 6c  hared memory fil
22590 65 20 69 73 6e 27 74 20 6f 70 65 6e 20 69 6e 20  e isn't open in 
225a0 74 68 69 73 20 70 72 6f 63 65 73 73 20 73 70 61  this process spa
225b0 63 65 2c 20 6f 70 65 6e 20 6f 75 72 20 6f 77 6e  ce, open our own
225c0 20 46 44 20 2a 2f 0a 20 20 20 20 20 20 63 68 61   FD */.      cha
225d0 72 20 7a 53 68 6d 5b 4d 41 58 50 41 54 48 4c 45  r zShm[MAXPATHLE
225e0 4e 5d 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20  N];.      .     
225f0 20 2f 2a 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a   /* WAL mode */.
22600 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 7a 53        strlcpy(zS
22610 68 6d 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  hm, pFile->zPath
22620 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
22630 20 20 20 20 20 73 74 72 6c 63 61 74 28 7a 53 68       strlcat(zSh
22640 6d 2c 20 22 2d 73 68 6d 22 2c 20 4d 41 58 50 41  m, "-shm", MAXPA
22650 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 68 53  THLEN);.      hS
22660 68 6d 20 3d 20 6f 70 65 6e 28 7a 53 68 6d 2c 20  hm = open(zShm, 
22670 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20  O_RDONLY, 0);.  
22680 20 20 20 20 69 66 28 20 68 53 68 6d 3c 30 20 29      if( hShm<0 )
22690 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 6f 63 6b  {.        *pLock
226a0 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c  state = SQLITE_L
226b0 4f 43 4b 53 54 41 54 45 5f 4f 46 46 3b 0a 20 20  OCKSTATE_OFF;.  
226c0 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
226d0 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 20  utex();.        
226e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
226f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22700 69 66 28 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64  if( unixIsLocked
22710 28 70 69 64 2c 20 68 53 68 6d 2c 20 46 5f 52 44  (pid, hShm, F_RD
22720 4c 43 4b 2c 20 53 48 4d 5f 52 45 43 4f 56 45 52  LCK, SHM_RECOVER
22730 2c 20 31 2c 20 22 57 41 4c 2d 52 45 43 4f 56 45  , 1, "WAL-RECOVE
22740 52 59 22 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  RY") ||.        
22750 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69   unixIsLocked(pi
22760 64 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b  d, hShm, F_RDLCK
22770 2c 20 53 48 4d 5f 57 52 49 54 45 2c 20 31 2c 20  , SHM_WRITE, 1, 
22780 22 57 41 4c 2d 57 52 49 54 45 22 29 20 29 7b 0a  "WAL-WRITE") ){.
22790 20 20 20 20 20 20 20 20 6e 4c 6f 63 6b 20 3d 20          nLock = 
227a0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
227b0 20 63 6c 6f 73 65 28 68 53 68 6d 29 3b 0a 20 20   close(hShm);.  
227c0 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
227d0 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20  eMutex();.  }.  
227e0 69 66 28 20 6e 4c 6f 63 6b 3e 30 20 29 7b 0a 20  if( nLock>0 ){. 
227f0 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d     *pLockstate =
22800 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54   SQLITE_LOCKSTAT
22810 45 5f 4f 4e 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  E_ON;.  } else {
22820 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65  .    *pLockstate
22830 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54   = SQLITE_LOCKST
22840 41 54 45 5f 4f 46 46 3b 0a 20 20 7d 0a 20 20 72  ATE_OFF;.  }.  r
22850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22860 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 28 53  .}..#endif /* (S
22870 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50  QLITE_ENABLE_APP
22880 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66  LE_SPI>0) && def
22890 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
228a0 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72  */.../*.** Infor
228b0 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72  mation and contr
228c0 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69  ol of an open fi
228d0 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
228e0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
228f0 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
22900 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
22910 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
22920 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
22930 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
22940 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  d;.  switch( op 
22950 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
22960 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
22970 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  TE: {.      *(in
22980 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  t*)pArg = pFile-
22990 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20  >eFileLock;.    
229a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
229b0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
229c0 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45  se SQLITE_LAST_E
229d0 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28  RRNO: {.      *(
229e0 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  int*)pArg = pFil
229f0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
22a00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22a10 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
22a20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
22a30 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a  L_CHUNK_SIZE: {.
22a40 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43        pFile->szC
22a50 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70  hunk = *(int *)p
22a60 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Arg;.      retur
22a70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
22a80 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
22a90 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
22aa0 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  NT: {.      int 
22ab0 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  rc;.      Simula
22ac0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
22ad0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  1);.      rc = f
22ae0 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69  cntlSizeHint(pFi
22af0 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67  le, *(i64 *)pArg
22b00 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
22b10 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
22b20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22b30 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  rc;.    }.    ca
22b40 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
22b50 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20  PERSIST_WAL: {. 
22b60 20 20 20 20 20 69 6e 74 20 62 50 65 72 73 69 73       int bPersis
22b70 74 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72 67 3b  t = *(int*)pArg;
22b80 0a 20 20 20 20 20 20 69 66 28 20 62 50 65 72 73  .      if( bPers
22b90 69 73 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ist<0 ){.       
22ba0 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28   *(int*)pArg = (
22bb0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
22bc0 20 26 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53   & UNIXFILE_PERS
22bd0 49 53 54 5f 57 41 4c 29 21 3d 30 3b 0a 20 20 20  IST_WAL)!=0;.   
22be0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 50 65     }else if( bPe
22bf0 72 73 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  rsist==0 ){.    
22c00 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
22c10 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c  lags &= ~UNIXFIL
22c20 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 3b 0a 20  E_PERSIST_WAL;. 
22c30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22c40 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
22c50 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
22c60 5f 50 45 52 53 49 53 54 5f 57 41 4c 3b 0a 20 20  _PERSIST_WAL;.  
22c70 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
22c80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
22c90 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
22ca0 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  UG.    /* The pa
22cb0 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d  ger calls this m
22cc0 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20  ethod to signal 
22cd0 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65  that it has done
22ce0 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61  .    ** a rollba
22cf0 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
22d00 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72  database is ther
22d10 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20  efore unchanged 
22d20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65  and.    ** it he
22d30 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  nce it is OK for
22d40 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22d50 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
22d60 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63  to be.    ** unc
22d70 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  hanged..    */. 
22d80 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
22d90 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
22da0 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  D: {.      ((uni
22db0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70  xFile*)id)->dbUp
22dc0 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  date = 0;.      
22dd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22de0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
22df0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
22e00 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
22e10 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
22e20 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51  E__).    case SQ
22e30 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c  LITE_FCNTL_SET_L
22e40 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20  OCKPROXYFILE:.  
22e50 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
22e60 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_GET_LOCKPROX
22e70 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72  YFILE: {.      r
22e80 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43  eturn proxyFileC
22e90 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72  ontrol(id,op,pAr
22ea0 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  g);.    }.#endif
22eb0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
22ec0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
22ed0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
22ee0 4c 45 5f 5f 29 20 2a 2f 0a 23 69 66 20 28 53 51  LE__) */.#if (SQ
22ef0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c  LITE_ENABLE_APPL
22f00 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69  E_SPI>0) && defi
22f10 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
22f20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
22f30 43 4e 54 4c 5f 54 52 55 4e 43 41 54 45 5f 44 41  CNTL_TRUNCATE_DA
22f40 54 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  TABASE: {.      
22f50 72 65 74 75 72 6e 20 75 6e 69 78 54 72 75 6e 63  return unixTrunc
22f60 61 74 65 44 61 74 61 62 61 73 65 28 70 46 69 6c  ateDatabase(pFil
22f70 65 2c 20 28 70 41 72 67 20 3f 20 28 2a 28 69 6e  e, (pArg ? (*(in
22f80 74 20 2a 29 70 41 72 67 29 20 3a 20 30 29 29 3b  t *)pArg) : 0));
22f90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
22fa0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 45 50  SQLITE_FCNTL_REP
22fb0 4c 41 43 45 5f 44 41 54 41 42 41 53 45 3a 20 7b  LACE_DATABASE: {
22fc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e  .      return un
22fd0 69 78 52 65 70 6c 61 63 65 44 61 74 61 62 61 73  ixReplaceDatabas
22fe0 65 28 70 46 69 6c 65 2c 20 28 73 71 6c 69 74 65  e(pFile, (sqlite
22ff0 33 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 7d  3 *)pArg);.    }
23000 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
23010 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
23020 5f 50 49 44 3a 20 7b 0a 20 20 20 20 20 20 4c 6f  _PID: {.      Lo
23030 63 6b 73 74 61 74 65 50 49 44 20 2a 70 4c 6f 63  ckstatePID *pLoc
23040 6b 73 74 61 74 65 3b 0a 20 20 20 20 20 20 69 6e  kstate;.      in
23050 74 20 72 63 3b 0a 20 20 20 20 20 20 0a 20 20 20  t rc;.      .   
23060 20 20 20 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c     if( pArg==NUL
23070 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  L ){.        ret
23080 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
23090 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  E;.      }.     
230a0 20 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 28 4c   pLockstate = (L
230b0 6f 63 6b 73 74 61 74 65 50 49 44 20 2a 29 70 41  ockstatePID *)pA
230c0 72 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 75  rg;.      rc = u
230d0 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50 69 64 28  nixLockstatePid(
230e0 70 46 69 6c 65 2c 20 70 4c 6f 63 6b 73 74 61 74  pFile, pLockstat
230f0 65 2d 3e 70 69 64 2c 20 26 28 70 4c 6f 63 6b 73  e->pid, &(pLocks
23100 74 61 74 65 2d 3e 73 74 61 74 65 29 29 3b 0a 20  tate->state));. 
23110 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
23120 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 23 65 6e      }.      .#en
23130 64 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f 45  dif /* (SQLITE_E
23140 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e  NABLE_APPLE_SPI>
23150 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  0) && defined(__
23160 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 20 20  APPLE__) */.    
23170 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
23180 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44 3a 20  L_SYNC_OMITTED: 
23190 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
231a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 41 20  QLITE_OK;  /* A 
231b0 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20  no-op */.    }. 
231c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
231d0 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a  TE_NOTFOUND;.}..
231e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
231f0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
23200 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
23210 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
23220 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
23230 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
23240 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
23250 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
23260 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
23270 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
23280 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
23290 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
232a0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
232b0 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
232c0 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
232d0 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
232e0 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
232f0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
23300 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
23310 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
23320 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
23330 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
23340 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
23350 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
23360 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
23370 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
23380 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
23390 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29  3_file *NotUsed)
233a0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
233b0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
233c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
233d0 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
233e0 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ZE;.}../*.** Ret
233f0 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63  urn the device c
23400 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 66  haracteristics f
23410 6f 72 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  or the file. Thi
23420 73 20 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f  s is always 0 fo
23430 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69  r unix..*/.stati
23440 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
23450 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
23460 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
23470 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
23480 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
23490 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ed);.  return 0;
234a0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
234b0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a  TE_OMIT_WAL.../*
234c0 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  .** Object used 
234d0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20  to represent an 
234e0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75  shared memory bu
234f0 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  ffer.  .**.** Wh
23500 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  en multiple thre
23510 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ads all referenc
23520 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69  e the same wal-i
23530 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72 65 61  ndex, each threa
23540 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e  d.** has its own
23550 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c   unixShm object,
23560 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f   but they all po
23570 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  int to a single 
23580 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74  instance.** of t
23590 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
235a0 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
235b0 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61  r words, each wa
235c0 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65  l-index is opene
235d0 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  d.** only once p
235e0 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
235f0 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f  * Each unixShmNo
23600 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  de object is con
23610 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67  nected to a sing
23620 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  le unixInodeInfo
23630 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63   object..** We c
23640 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68  ould coalesce th
23650 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75  is object into u
23660 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75  nixInodeInfo, bu
23670 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61  t that would mea
23680 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20  n.** every open 
23690 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e  file that does n
236a0 6f 74 20 75 73 65 20 73 68 61 72 65 64 20 6d 65  ot use shared me
236b0 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77  mory (in other w
236c0 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70  ords, most.** op
236d0 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20  en files) would 
236e0 68 61 76 65 20 74 6f 20 63 61 72 72 79 20 61 72  have to carry ar
236f0 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72 61 20  ound this extra 
23700 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f  information.  So
23710 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  .** the unixInod
23720 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e  eInfo object con
23730 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
23740 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e  to this unixShmN
23750 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e  ode object.** an
23760 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  d the unixShmNod
23770 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
23780 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65  ted only when ne
23790 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78  eded..**.** unix
237a0 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
237b0 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72   be true when cr
237c0 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f  eating or destro
237d0 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a  ying.** this obj
237e0 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61  ect or while rea
237f0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
23800 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
23810 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  elds:.**.**     
23820 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20   nRef.**.** The 
23830 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
23840 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61   are read-only a
23850 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20  fter the object 
23860 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a  is created:.** .
23870 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20  **      fid.**  
23880 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a      zFilename.**
23890 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53  .** Either unixS
238a0 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73  hmNode.mutex mus
238b0 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69  t be held or uni
238c0 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  xShmNode.nRef==0
238d0 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65   and.** unixMute
238e0 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20  xHeld() is true 
238f0 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20  when reading or 
23900 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65  writing any othe
23910 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68  r field.** in th
23920 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  is structure..*/
23930 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e  .struct unixShmN
23940 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ode {.  unixInod
23950 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20  eInfo *pInode;  
23960 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49     /* unixInodeI
23970 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68  nfo that owns th
23980 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20  is SHM node */. 
23990 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
239a0 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
239b0 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
239c0 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
239d0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
239e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
239f0 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65  me of the mmappe
23a00 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
23a10 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
23a20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
23a30 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
23a40 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
23a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
23a60 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64  * Size of shared
23a70 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
23a80 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e  */.  u16 nRegion
23a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23aa0 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
23ab0 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75   apRegion */.  u
23ac0 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20  8 isReadonly;   
23ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
23ae0 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e if read-only *
23af0 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67  /.  char **apReg
23b00 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ion;           /
23b10 2a 20 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65  * Array of mappe
23b20 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
23b30 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
23b40 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
23b50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23b60 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a  r of unixShm obj
23b70 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
23b80 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53   this */.  unixS
23b90 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  hm *pFirst;     
23ba0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69        /* All uni
23bb0 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  xShm objects poi
23bc0 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
23bd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
23be0 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61  EBUG.  u8 exclMa
23bf0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
23c00 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
23c10 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
23c20 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64  d */.  u8 shared
23c30 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
23c40 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
23c50 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
23c60 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  /.  u8 nextShmId
23c70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
23c80 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
23c90 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75   unixShm.id valu
23ca0 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
23cb0 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
23cc0 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
23cd0 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72  by this VFS to r
23ce0 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20  ecord the state 
23cf0 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68  of an.** open sh
23d00 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e  ared memory conn
23d10 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ection..**.** Th
23d20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
23d30 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ds are initializ
23d40 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a  ed when this obj
23d50 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61  ect is created a
23d60 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f  nd.** are read-o
23d70 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a  nly thereafter:.
23d80 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  **.**    unixShm
23d90 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69  .pFile.**    uni
23da0 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c  xShm.id.**.** Al
23db0 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  l other fields a
23dc0 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  re read/write.  
23dd0 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c  The unixShm.pFil
23de0 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  e->mutex must be
23df0 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61   held.** while a
23e00 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61  ccessing any rea
23e10 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a  d/write fields..
23e20 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68  */.struct unixSh
23e30 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  m {.  unixShmNod
23e40 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
23e50 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
23e60 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  ng unixShmNode o
23e70 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53  bject */.  unixS
23e80 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  hm *pNext;      
23e90 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
23ea0 69 78 53 68 6d 20 77 69 74 68 20 74 68 65 20 73  ixShm with the s
23eb0 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ame unixShmNode 
23ec0 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78  */.  u8 hasMutex
23ed0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23ee0 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69  /* True if holdi
23ef0 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  ng the unixShmNo
23f00 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38  de mutex */.  u8
23f10 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   id;            
23f20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f           /* Id o
23f30 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
23f40 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69  n within its uni
23f50 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31  xShmNode */.  u1
23f60 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  6 sharedMask;   
23f70 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
23f80 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
23f90 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65   held */.  u16 e
23fa0 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
23fb0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
23fc0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
23fd0 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   held */.};../*.
23fe0 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65  ** Constants use
23ff0 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f  d for locking.*/
24000 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48  .#define UNIX_SH
24010 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51  M_BASE   ((22+SQ
24020 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a  LITE_SHM_NLOCK)*
24030 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69  4)         /* fi
24040 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f  rst lock byte */
24050 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48  .#define UNIX_SH
24060 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53  M_DMS    (UNIX_S
24070 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
24080 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
24090 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
240a0 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73  ./*.** Apply pos
240b0 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
240c0 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20  s for all bytes 
240d0 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67  from ofst throug
240e0 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a  h ofst+n-1..**.*
240f0 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66  * Locks block if
24100 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61   the mask is exa
24110 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20  ctly UNIX_SHM_C 
24120 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63  and are non-bloc
24130 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73  king.** otherwis
24140 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
24150 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
24160 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  ck(.  unixShmNod
24170 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20  e *pShmNode, /* 
24180 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
24190 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
241a0 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
241b0 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
241c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f  ,          /* F_
241d0 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20  UNLCK, F_RDLCK, 
241e0 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  or F_WRLCK */.  
241f0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
24200 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
24210 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  byte of the lock
24220 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69  ing range */.  i
24230 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20  nt n            
24240 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24250 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
24260 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
24270 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f  flock f;       /
24280 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64 76 69  * The posix advi
24290 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72  sory locking str
242a0 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
242b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
242c0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
242d0 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f   form fcntl() */
242e0 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f  ..  /* Access to
242f0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
24300 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61   object is seria
24310 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c  lized by the cal
24320 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ler */.  assert(
24330 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
24340 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  eld(pShmNode->mu
24350 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  tex) || pShmNode
24360 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
24370 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20  /* Shared locks 
24380 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20  never span more 
24390 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f  than one byte */
243a0 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
243b0 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52  || lockType!=F_R
243c0 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  DLCK );..  /* Lo
243d0 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72  cks are within r
243e0 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ange */.  assert
243f0 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49  ( n>=1 && n<SQLI
24400 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
24410 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
24420 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >h>=0 ){.    /* 
24430 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
24440 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
24450 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  s */.    memset(
24460 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29  &f, 0, sizeof(f)
24470 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20  );.    f.l_type 
24480 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20  = lockType;.    
24490 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  f.l_whence = SEE
244a0 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73  K_SET;.    f.l_s
244b0 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20  tart = ofst;.   
244c0 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20   f.l_len = n;.. 
244d0 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
244e0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53  pShmNode->h, F_S
244f0 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72  ETLK, &f);.    r
24500 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f  c = (rc!=(-1)) ?
24510 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
24520 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
24530 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67   /* Update the g
24540 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  lobal lock state
24550 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72   and do debug tr
24560 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20  acing */.#ifdef 
24570 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
24580 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54   u16 mask;.  OST
24590 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
245a0 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31  "));.  mask = (1
245b0 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
245c0 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72  <<ofst);.  if( r
245d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
245e0 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
245f0 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
24600 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
24610 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
24620 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
24630 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  de->exclMask &= 
24640 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68  ~mask;.      pSh
24650 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
24660 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
24670 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
24680 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
24690 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
246a0 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ead-lock %d ok",
246b0 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
246c0 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
246d0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
246e0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
246f0 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
24700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24710 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
24720 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
24730 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
24740 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ite-lock %d ok",
24750 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
24760 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
24770 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
24780 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
24790 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
247a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
247b0 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
247c0 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
247d0 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
247e0 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f  ck %d failed", o
247f0 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  fst));.    }else
24800 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
24810 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
24820 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
24830 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20  ock failed"));. 
24840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24850 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
24860 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
24870 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
24880 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  te-lock %d faile
24890 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
248a0 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
248b0 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20  (" - afterwards 
248c0 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
248d0 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
248e0 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  e->sharedMask, p
248f0 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
24900 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  k));.  }.#endif.
24910 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20  .  return rc;   
24920 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20       .}.../*.** 
24930 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68  Purge the unixSh
24940 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
24950 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
24960 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e  th unixShmNode.n
24970 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
24980 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
24990 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
249a0 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
249b0 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
249c0 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
249d0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
249e0 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
249f0 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72   void unixShmPur
24a00 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  ge(unixFile *pFd
24a10 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ){.  unixShmNode
24a20 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64   *p = pFd->pInod
24a30 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61  e->pShmNode;.  a
24a40 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
24a50 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
24a60 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20  p && p->nRef==0 
24a70 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
24a80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e    assert( p->pIn
24a90 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65  ode==pFd->pInode
24aa0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
24ab0 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
24ac0 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tex);.    for(i=
24ad0 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
24ae0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
24af0 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
24b00 20 20 20 20 6d 75 6e 6d 61 70 28 70 2d 3e 61 70      munmap(p->ap
24b10 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a  Region[i], p->sz
24b20 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
24b30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
24b40 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
24b50 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20  Region[i]);.    
24b60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
24b70 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
24b80 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28  Region);.    if(
24b90 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
24ba0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
24bb0 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  Fd, p->h, __LINE
24bc0 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20  __);.      p->h 
24bd0 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
24be0 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  p->pInode->pShmN
24bf0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ode = 0;.    sql
24c00 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
24c10 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  }.}..static cons
24c20 74 20 63 68 61 72 20 2a 70 72 6f 78 79 53 68 61  t char *proxySha
24c30 72 65 64 4d 65 6d 6f 72 79 42 61 73 65 50 61 74  redMemoryBasePat
24c40 68 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a 0a  h(unixFile *);..
24c50 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
24c60 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
24c70 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
24c80 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
24c90 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54  le pDbFd.  .** T
24ca0 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69  his particular i
24cb0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
24cc0 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73  es mmapped files
24cd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ..**.** The file
24ce0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
24cf0 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  nt shared-memory
24d00 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
24d10 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20  directory.** as 
24d20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
24d30 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74  e file and has t
24d40 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
24d50 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
24d60 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74  e.** file with t
24d70 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78  he "-shm" suffix
24d80 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61   added.  For exa
24d90 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74  mple, if the dat
24da0 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73  abase file.** is
24db0 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
24dc0 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68  nfig.db" then th
24dd0 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63  e file that is c
24de0 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70  reated and mmapp
24df0 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64  ed.** for shared
24e00 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
24e10 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73  called "/home/us
24e20 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68  er1/config.db-sh
24e30 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74  m".  .**.** Anot
24e40 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20  her approach to 
24e50 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20  is to use files 
24e60 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f  in /dev/shm or /
24e70 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a  dev/tmp or an.**
24e80 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66   some other tmpf
24e90 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20  s mount. But if 
24ea0 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66  a file in a diff
24eb0 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a  erent directory.
24ec0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ** from the data
24ed0 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65  base file is use
24ee0 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e  d, then differin
24ef0 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  g access permiss
24f00 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72  ions.** or a chr
24f10 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73  oot() might caus
24f20 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  e two different 
24f30 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65  processes on the
24f40 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73   same.** databas
24f50 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e  e to end up usin
24f60 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  g different file
24f70 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  s for shared mem
24f80 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e  ory - .** meanin
24f90 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d  g that their mem
24fa0 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65  ory would not re
24fb0 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d  ally be shared -
24fc0 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e   resulting.** in
24fd0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
24fe0 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c  tion.  Neverthel
24ff0 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20  ess, this tmpfs 
25000 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61  file usage.** ca
25010 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20  n be enabled at 
25020 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69  compile-time usi
25030 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f  ng -DSQLITE_SHM_
25040 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f  DIRECTORY="/dev/
25050 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65  shm".** or the e
25060 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20  quivalent.  The 
25070 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  use of the SQLIT
25080 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
25090 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20  compile-time.** 
250a0 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  option results i
250b0 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
250c0 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74  e build of SQLit
250d0 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51  e;  builds of SQ
250e0 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74  Lite.** that wit
250f0 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49  h differing SQLI
25100 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
25110 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70   settings attemp
25120 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  t to use the.** 
25130 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
25140 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
25150 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f  ime, database co
25160 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69  rruption will li
25170 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20  kely.** result. 
25180 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  The SQLITE_SHM_D
25190 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
251a0 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
251b0 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75  considered.** "u
251c0 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20  nsupported" and 
251d0 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61  may go away in a
251e0 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72   future SQLite r
251f0 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  elease..**.** Wh
25200 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
25210 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
25220 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
25230 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
25240 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
25250 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
25260 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
25270 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
25280 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
25290 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
252a0 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
252b0 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
252c0 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
252d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
252e0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
252f0 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20  se file (pDbFd) 
25300 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e  is using the "un
25310 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20  ix-excl" VFS.** 
25320 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
25330 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
25340 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
25350 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
25360 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74  nd.** that no ot
25370 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72  her processes ar
25380 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f  e able to read o
25390 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61  r write the data
253a0 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61  base.  In.** tha
253b0 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f  t case, we do no
253c0 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68  t really need sh
253d0 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f  ared memory.  No
253e0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a   shared memory.*
253f0 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  * file is create
25400 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d  d.  The shared m
25410 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69  emory will be si
25420 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61  mulated with hea
25430 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  p memory..*/.sta
25440 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
25450 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
25460 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  xFile *pDbFd){. 
25470 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
25480 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
25490 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
254a0 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
254b0 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
254c0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
254d0 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e;   /* The unde
254e0 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
254f0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
25500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25510 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
25520 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  lt code */.  uni
25530 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
25540 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
25550 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20  The inode of fd 
25560 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46  */.  char *zShmF
25570 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
25580 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
25590 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  the file used fo
255a0 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e  r SHM */.  int n
255b0 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
255c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
255d0 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69  ze of the SHM fi
255e0 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  lename in bytes 
255f0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
25600 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
25610 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  new unixShm obje
25620 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ct. */.  p = sql
25630 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
25640 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
25650 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
25660 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
25670 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
25680 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72  of(*p));.  asser
25690 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
256a0 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
256b0 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69   to see if a uni
256c0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
256d0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
256e0 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Reuse an existin
256f0 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72  g.  ** one if pr
25700 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20  esent. Create a 
25710 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
25720 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69  sary..  */.  uni
25730 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
25740 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d   pInode = pDbFd-
25750 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e  >pInode;.  pShmN
25760 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53  ode = pInode->pS
25770 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53  hmNode;.  if( pS
25780 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
25790 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
257a0 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
257b0 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69      /* fstat() i
257c0 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65  nfo for database
257d0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   file */..    /*
257e0 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f   Call fstat() to
257f0 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   figure out the 
25800 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
25810 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25820 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65  . If.    ** a ne
25830 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20  w *-shm file is 
25840 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65  created, an atte
25850 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  mpt will be made
25860 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20   to create it.  
25870 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61    ** with the sa
25880 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 20  me permissions. 
25890 54 68 65 20 61 63 74 75 61 6c 20 70 65 72 6d 69  The actual permi
258a0 73 73 69 6f 6e 73 20 74 68 65 20 66 69 6c 65 20  ssions the file 
258b0 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 2a  is created.    *
258c0 2a 20 77 69 74 68 20 61 72 65 20 73 75 62 6a 65  * with are subje
258d0 63 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ct to the curren
258e0 74 20 75 6d 61 73 6b 20 73 65 74 74 69 6e 67 2e  t umask setting.
258f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25900 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68  osFstat(pDbFd->h
25910 2c 20 26 73 53 74 61 74 29 20 26 26 20 70 49 6e  , &sStat) && pIn
25920 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
25930 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  k==0 ){.      rc
25940 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
25950 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74  FSTAT;.      got
25960 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
25970 20 20 20 20 7d 0a 0a 20 20 20 20 63 6f 6e 73 74      }..    const
25980 20 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68   char *zBasePath
25990 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b   = pDbFd->zPath;
259a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
259b0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
259c0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
259d0 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 49 66  _STYLE.    /* If
259e0 20 70 44 62 46 64 20 69 73 20 63 6f 6e 66 69 67   pDbFd is config
259f0 75 72 65 64 20 77 69 74 68 20 70 72 6f 78 79 20  ured with proxy 
25a00 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 75 73  locking mode, us
25a10 65 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 20  e the local .   
25a20 20 20 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 20 70    ** lock file p
25a30 61 74 68 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ath to determine
25a40 20 74 68 65 20 2d 73 68 6d 20 66 69 6c 65 20 70   the -shm file p
25a50 61 74 68 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ath.     */.    
25a60 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69  if( isProxyLocki
25a70 6e 67 4d 6f 64 65 28 70 44 62 46 64 29 20 29 7b  ngMode(pDbFd) ){
25a80 0a 20 20 20 20 20 20 7a 42 61 73 65 50 61 74 68  .      zBasePath
25a90 20 3d 20 70 72 6f 78 79 53 68 61 72 65 64 4d 65   = proxySharedMe
25aa0 6d 6f 72 79 42 61 73 65 50 61 74 68 28 70 44 62  moryBasePath(pDb
25ab0 46 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  Fd);.      if( !
25ac0 7a 42 61 73 65 50 61 74 68 20 29 7b 0a 20 20 20  zBasePath ){.   
25ad0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25ae0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
25af0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
25b00 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20  _open_err;.     
25b10 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
25b20 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49      .#ifdef SQLI
25b30 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
25b40 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  .    nShmFilenam
25b50 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54  e = sizeof(SQLIT
25b60 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29  E_SHM_DIRECTORY)
25b70 20 2b 20 33 30 3b 0a 23 65 6c 73 65 0a 20 20 20   + 30;.#else.   
25b80 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
25b90 35 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  5 + (int)strlen(
25ba0 7a 42 61 73 65 50 61 74 68 29 3b 0a 23 65 6e 64  zBasePath);.#end
25bb0 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20  if.    pShmNode 
25bc0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
25bd0 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  ( sizeof(*pShmNo
25be0 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61  de) + nShmFilena
25bf0 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53  me );.    if( pS
25c00 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
25c10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
25c20 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
25c30 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
25c40 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
25c50 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a  pShmNode, 0, siz
25c60 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 29 3b  eof(*pShmNode));
25c70 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  .    zShmFilenam
25c80 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  e = pShmNode->zF
25c90 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
25ca0 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23  )&pShmNode[1];.#
25cb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  ifdef SQLITE_SHM
25cc0 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73  _DIRECTORY.    s
25cd0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
25ce0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
25cf0 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20  hmFilename, .   
25d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d10 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52    SQLITE_SHM_DIR
25d20 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d  ECTORY "/sqlite-
25d30 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20  shm-%x-%x",.    
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d50 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69   (u32)sStat.st_i
25d60 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73  no, (u32)sStat.s
25d70 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20  t_dev);.#else.  
25d80 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
25d90 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  tf(nShmFilename,
25da0 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22   zShmFilename, "
25db0 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50 61  %s-shm", zBasePa
25dc0 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
25dd0 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46  FileSuffix3(pDbF
25de0 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69  d->zPath, zShmFi
25df0 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  lename);.#endif.
25e00 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
25e10 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d  = -1;.    pDbFd-
25e20 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
25e30 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  e = pShmNode;.  
25e40 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f    pShmNode->pIno
25e50 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
25e60 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  de;.    pShmNode
25e70 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
25e80 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
25e90 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
25ea0 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
25eb0 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
25ec0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25ed0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
25ee0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
25ef0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
25f00 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
25f10 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  sLock==0 ){.    
25f20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
25f30 4f 3b 0a 20 20 20 20 20 20 7a 52 4f 20 3d 20 73  O;.      zRO = s
25f40 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
25f50 65 74 65 72 28 70 44 62 46 64 2d 3e 7a 50 61 74  eter(pDbFd->zPat
25f60 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d  h, "readonly_shm
25f70 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  ");.      if( zR
25f80 4f 20 26 26 20 73 71 6c 69 74 65 33 47 65 74 42  O && sqlite3GetB
25f90 6f 6f 6c 65 61 6e 28 7a 52 4f 29 20 29 7b 0a 20  oolean(zRO) ){. 
25fa0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
25fb0 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  >h = robust_open
25fc0 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 4f  (zShmFilename, O
25fd0 5f 52 44 4f 4e 4c 59 2c 0a 20 20 20 20 20 20 20  _RDONLY,.       
25fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ff0 20 20 20 20 20 20 20 20 20 20 20 28 73 53 74 61             (sSta
26000 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37  t.st_mode & 0777
26010 29 29 3b 0a 20 20 20 20 20 20 20 20 70 53 68 6d  ));.        pShm
26020 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
26030 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
26040 65 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  e{.        pShmN
26050 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f  ode->h = robust_
26060 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d  open(zShmFilenam
26070 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  e, O_RDWR|O_CREA
26080 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
26090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260a0 20 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65    (sStat.st_mode
260b0 20 26 20 30 37 37 37 29 29 3b 0a 20 20 20 20 20   & 0777));.     
260c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 53 68   }.      if( pSh
260d0 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20  mNode->h<0 ){.  
260e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
260f0 20 2a 7a 52 4f 3b 0a 20 20 20 20 20 20 20 20 7a   *zRO;.        z
26100 52 4f 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  RO = sqlite3_uri
26110 5f 70 61 72 61 6d 65 74 65 72 28 70 44 62 46 64  _parameter(pDbFd
26120 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e  ->zPath, "readon
26130 6c 79 5f 73 68 6d 22 29 3b 0a 20 20 20 20 20 20  ly_shm");.      
26140 20 20 69 66 28 20 7a 52 4f 20 26 26 20 73 71 6c    if( zRO && sql
26150 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
26160 52 4f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RO) ){.         
26170 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72   pShmNode->h = r
26180 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46  obust_open(zShmF
26190 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  ilename, O_RDONL
261a0 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
261b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261c0 20 20 20 20 20 20 20 28 73 53 74 61 74 2e 73 74         (sStat.st
261d0 5f 6d 6f 64 65 20 26 20 30 37 37 37 29 29 3b 0a  _mode & 0777));.
261e0 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
261f0 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d  de->isReadonly =
26200 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
26210 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
26220 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
26230 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
26240 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
26250 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
26260 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  en", zShmFilenam
26270 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
26280 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
26290 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
262a0 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43   }.  .      /* C
262b0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
262c0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
262d0 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
262e0 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
262f0 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20       ** If not, 
26300 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
26310 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
26320 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
26330 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
26340 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  ;.      if( unix
26350 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
26360 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c  hmNode, F_WRLCK,
26370 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
26380 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
26390 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75          if( robu
263a0 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
263b0 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a  mNode->h, 0) ){.
263c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
263d0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
263e0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
263f0 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a  , "ftruncate", z
26400 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
26410 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26420 20 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e         /* If run
26430 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20 73 65 74  ning as root set
26440 20 74 68 65 20 75 69 64 2f 67 69 64 20 6f 66 20   the uid/gid of 
26450 74 68 65 20 73 68 6d 20 66 69 6c 65 20 74 6f 20  the shm file to 
26460 6d 61 74 63 68 20 74 68 65 20 64 61 74 61 62 61  match the databa
26470 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  se */.          
26480 75 69 64 5f 74 20 65 75 69 64 20 3d 20 67 65 74  uid_t euid = get
26490 65 75 69 64 28 29 3b 0a 20 20 20 20 20 20 20 20  euid();.        
264a0 20 20 69 66 28 20 65 75 69 64 3d 3d 30 20 26 26    if( euid==0 &&
264b0 20 28 65 75 69 64 21 3d 73 53 74 61 74 2e 73 74   (euid!=sStat.st
264c0 5f 75 69 64 20 7c 7c 20 67 65 74 65 67 69 64 28  _uid || getegid(
264d0 29 21 3d 73 53 74 61 74 2e 73 74 5f 67 69 64 29  )!=sStat.st_gid)
264e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
264f0 69 66 28 20 66 63 68 6f 77 6e 28 70 53 68 6d 4e  if( fchown(pShmN
26500 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74  ode->h, sStat.st
26510 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f 67  _uid, sStat.st_g
26520 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  id) ){.         
26530 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26540 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3b 0a  _IOERR_SHMOPEN;.
26550 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26570 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
26580 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26590 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
265a0 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
265b0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
265c0 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48  F_RDLCK, UNIX_SH
265d0 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20  M_DMS, 1);.     
265e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
265f0 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f  ) goto shm_open_
26600 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  err;.    }.  }..
26610 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65    /* Make the ne
26620 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63  w connection a c
26630 68 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78  hild of the unix
26640 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
26650 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
26660 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ode;.#ifdef SQLI
26670 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64  TE_DEBUG.  p->id
26680 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
26690 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
266a0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
266b0 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
266c0 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65  hm = p;.  unixLe
266d0 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  aveMutex();..  /
266e0 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20  * The reference 
266f0 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64  count on pShmNod
26700 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
26710 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75  en incremented u
26720 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f  nder.  ** the co
26730 76 65 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45  ver of the unixE
26740 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65  nterMutex() mute
26750 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65  x and the pointe
26760 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  r from the.  ** 
26770 6e 65 77 20 28 73 74 72 75 63 74 20 75 6e 69 78  new (struct unix
26780 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74  Shm) object to t
26790 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  he pShmNode has 
267a0 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68  been set. All th
267b0 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20  at is.  ** left 
267c0 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b  to do is to link
267d0 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
267e0 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
267f0 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20  list starting.  
26800 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e  ** at pShmNode->
26810 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73  pFirst. This mus
26820 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20  t be done while 
26830 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d  holding the pShm
26840 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a  Node->mutex .  *
26850 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20  * mutex..  */.  
26860 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
26870 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
26880 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74  tex);.  p->pNext
26890 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69   = pShmNode->pFi
268a0 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  rst;.  pShmNode-
268b0 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73  >pFirst = p;.  s
268c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
268d0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
268e0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
268f0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
26900 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20  ump here on any 
26910 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65  error */.shm_ope
26920 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d  n_err:.  unixShm
26930 50 75 72 67 65 28 70 44 62 46 64 29 3b 20 20 20  Purge(pDbFd);   
26940 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
26950 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20   frees pShmNode 
26960 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
26970 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
26980 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
26990 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
269a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
269b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
269c0 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
269d0 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f  pointer to regio
269e0 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65  n iRegion of the
269f0 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f   .** shared-memo
26a00 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
26a10 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
26a20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d  file fd. Shared-
26a30 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a  memory regions .
26a40 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20  ** are numbered 
26a50 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65  starting from ze
26a60 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d  ro. Each shared-
26a70 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73  memory region is
26a80 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79   szRegion .** by
26a90 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
26aa0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
26ab0 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
26ac0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
26ad0 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20   and *pp is set 
26ae0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f  to NULL..**.** O
26af0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
26b00 20 62 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74   bExtend paramet
26b10 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20  er is 0 and the 
26b20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
26b30 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f  -memory.** regio
26b40 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  n has not been a
26b50 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79  llocated (by any
26b60 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69   client, includi
26b70 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69  ng one running i
26b80 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  n a.** separate 
26b90 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a  process), then *
26ba0 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
26bb0 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
26bc0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a  returned. If .**
26bd0 20 62 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d   bExtend is non-
26be0 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71  zero and the req
26bf0 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
26c00 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
26c10 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e  not yet .** been
26c20 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69   allocated, it i
26c30 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  s allocated by t
26c40 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
26c50 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65  .** If the share
26c60 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
26c70 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
26c80 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73   allocated or is
26c90 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
26ca0 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65   this call as de
26cb0 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74  scribed above, t
26cc0 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64  hen it is mapped
26cd0 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
26ce0 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73  sses .** address
26cf0 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73   space (if it is
26d00 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a   not already), *
26d10 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  pp is set to poi
26d20 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64  nt to the mapped
26d30 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
26d40 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
26d50 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
26d60 74 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20  t unixShmMap(.  
26d70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
26d80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26d90 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f  /* Handle open o
26da0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
26db0 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e  */.  int iRegion
26dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26dd0 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74       /* Region t
26de0 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20  o retrieve */.  
26df0 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20  int szRegion,   
26e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e10 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f  /* Size of regio
26e20 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74  ns */.  int bExt
26e30 65 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  end,            
26e40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
26e50 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69  to extend file i
26e60 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
26e70 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a   void volatile *
26e80 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20  *pp             
26e90 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20   /* OUT: Mapped 
26ea0 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75  memory */.){.  u
26eb0 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  nixFile *pDbFd =
26ec0 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a   (unixFile*)fd;.
26ed0 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20    unixShm *p;.  
26ee0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
26ef0 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20  mNode;.  int rc 
26f00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
26f10 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  /* If the shared
26f20 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61 73  -memory file has
26f30 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
26f40 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  ened, open it no
26f50 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 46  w. */.  if( pDbF
26f60 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20  d->pShm==0 ){.  
26f70 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53    rc = unixOpenS
26f80 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46  haredMemory(pDbF
26f90 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
26fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
26fb0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20  rn rc;.  }..  p 
26fc0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
26fd0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
26fe0 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74  ShmNode;.  sqlit
26ff0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
27000 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
27010 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67  .  assert( szReg
27020 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73  ion==pShmNode->s
27030 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e  zRegion || pShmN
27040 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20  ode->nRegion==0 
27050 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
27060 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
27070 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
27080 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
27090 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46  de->h>=0 || pDbF
270a0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
270b0 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20  essLock==1 );.  
270c0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
270d0 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e  ->h<0 || pDbFd->
270e0 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
270f0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  Lock==0 );..  if
27100 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
27110 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
27120 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77      char **apNew
27130 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27140 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70         /* New ap
27150 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a  Region[] array *
27160 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
27170 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a  = (iRegion+1)*sz
27180 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69  Region;  /* Mini
27190 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c  mum required fil
271a0 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74  e size */.    st
271b0 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
271c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271d0 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74 61   /* Used by fsta
271e0 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d  t() */..    pShm
271f0 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d  Node->szRegion =
27200 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20   szRegion;..    
27210 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  if( pShmNode->h>
27220 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
27230 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
27240 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65  ion is not mappe
27250 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
27260 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
27270 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ace..      ** Ch
27280 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
27290 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
272a0 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65  ted (i.e. if the
272b0 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20   wal-index file 
272c0 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67  is.      ** larg
272d0 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74  e enough to cont
272e0 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  ain the requeste
272f0 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20  d region)..     
27300 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73   */.      if( os
27310 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e  Fstat(pShmNode->
27320 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
27330 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27340 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b  E_IOERR_SHMSIZE;
27350 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
27360 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
27370 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20   }.  .      if( 
27380 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42  sStat.st_size<nB
27390 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  yte ){.        /
273a0 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
273b0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f  memory region do
273c0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66  es not exist. If
273d0 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74 20   bExtend is set 
273e0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61  to.        ** fa
273f0 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e  lse, exit early.
27400 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74   *pp will be set
27410 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
27420 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
27430 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
27440 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69      ** Alternati
27450 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
27460 20 69 73 20 74 72 75 65 2c 20 75 73 65 20 66 74   is true, use ft
27470 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c  runcate() to all
27480 6f 63 61 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  ocate.        **
27490 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
274a0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20  emory region..  
274b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
274c0 20 69 66 28 20 21 62 45 78 74 65 6e 64 20 29 20   if( !bExtend ) 
274d0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
274e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 6f  ;.        if( ro
274f0 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
27500 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6e 42 79 74  ShmNode->h, nByt
27510 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
27520 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
27530 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
27540 48 4d 53 49 5a 45 2c 20 22 66 74 72 75 6e 63 61  HMSIZE, "ftrunca
27550 74 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  te",.           
27560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27570 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
27580 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
27590 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
275a0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
275b0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
275c0 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65  /* Map the reque
275d0 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
275e0 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  on into this pro
275f0 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
27600 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e  pace. */.    apN
27610 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71  ew = (char **)sq
27620 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
27630 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
27640 3e 61 70 52 65 67 69 6f 6e 2c 20 28 69 52 65 67  >apRegion, (iReg
27650 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68  ion+1)*sizeof(ch
27660 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20  ar *).    );.   
27670 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20   if( !apNew ){. 
27680 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27690 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
276a0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
276b0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
276c0 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
276d0 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20  on = apNew;.    
276e0 77 68 69 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  while(pShmNode->
276f0 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
27700 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
27710 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Mem;.      if( p
27720 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
27730 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
27740 6d 6d 61 70 28 30 2c 20 73 7a 52 65 67 69 6f 6e  mmap(0, szRegion
27750 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ,.            pS
27760 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
27770 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a  ly ? PROT_READ :
27780 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f   PROT_READ|PROT_
27790 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20  WRITE, .        
277a0 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20      MAP_SHARED, 
277b0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 70 53 68  pShmNode->h, pSh
277c0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73  mNode->nRegion*s
277d0 7a 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20  zRegion.        
277e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
277f0 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20  Mem==MAP_FAILED 
27800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
27810 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
27820 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
27830 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d  AP, "mmap", pShm
27840 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
27850 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
27860 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
27870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
27880 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  lse{.        pMe
27890 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  m = sqlite3_mall
278a0 6f 63 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  oc(szRegion);.  
278b0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d        if( pMem==
278c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
278d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
278e0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
278f0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
27900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27910 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20  memset(pMem, 0, 
27920 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
27930 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64   }.      pShmNod
27940 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d  e->apRegion[pShm
27950 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d  Node->nRegion] =
27960 20 70 4d 65 6d 3b 0a 20 20 20 20 20 20 70 53 68   pMem;.      pSh
27970 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b  mNode->nRegion++
27980 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d  ;.    }.  }..shm
27990 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
279a0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
279b0 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  n>iRegion ){.   
279c0 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d   *pp = pShmNode-
279d0 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f  >apRegion[iRegio
279e0 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n];.  }else{.   
279f0 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
27a00 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73  if( pShmNode->is
27a10 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d  Readonly && rc==
27a20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
27a30 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
27a40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
27a50 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
27a60 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
27a70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27a80 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
27a90 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72  state for a shar
27aa0 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
27ab0 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  t..**.** Note th
27ac0 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73  at the relations
27ad0 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52  hip between SHAR
27ae0 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45  Ed and EXCLUSIVE
27af0 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74   locks is a litt
27b00 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  le.** different 
27b10 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73  here than in pos
27b20 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b  ix.  In xShmLock
27b30 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66  (), one can go f
27b40 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20  rom unlocked.** 
27b50 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61  to shared and ba
27b60 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63  ck or from unloc
27b70 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ked to exclusive
27b80 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20   and back.  But 
27b90 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67  one may.** not g
27ba0 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f  o from shared to
27bb0 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72   exclusive or fr
27bc0 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20  om exclusive to 
27bd0 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  shared..*/.stati
27be0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63  c int unixShmLoc
27bf0 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
27c00 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
27c10 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
27c20 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
27c30 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
27c40 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
27c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
27c60 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
27c70 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
27c80 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
27c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27ca0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
27cb0 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
27cc0 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
27cd0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
27ce0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
27cf0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
27d00 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ock */.){.  unix
27d10 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
27d20 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  nixFile*)fd;    
27d30 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
27d40 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
27d50 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53  emory */.  unixS
27d60 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
27d70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
27d80 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
27d90 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
27da0 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ed */.  unixShm 
27db0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27dd0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
27de0 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
27df0 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
27e00 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
27e10 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65  ShmNode;  /* The
27e20 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
27e30 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   iNode */.  int 
27e40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e60 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
27e70 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
27e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
27ea0 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
27eb0 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
27ec0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  */..  assert( pS
27ed0 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
27ee0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
27ef0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
27f00 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
27f10 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
27f20 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
27f30 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
27f40 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
27f50 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
27f60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
27f70 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
27f80 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
27f90 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
27fa0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
27fb0 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
27fc0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
27fd0 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
27fe0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
27ff0 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
28000 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
28010 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
28020 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
28030 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
28040 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
28050 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
28060 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
28070 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
28080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
28090 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70  mNode->h>=0 || p
280a0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
280b0 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b  rocessLock==1 );
280c0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
280d0 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46  ode->h<0 || pDbF
280e0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
280f0 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  essLock==0 );.. 
28100 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73   mask = (1<<(ofs
28110 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74  t+n)) - (1<<ofst
28120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
28130 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
28140 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
28150 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
28160 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
28170 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
28180 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
28190 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
281a0 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
281b0 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
281c0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
281d0 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
281e0 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
281f0 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
28200 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
28210 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
28220 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
28230 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
28240 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
28250 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
28260 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
28270 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
28280 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
28290 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
282a0 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
282b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
282c0 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
282d0 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
282e0 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
282f0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
28300 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
28310 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
28320 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  , F_UNLCK, ofst+
28330 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
28340 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
28350 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28360 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
28370 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c  * Undo the local
28380 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
28390 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
283a0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  ){.      p->excl
283b0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
283c0 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
283d0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
283e0 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   } .  }else if( 
283f0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
28400 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
28410 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
28420 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
28430 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
28440 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
28450 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
28460 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
28470 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
28480 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
28490 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
284a0 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
284b0 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
284c0 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
284d0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
284e0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
284f0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
28500 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
28510 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
28520 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
28530 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
28540 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
28550 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
28560 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
28570 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
28580 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
28590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
285a0 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
285b0 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
285c0 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
285d0 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
285e0 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
285f0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
28600 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28610 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
28620 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
28630 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
28640 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
28650 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
28660 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  e, F_RDLCK, ofst
28670 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
28680 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
28690 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
286a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
286b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
286c0 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
286d0 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  red locks */.   
286e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
286f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  OK ){.      p->s
28700 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
28710 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
28720 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  {.    /* Make su
28730 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f  re no sibling co
28740 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c  nnections hold l
28750 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ocks that will b
28760 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a  lock this.    **
28770 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64   lock.  If any d
28780 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  o, return SQLITE
28790 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79  _BUSY right away
287a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
287b0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
287c0 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
287d0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
287e0 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
287f0 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28   & mask)!=0 || (
28800 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  pX->sharedMask &
28810 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
28820 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28830 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
28840 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
28850 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65    }.  .    /* Ge
28860 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
28870 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
28880 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e  tem level.  Then
28890 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20   if successful. 
288a0 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20     ** also mark 
288b0 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  the local connec
288c0 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f  tion as being lo
288d0 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cked..    */.   
288e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
288f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
28900 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
28910 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57  ck(pShmNode, F_W
28920 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f  RLCK, ofst+UNIX_
28930 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
28940 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28950 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28960 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61   assert( (p->sha
28970 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  redMask & mask)=
28980 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
28990 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
289a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
289b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
289c0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
289d0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f  ode->mutex);.  O
289e0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
289f0 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d  K shmid-%d, pid-
28a00 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78  %d got %03x,%03x
28a10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
28a20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c  p->id, getpid(),
28a30 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20   p->sharedMask, 
28a40 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20  p->exclMask));. 
28a50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28a60 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
28a70 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
28a80 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20  or memory fence 
28a90 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
28aa0 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f  .  .**.** All lo
28ab0 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62  ads and stores b
28ac0 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20  egun before the 
28ad0 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d  barrier must com
28ae0 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20  plete before.** 
28af0 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72  any load or stor
28b00 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68  e begun after th
28b10 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74  e barrier..*/.st
28b20 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
28b30 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
28b40 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
28b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
28b60 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
28b70 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
28b80 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55  memory */.){.  U
28b90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
28ba0 66 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  fd);.  unixEnter
28bb0 4d 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c  Mutex();.  unixL
28bc0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a  eaveMutex();.}..
28bd0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f  /*.** Close a co
28be0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
28bf0 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65  ed-memory.  Dele
28c00 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  te the underlyin
28c10 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66  g .** storage if
28c20 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74   deleteFlag is t
28c30 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
28c40 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64  ere is no shared
28c50 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
28c60 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e  ed with the conn
28c70 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73  ection then this
28c80 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61  .** routine is a
28c90 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
28ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
28cb0 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73  nixShmUnmap(.  s
28cc0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28ce0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
28cf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
28d00 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  /.  int deleteFl
28d10 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
28d20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68      /* Delete sh
28d30 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74  ared-memory if t
28d40 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  rue */.){.  unix
28d50 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
28d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28d70 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
28d80 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
28d90 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
28da0 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  mNode;          
28db0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
28dc0 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
28dd0 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  file */.  unixSh
28de0 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20  m **pp;         
28df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
28e00 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69   looping over si
28e10 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
28e20 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  s */.  unixFile 
28e30 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20  *pDbFd;         
28e40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
28e50 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
28e60 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62  e file */..  pDb
28e70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
28e80 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d  fd;.  p = pDbFd-
28e90 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d  >pShm;.  if( p==
28ea0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
28eb0 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  E_OK;.  pShmNode
28ec0 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
28ed0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
28ee0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
28ef0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a  de->pShmNode );.
28f00 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
28f10 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
28f20 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20  d->pInode );..  
28f30 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
28f40 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
28f50 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
28f60 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
28f70 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
28f80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
28f90 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
28fa0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
28fb0 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
28fc0 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
28fd0 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
28fe0 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
28ff0 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
29000 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
29010 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
29020 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
29030 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
29040 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
29050 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
29060 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
29070 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
29080 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
29090 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
290a0 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
290b0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
290c0 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e   too */.  unixEn
290d0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
290e0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
290f0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d  nRef>0 );.  pShm
29100 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Node->nRef--;.  
29110 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
29120 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef==0 ){.    if(
29130 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70   deleteFlag && p
29140 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20  ShmNode->h>=0 ) 
29150 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64  osUnlink(pShmNod
29160 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
29170 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28     unixShmPurge(
29180 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  pDbFd);.  }.  un
29190 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
291a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
291b0 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23  _OK;.}...#else.#
291c0 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d   define unixShmM
291d0 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
291e0 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20  e unixShmLock   
291f0 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
29200 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
29210 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d  efine unixShmUnm
29220 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  ap   0.#endif /*
29230 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
29240 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
29250 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65  ** Here ends the
29260 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
29270 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  of all sqlite3_f
29280 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a  ile methods..**.
29290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
292a0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74  ****** End sqlit
292b0 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20  e3_file Methods 
292c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
292d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
292e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
292f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
29330 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  ./*.** This divi
29340 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65  sion contains de
29350 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c  finitions of sql
29360 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29370 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20  objects that.** 
29380 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75  implement variou
29390 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73  s file locking s
293a0 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20 61  trategies.  It a
293b0 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66  lso contains def
293c0 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22  initions.** of "
293d0 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
293e0 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e  s.  A finder-fun
293f0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
29400 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70 72   locate the appr
29410 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74  opriate.** sqlit
29420 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
29430 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74 69  ject for a parti
29440 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 66  cular database f
29450 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44 61  ile.  The pAppDa
29460 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ta.** field of t
29470 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56  he sqlite3_vfs V
29480 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69  FS objects are i
29490 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65  nitialized to be
294a0 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
294b0 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64  the correct find
294c0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er-function for 
294d0 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20  that VFS..**.** 
294e0 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63  Most finder func
294f0 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70  tions return a p
29500 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65  ointer to a fixe
29510 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  d sqlite3_io_met
29520 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20  hods.** object. 
29530 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65   The only intere
29540 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e  sting finder-fun
29550 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63  ction is autoloc
29560 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68  kIoFinder, which
29570 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  .** looks at the
29580 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   filesystem type
29590 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75   and tries to gu
295a0 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ess the best loc
295b0 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79  king.** strategy
295c0 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a   from that..**.*
295d0 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e  * For finder-fun
295e0 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65  tion F, two obje
295f0 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a  cts are created:
29600 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68  .**.**    (1) Th
29610 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75  e real finder-fu
29620 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49  nction named "FI
29630 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  mpt()"..**.**   
29640 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20   (2) A constant 
29650 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
29660 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a  function named j
29670 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a  ust "F"..**.**.*
29680 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * A pointer to t
29690 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20  he F pointer is 
296a0 75 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70  used as the pApp
296b0 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56  Data value for V
296c0 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20  FS.** objects.  
296d0 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68  We have to do th
296e0 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65  is instead of le
296f0 74 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70  tting pAppData p
29700 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79  oint.** directly
29710 20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66   at the finder-f
29720 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39  unction since C9
29730 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20  0 rules prevent 
29740 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20  a void*.** from 
29750 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66  be cast into a f
29760 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e  unction pointer.
29770 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69  .**.**.** Each i
29780 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
29790 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20  macro generates 
297a0 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a  two objects:.**.
297b0 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61  **   *  A consta
297c0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  nt sqlite3_io_me
297d0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c  thods object cal
297e0 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61  l METHOD that ha
297f0 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20  s locking.**    
29800 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c    methods CLOSE,
29810 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43   LOCK, UNLOCK, C
29820 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  KRESLOCK..**.** 
29830 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68    *  An I/O meth
29840 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
29850 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52  on called FINDER
29860 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20   that returns a 
29870 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20  pointer.**      
29880 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62  to the METHOD ob
29890 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76  ject in the prev
298a0 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a  ious bullet..*/.
298b0 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44  #define IOMETHOD
298c0 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44  S(FINDER, METHOD
298d0 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45  , VERSION, CLOSE
298e0 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20  , LOCK, UNLOCK, 
298f0 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73  CKLOCK)      \.s
29900 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
29910 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d  te3_io_methods M
29920 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20  ETHOD = {       
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 5c 0a 20 20              \.  
29950 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20   VERSION,       
29960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29970 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20  iVersion */     
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 5c 0a 20 20 20             \.   
299a0 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20  CLOSE,          
299b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
299c0 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20  Close */        
299d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
299f0 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20  nixRead,        
29a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
29a10 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ead */          
29a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a30 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
29a40 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  ixWrite,        
29a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
29a60 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ite */          
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 5c 0a 20 20 20 75 6e 69          \.   uni
29a90 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  xTruncate,      
29aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
29ab0 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20  ncate */        
29ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ad0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
29ae0 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
29af0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
29b00 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
29b30 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
29b40 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
29b50 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
29b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b70 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20       \.   LOCK, 
29b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b90 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
29ba0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
29bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bc0 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c      \.   UNLOCK,
29bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29be0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
29bf0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
29c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c10 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20     \.   CKLOCK, 
29c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c30 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
29c40 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20  ervedLock */    
29c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c60 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43    \.   unixFileC
29c70 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
29c80 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
29c90 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ol */           
29ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cb0 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72   \.   unixSector
29cc0 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
29cd0 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
29ce0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
29cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d00 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43  \.   unixDeviceC
29d10 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
29d20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62   /* xDeviceCapab
29d30 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20  ilities */      
29d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
29d50 0a 20 20 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20  .   unixShmMap, 
29d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d70 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20  /* xShmMap */   
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 5c 0a                \.
29da0 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20     unixShmLock, 
29db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29dc0 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20  * xShmLock */   
29dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29de0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
29df0 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72    unixShmBarrier
29e00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
29e10 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20   xShmBarrier */ 
29e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e30 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
29e40 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20   unixShmUnmap   
29e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e60 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20  xShmUnmap */    
29e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e80 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20             \.}; 
29e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ed0 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
29ee0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
29ef0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e  _io_methods *FIN
29f00 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20  DER##Impl(const 
29f10 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c  char *z, unixFil
29f20 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55  e *p){   \.  UNU
29f30 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29  SED_PARAMETER(z)
29f40 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  ; UNUSED_PARAMET
29f50 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20  ER(p);          
29f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f70 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75          \.  retu
29f80 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20  rn &METHOD;     
29f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fc0 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20         \.}      
29fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a010 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
2a020 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2a030 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74  methods *(*const
2a040 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63   FINDER)(const c
2a050 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70  har*,unixFile *p
2a060 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e  )    \.    = FIN
2a070 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a  DER##Impl;../*.*
2a080 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f  * Here are all o
2a090 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  f the sqlite3_io
2a0a0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
2a0b0 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65   for each of the
2a0c0 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  .** locking stra
2a0d0 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f  tegies.  Functio
2a0e0 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70  ns that return p
2a0f0 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65  ointers to these
2a100 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20   methods.** are 
2a110 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f  also created..*/
2a120 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f  .IOMETHODS(.  po
2a130 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  sixIoFinder,    
2a140 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2a150 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2a160 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68  */.  posixIoMeth
2a170 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
2a180 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2a190 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2a1a0 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20   */.  2,        
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1c0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2a1d0 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
2a1e0 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
2a1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2a200 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2a210 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
2a220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2a230 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2a240 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  unixUnlock,     
2a250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2a260 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2a270 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
2a280 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43  edLock     /* xC
2a290 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2a2a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
2a2b0 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b  ETHODS(.  nolock
2a2c0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2a2d0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
2a2e0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
2a2f0 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73   nolockIoMethods
2a300 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ,          /* sq
2a310 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a320 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
2a330 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
2a340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2a350 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
2a360 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f  disabled */.  no
2a370 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
2a380 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
2a390 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  e method */.  no
2a3a0 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
2a3b0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
2a3c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
2a3d0 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
2a3e0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2a3f0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  k method */.  no
2a400 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
2a410 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63  dLock   /* xChec
2a420 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
2a430 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
2a440 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  ODS(.  dotlockIo
2a450 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2a460 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2a470 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f  ion name */.  do
2a480 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  tlockIoMethods, 
2a490 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2a4a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2a4b0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
2a4c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2a4e0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2a4f0 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  abled */.  dotlo
2a500 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
2a510 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2a520 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
2a530 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
2a540 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2a550 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
2a560 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
2a570 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2a580 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
2a590 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
2a5a0 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ock  /* xCheckRe
2a5b0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2a5c0 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49  d */.)..#if SQLI
2a5d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2a5e0 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
2a5f0 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
2a600 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65  (.  flockIoFinde
2a610 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2a620 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2a630 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b   name */.  flock
2a640 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
2a650 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2a660 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2a670 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
2a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a690 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2a6a0 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
2a6b0 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f  ed */.  flockClo
2a6c0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2a6d0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2a6e0 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63  od */.  flockLoc
2a6f0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2a700 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2a710 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f  d */.  flockUnlo
2a720 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2a730 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2a740 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65  od */.  flockChe
2a750 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
2a760 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2a770 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2a780 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
2a790 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54  OS_VXWORKS.IOMET
2a7a0 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e  HODS(.  semIoFin
2a7b0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
2a7c0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
2a7d0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73  tion name */.  s
2a7e0 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  emIoMethods,    
2a7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2a800 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2a810 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
2a820 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
2a830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
2a840 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
2a850 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43  sabled */.  semC
2a860 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2a870 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
2a880 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c  method */.  semL
2a890 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2a8a0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
2a8b0 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e  ethod */.  semUn
2a8c0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
2a8d0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
2a8e0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43  method */.  semC
2a8f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2a900 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
2a910 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
2a920 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
2a930 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2a940 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2a950 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2a960 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
2a970 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20  .  afpIoFinder, 
2a980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a990 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
2a9a0 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d  name */.  afpIoM
2a9b0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2a9c0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
2a9d0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2a9e0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
2a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa00 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2aa10 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2aa20 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c  d */.  afpClose,
2aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa40 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2aa50 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20  d */.  afpLock, 
2aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa70 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2aa80 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c   */.  afpUnlock,
2aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaa0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2aab0 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52  d */.  afpCheckR
2aac0 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
2aad0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2aae0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2aaf0 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .).#endif../*.**
2ab00 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69   The proxy locki
2ab10 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22  ng method is a "
2ab20 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e  super-method" in
2ab30 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20   the sense that 
2ab40 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f  it.** opens seco
2ab50 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72  ndary file descr
2ab60 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63  iptors for the c
2ab70 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69  onch and lock fi
2ab80 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73  les and.** it us
2ab90 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69  es proxy, dot-fi
2aba0 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f  le, AFP, and flo
2abb0 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  ck() locking met
2abc0 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a  hods on those.**
2abd0 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73   secondary files
2abe0 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  .  For this reas
2abf0 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
2ac00 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
2ac10 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** proxy lockin
2ac20 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63  g is located muc
2ac30 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69  h further down i
2ac40 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74  n the file.  But
2ac50 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67   we need.** to g
2ac60 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69  o ahead and defi
2ac70 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ne the sqlite3_i
2ac80 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69  o_methods and fi
2ac90 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  nder function.**
2aca0 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
2acb0 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20  ng here.  So we 
2acc0 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20  forward declare 
2acd0 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e  the I/O methods.
2ace0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
2acf0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2ad00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2ad10 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63  ING_STYLE.static
2ad20 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28   int proxyClose(
2ad30 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
2ad40 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2ad50 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
2ad60 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63  e*, int);.static
2ad70 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b   int proxyUnlock
2ad80 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
2ad90 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
2ada0 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
2adb0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
2adc0 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f  file*, int*);.IO
2add0 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79  METHODS(.  proxy
2ade0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2adf0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
2ae00 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
2ae10 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73    proxyIoMethods
2ae20 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
2ae30 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2ae40 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2ae50 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20  .  2,           
2ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae70 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
2ae80 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72   enabled */.  pr
2ae90 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  oxyClose,       
2aea0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
2aeb0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  e method */.  pr
2aec0 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  oxyLock,        
2aed0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
2aee0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
2aef0 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  xyUnlock,       
2af00 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2af10 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
2af20 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
2af30 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63  Lock    /* xChec
2af40 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
2af50 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
2af60 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f  ../* nfs lockd o
2af70 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73  n OSX 10.3+ does
2af80 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20  n't clear write 
2af90 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61  locks when a rea
2afa0 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f  d lock is set */
2afb0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2afc0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2afd0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2afe0 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
2aff0 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c  (.  nfsIoFinder,
2b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b010 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2b020 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49  n name */.  nfsI
2b030 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
2b040 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
2b050 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
2b060 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
2b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b080 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2b090 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2b0a0 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
2b0b0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2b0c0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
2b0d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
2b0e0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2b0f0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2b100 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55  method */.  nfsU
2b110 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2b120 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2b130 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
2b140 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
2b150 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
2b160 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
2b170 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
2b180 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
2b190 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2b1a0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2b1b0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
2b1c0 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
2b1d0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
2b1e0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2b1f0 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
2b200 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
2b210 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b220 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
2b230 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
2b240 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
2b250 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
2b260 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
2b270 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
2b280 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
2b290 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a  MacOSX only..*/.
2b2a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2b2b0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2b2c0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
2b2d0 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
2b2e0 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
2b2f0 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
2b300 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2b310 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
2b320 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
2b330 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
2b340 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
2b350 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
2b360 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
2b370 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
2b380 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2b390 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
2b3a0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
2b3b0 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
2b3c0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
2b3d0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2b3e0 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
2b3f0 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
2b400 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
2b410 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
2b420 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
2b430 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
2b440 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
2b450 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
2b460 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
2b470 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
2b480 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  },.    { "smbfs"
2b490 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
2b4a0 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
2b4b0 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  v", &nolockIoMet
2b4c0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c  hods },.    { 0,
2b4d0 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
2b4e0 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
2b4f0 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72  fs fsInfo;.  str
2b500 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
2b510 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
2b520 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
2b530 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
2b540 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
2b550 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
2b560 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
2b570 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
2b580 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
2b590 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
2b5a0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
2b5b0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69  Methods;.  }.  i
2b5c0 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61  f( statfs(filePa
2b5d0 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
2b5e0 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73  -1 ){.    if( fs
2b5f0 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
2b600 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  NT_RDONLY ){.   
2b610 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
2b620 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  kIoMethods;.    
2b630 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61  }.    for(i=0; a
2b640 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
2b650 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
2b660 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
2b670 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
2b680 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
2b690 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tem)==0 ){.     
2b6a0 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69     return aMap[i
2b6b0 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ].pMethods;.    
2b6c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2b6d0 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65   /* Default case
2b6e0 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67  . Handles, among
2b6f0 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22  st others, "nfs"
2b700 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65  ..  ** Test byte
2b710 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
2b720 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
2b730 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
2b740 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
2b750 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
2b760 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
2b770 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
2b780 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
2b790 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
2b7a0 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
2b7b0 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
2b7c0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
2b7d0 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
2b7e0 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
2b7f0 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
2b800 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
2b810 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
2b820 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   {.    if( strcm
2b830 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
2b840 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
2b850 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2b860 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a   &nfsIoMethods;.
2b870 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2b880 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
2b890 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
2b8a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2b8b0 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
2b8c0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
2b8d0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2b8e0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
2b8f0 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
2b900 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
2b910 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2b920 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
2b930 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
2b940 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
2b950 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2b960 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2b970 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
2b980 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51  OS_VXWORKS && SQ
2b990 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2b9a0 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
2b9b0 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
2b9c0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
2b9d0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
2b9e0 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
2b9f0 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
2ba00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ba10 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
2ba20 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
2ba30 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
2ba40 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
2ba50 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
2ba60 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
2ba70 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
2ba80 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a   VXWorks only..*
2ba90 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
2baa0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2bab0 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
2bac0 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
2bad0 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
2bae0 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
2baf0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2bb00 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
2bb10 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
2bb20 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  * the open file 
2bb30 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73  object */.){.  s
2bb40 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
2bb50 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
2bb60 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
2bb70 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
2bb80 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
2bb90 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
2bba0 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
2bbb0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
2bbc0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
2bbd0 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
2bbe0 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
2bbf0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a  IoMethods;.  }..
2bc00 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e    /* Test if fcn
2bc10 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65  tl() is supporte
2bc20 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20  d and use POSIX 
2bc30 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a  style locks..  *
2bc40 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c  * Otherwise fall
2bc50 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d   back to the nam
2bc60 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74  ed semaphore met
2bc70 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  hod..  */.  lock
2bc80 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
2bc90 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
2bca0 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
2bcb0 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
2bcc0 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
2bcd0 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
2bce0 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
2bcf0 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
2bd00 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
2bd10 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
2bd20 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
2bd30 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
2bd40 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65   return &semIoMe
2bd50 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
2bd60 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2bd70 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
2bd80 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
2bd90 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
2bda0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2bdb0 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
2bdc0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
2bdd0 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
2bde0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2bdf0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
2be00 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
2be10 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
2be20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20  pointer to a IO 
2be30 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
2be40 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
2be50 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
2be60 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
2be70 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
2be80 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2be90 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);.../*********
2bea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2beb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bee0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
2bef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bf00 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
2bf10 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
2bf20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bf30 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
2bf40 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
2bf50 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2bf60 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
2bf70 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
2bf80 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
2bf90 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
2bfa0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2bfb0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
2bfc0 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
2bfd0 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
2bfe0 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
2bff0 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
2c000 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2c010 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2c020 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
2c030 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
2c040 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
2c050 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2c060 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
2c070 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 79  ened */.  int sy
2c080 6e 63 44 69 72 2c 20 20 20 20 20 20 20 20 20 20  ncDir,          
2c090 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 79 6e    /* True to syn
2c0a0 63 20 64 69 72 65 63 74 6f 72 79 20 6f 6e 20 66  c directory on f
2c0b0 69 72 73 74 20 73 79 6e 63 20 2a 2f 0a 20 20 73  irst sync */.  s
2c0c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64  qlite3_file *pId
2c0d0 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ,      /* Write 
2c0e0 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  to the unixFile 
2c0f0 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
2c100 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2c110 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
2c120 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
2c130 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
2c140 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20    int noLock,   
2c150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69            /* Omi
2c160 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72 75  t locking if tru
2c170 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 65 6c  e */.  int isDel
2c180 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ete,           /
2c190 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73  * Delete on clos
2c1a0 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69  e if true */.  i
2c1b0 6e 74 20 69 73 52 65 61 64 4f 6e 6c 79 20 20 20  nt isReadOnly   
2c1c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2c1d0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6f 70  f the file is op
2c1e0 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  ened read-only *
2c1f0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  /.){.  const sql
2c200 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2c210 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  *pLockingStyle;.
2c220 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2c230 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
2c240 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Id;.  int rc = S
2c250 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2c260 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64  ert( pNew->pInod
2c270 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a  e==NULL );..  /*
2c280 20 50 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c   Parameter isDel
2c290 65 74 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ete is only used
2c2a0 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78 70   on vxworks. Exp
2c2b0 72 65 73 73 20 74 68 69 73 20 65 78 70 6c 69 63  ress this explic
2c2c0 69 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65 20  itly .  ** here 
2c2d0 74 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69  to prevent compi
2c2e0 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f  ler warnings abo
2c2f0 75 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65  ut unused parame
2c300 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55  ters..  */.  UNU
2c310 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73  SED_PARAMETER(is
2c320 44 65 6c 65 74 65 29 3b 0a 0a 20 20 2f 2a 20 55  Delete);..  /* U
2c330 73 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20  sually the path 
2c340 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64  zFilename should
2c350 20 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69   not be a relati
2c360 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ve pathname. The
2c370 0a 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20  .  ** exception 
2c380 69 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  is when opening 
2c390 74 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68  the proxy "conch
2c3a0 22 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73  " file in builds
2c3b0 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75   that.  ** inclu
2c3c0 64 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41  de the special A
2c3d0 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79  pple locking sty
2c3e0 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  les..  */.#if de
2c3f0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2c400 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2c410 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2c420 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2c430 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
2c440 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20  ame[0]=='/' .   
2c450 20 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61   || pVfs->pAppDa
2c460 74 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f  ta==(void*)&auto
2c470 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a  lockIoFinder );.
2c480 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20  #else.  assert( 
2c490 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
2c4a0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f  zFilename[0]=='/
2c4b0 27 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  ' );.#endif..  O
2c4c0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20  STRACE(("OPEN   
2c4d0 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20   %-3d %s\n", h, 
2c4e0 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70  zFilename));.  p
2c4f0 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
2c500 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c  ew->zPath = zFil
2c510 65 6e 61 6d 65 3b 0a 20 20 69 66 28 20 6d 65 6d  ename;.  if( mem
2c520 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c  cmp(pVfs->zName,
2c530 22 75 6e 69 78 2d 65 78 63 6c 22 2c 31 30 29 3d  "unix-excl",10)=
2c540 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 ){.    pNew->
2c550 63 74 72 6c 46 6c 61 67 73 20 3d 20 55 4e 49 58  ctrlFlags = UNIX
2c560 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 65 6c  FILE_EXCL;.  }el
2c570 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74  se{.    pNew->ct
2c580 72 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d  rlFlags = 0;.  }
2c590 0a 20 20 69 66 28 20 69 73 52 65 61 64 4f 6e 6c  .  if( isReadOnl
2c5a0 79 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  y ){.    pNew->c
2c5b0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2c5c0 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d  FILE_RDONLY;.  }
2c5d0 0a 20 20 69 66 28 20 73 79 6e 63 44 69 72 20 29  .  if( syncDir )
2c5e0 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
2c5f0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2c600 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 0a  E_DIRSYNC;.  }..
2c610 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2c620 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77   pNew->pId = vxw
2c630 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a  orksFindFileId(z
2c640 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
2c650 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b   pNew->pId==0 ){
2c660 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b  .    noLock = 1;
2c670 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2c680 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64  _NOMEM;.  }.#end
2c690 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b  if..  if( noLock
2c6a0 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67   ){.    pLocking
2c6b0 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49  Style = &nolockI
2c6c0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
2c6d0 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  e{.    pLockingS
2c6e0 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65  tyle = (**(finde
2c6f0 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41  r_type*)pVfs->pA
2c700 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d  ppData)(zFilenam
2c710 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51  e, pNew);.#if SQ
2c720 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2c730 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a  ING_STYLE.    /*
2c740 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65   Cache zFilename
2c750 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
2c760 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64  context (AFP and
2c770 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64   dotlock overrid
2c780 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72  e) for.    ** pr
2c790 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69  oxyLock activati
2c7a0 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28  on is possible (
2c7b0 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20  remote proxy is 
2c7c0 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65  based on db name
2c7d0 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61  ).    ** zFilena
2c7e0 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  me remains valid
2c7f0 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63   until file is c
2c800 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72  losed, to suppor
2c810 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  t */.    pNew->l
2c820 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
2c830 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65  (void*)zFilename
2c840 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
2c850 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2c860 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74  e == &posixIoMet
2c870 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64  hods.#if defined
2c880 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2c890 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2c8a0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c  KING_STYLE.    |
2c8b0 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  | pLockingStyle 
2c8c0 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  == &nfsIoMethods
2c8d0 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20  .#endif.  ){.   
2c8e0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2c8f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
2c900 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
2c910 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
2c920 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2c930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
2c940 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2c950 63 75 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f  cured in findIno
2c960 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20  deInfo(), close 
2c970 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2c980 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d  tor.      ** imm
2c990 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65  ediately, before
2c9a0 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d   releasing the m
2c9b0 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49  utex. findInodeI
2c9c0 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20  nfo() may fail. 
2c9d0 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73       ** in two s
2c9e0 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20  cenarios:.      
2c9f0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61  **.      **   (a
2ca00 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61  ) A call to fsta
2ca10 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  t() failed..    
2ca20 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c    **   (b) A mal
2ca30 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  loc failed..    
2ca40 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63    **.      ** Sc
2ca50 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f  enario (b) may o
2ca60 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65  nly occur if the
2ca70 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
2ca80 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20  ing no other.   
2ca90 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72     ** file descr
2caa0 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  iptors open on t
2cab0 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66  he same file. If
2cac0 20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65   there were othe
2cad0 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  r file.      ** 
2cae0 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74  descriptors on t
2caf0 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e  his file, then n
2cb00 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62  o malloc would b
2cb10 65 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  e required by.  
2cb20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65      ** findInode
2cb30 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20  Info(). If this 
2cb40 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
2cb50 69 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f  is quite safe to
2cb60 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20   close.      ** 
2cb70 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74  handle h - as it
2cb80 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2cb90 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63  hat no posix loc
2cba0 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61  ks will be relea
2cbb0 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  sed.      ** by 
2cbc0 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20  doing so..      
2cbd0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73  **.      ** If s
2cbe0 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73  cenario (a) caus
2cbf0 65 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65  ed the error the
2cc00 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74  n things are not
2cc10 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20   so safe. The.  
2cc20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20      ** implicit 
2cc30 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20  assumption here 
2cc40 69 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74  is that if fstat
2cc50 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73  () fails, things
2cc60 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a   are in.      **
2cc70 20 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20   such bad shape 
2cc80 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20  that dropping a 
2cc90 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73  lock or two does
2cca0 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e  n't matter much.
2ccb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ccc0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2ccd0 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2cce0 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20  .      h = -1;. 
2ccf0 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
2cd00 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a  veMutex();.  }..
2cd10 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2cd20 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
2cd30 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2cd40 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28  LE__).  else if(
2cd50 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2cd60 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
2cd70 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f  ){.    /* AFP lo
2cd80 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
2cd90 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
2cda0 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
2cdb0 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
2cdc0 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
2cdd0 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext..    */.    
2cde0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
2cdf0 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65  t *pCtx;.    pNe
2ce00 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
2ce10 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74  t = pCtx = sqlit
2ce20 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
2ce30 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20  f(*pCtx) );.    
2ce40 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
2ce50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2ce60 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
2ce70 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  e{.      /* NB: 
2ce80 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
2ce90 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
2cea0 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
2ceb0 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
2cec0 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
2ced0 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
2cee0 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
2cef0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
2cf00 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
2cf10 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
2cf20 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d  . */.      pCtx-
2cf30 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  >dbPath = zFilen
2cf40 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d  ame;.      pCtx-
2cf50 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20  >reserved = 0;. 
2cf60 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28       srandomdev(
2cf70 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74  );.      unixEnt
2cf80 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  erMutex();.     
2cf90 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
2cfa0 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
2cfb0 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20  >pInode);.      
2cfc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cfd0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
2cfe0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
2cff0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
2d000 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f  .        robust_
2d010 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2d020 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2d030 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    h = -1;.      
2d040 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  }.      unixLeav
2d050 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  eMutex();       
2d060 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64   .    }.  }.#end
2d070 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70  if..  else if( p
2d080 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2d090 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
2d0a0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66  s ){.    /* Dotf
2d0b0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ile locking uses
2d0c0 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2d0d0 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2d0e0 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
2d0f0 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c   ** the dotlockL
2d100 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20  ockingContext . 
2d110 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
2d120 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69  zLockFile;.    i
2d130 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
2d140 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69    nFilename = (i
2d150 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e  nt)strlen(zFilen
2d160 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c  ame) + 6;.    zL
2d170 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
2d180 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
2d190 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (nFilename);.   
2d1a0 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d   if( zLockFile==
2d1b0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2d1c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2d1d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2d1e0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2d1f0 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b  nFilename, zLock
2d200 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f  File, "%s" DOTLO
2d210 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65  CK_SUFFIX, zFile
2d220 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
2d230 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
2d240 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c  ntext = zLockFil
2d250 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  e;.  }..#if OS_V
2d260 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66  XWORKS.  else if
2d270 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2d280 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73  == &semIoMethods
2d290 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64   ){.    /* Named
2d2a0 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
2d2b0 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
2d2c0 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
2d2d0 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69  s to be.    ** i
2d2e0 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
2d2f0 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  emLockingContext
2d300 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78  .    */.    unix
2d310 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2d320 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
2d330 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
2d340 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
2d350 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( (rc==SQLITE_O
2d360 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e  K) && (pNew->pIn
2d370 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29  ode->pSem==NULL)
2d380 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
2d390 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d  zSemName = pNew-
2d3a0 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
2d3b0 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  e;.      int n;.
2d3c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2d3d0 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
2d3e0 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22  AME, zSemName, "
2d3f0 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20  /%s.sem",.      
2d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d410 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e   pNew->pId->zCan
2d420 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
2d430 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65     for( n=1; zSe
2d440 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a  mName[n]; n++ ).
2d450 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d          if( zSem
2d460 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a  Name[n]=='/' ) z
2d470 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27  SemName[n] = '_'
2d480 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49  ;.      pNew->pI
2d490 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d  node->pSem = sem
2d4a0 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20  _open(zSemName, 
2d4b0 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31  O_CREAT, 0666, 1
2d4c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
2d4d0 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20  w->pInode->pSem 
2d4e0 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b  == SEM_FAILED ){
2d4f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2d500 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2d510 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65      pNew->pInode
2d520 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20  ->aSemName[0] = 
2d530 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20  '\0';.      }.  
2d540 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
2d550 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
2d560 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e  ndif.  .  pNew->
2d570 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23  lastErrno = 0;.#
2d580 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2d590 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d5a0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d  K ){.    if( h>=
2d5b0 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  0 ) robust_close
2d5c0 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
2d5d0 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b  __);.    h = -1;
2d5e0 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46  .    osUnlink(zF
2d5f0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73  ilename);.    is
2d600 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a  Delete = 0;.  }.
2d610 20 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65    pNew->isDelete
2d620 20 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e   = isDelete;.#en
2d630 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
2d640 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2d650 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74  f( h>=0 ) robust
2d660 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
2d670 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c  __LINE__);.  }el
2d680 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d  se{.    pNew->pM
2d690 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67  ethod = pLocking
2d6a0 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43  Style;.    OpenC
2d6b0 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a  ounter(+1);.  }.
2d6c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d6d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2d6e0 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63   name of a direc
2d6f0 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f  tory in which to
2d700 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66   put temporary f
2d710 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73  iles..** If no s
2d720 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72  uitable temporar
2d730 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79  y file directory
2d740 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
2d750 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
2d760 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2d770 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69   *unixTempFileDi
2d780 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  r(void){.  stati
2d790 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
2d7a0 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Dirs[] = {.     
2d7b0 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20  0,.     0,.     
2d7c0 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/var/tmp",.    
2d7d0 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20   "/usr/tmp",.   
2d7e0 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30    "/tmp",.     0
2d7f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
2d800 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20  terminator */.  
2d810 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  };.  unsigned in
2d820 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
2d830 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20  at buf;.  const 
2d840 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a  char *zDir = 0;.
2d850 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73  .  azDirs[0] = s
2d860 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
2d870 63 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a  ctory;.  if( !az
2d880 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73  Dirs[1] ) azDirs
2d890 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d  [1] = getenv("TM
2d8a0 50 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d  PDIR");.  for(i=
2d8b0 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69  0; i<sizeof(azDi
2d8c0 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72  rs)/sizeof(azDir
2d8d0 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69  s[0]); zDir=azDi
2d8e0 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66  rs[i++]){.    if
2d8f0 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74  ( zDir==0 ) cont
2d900 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
2d910 53 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29  Stat(zDir, &buf)
2d920 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2d930 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75   if( !S_ISDIR(bu
2d940 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e  f.st_mode) ) con
2d950 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f  tinue;.    if( o
2d960 73 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37  sAccess(zDir, 07
2d970 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2d980 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
2d990 65 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f  eturn zDir;.}../
2d9a0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
2d9b0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
2d9c0 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
2d9d0 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
2d9e0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  ed.** by the cal
2d9f0 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64  ling process and
2da00 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
2da10 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c  ugh to hold at l
2da20 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78  east.** pVfs->mx
2da30 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a  Pathname bytes..
2da40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2da50 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  ixGetTempname(in
2da60 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2da70 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  uf){.  static co
2da80 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
2da90 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20  r zChars[] =.   
2daa0 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
2dab0 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
2dac0 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
2dad0 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
2dae0 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b     "0123456789";
2daf0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
2db00 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68  i, j;.  const ch
2db10 61 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20  ar *zDir;..  /* 
2db20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
2db30 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
2db40 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
2db50 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
2db60 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
2db70 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
2db80 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
2db90 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
2dba0 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
2dbb0 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20  tion failing. . 
2dbc0 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
2dbd0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
2dbe0 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20  LITE_IOERR );.. 
2dbf0 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70   zDir = unixTemp
2dc00 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28  FileDir();.  if(
2dc10 20 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20   zDir==0 ) zDir 
2dc20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65  = ".";..  /* Che
2dc30 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70  ck that the outp
2dc40 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72  ut buffer is lar
2dc50 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68  ge enough for th
2dc60 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
2dc70 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20   .  ** name. If 
2dc80 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72  it is not, retur
2dc90 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
2dca0 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c    */.  if( (strl
2dcb0 65 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65  en(zDir) + strle
2dcc0 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  n(SQLITE_TEMP_FI
2dcd0 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29  LE_PREFIX) + 17)
2dce0 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66   >= (size_t)nBuf
2dcf0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2dd00 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2dd10 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69  ..  do{.    sqli
2dd20 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
2dd30 66 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f  f-17, zBuf, "%s/
2dd40 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  "SQLITE_TEMP_FIL
2dd50 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b  E_PREFIX, zDir);
2dd60 0a 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74  .    j = (int)st
2dd70 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20  rlen(zBuf);.    
2dd80 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
2dd90 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29  ss(15, &zBuf[j])
2dda0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2ddb0 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  <15; i++, j++){.
2ddc0 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20        zBuf[j] = 
2ddd0 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28  (char)zChars[ ((
2dde0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42  unsigned char)zB
2ddf0 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a  uf[j])%(sizeof(z
2de00 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20  Chars)-1) ];.   
2de10 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d   }.    zBuf[j] =
2de20 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73   0;.  }while( os
2de30 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d  Access(zBuf,0)==
2de40 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
2de50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
2de60 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2de70 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
2de80 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2de90 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20  )./*.** Routine 
2dea0 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75  to transform a u
2deb0 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70  nixFile into a p
2dec0 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69  roxy-locking uni
2ded0 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d  xFile..** Implem
2dee0 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  entation in the 
2def0 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73  proxy-lock divis
2df00 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79  ion, but used by
2df10 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69   unixOpen().** i
2df20 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
2df30 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73  PROXY_LOCKING is
2df40 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61   defined..*/.sta
2df50 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61  tic int proxyTra
2df60 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75  nsformUnixFile(u
2df70 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20  nixFile*, const 
2df80 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  char*);.#endif..
2df90 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
2dfa0 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
2dfb0 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
2dfc0 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  was opened on th
2dfd0 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
2dfe0 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
2dff0 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75  al or master-jou
2e000 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74  rnal file) ident
2e010 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d  ified by pathnam
2e020 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20  e.** zPath with 
2e030 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20  SQLITE_OPEN_XXX 
2e040 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74  flags matching t
2e050 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74  hose passed as t
2e060 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
2e070 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
2e080 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75  nction..**.** Su
2e090 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  ch a file descri
2e0a0 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69  ptor may exist i
2e0b0 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  f a database con
2e0c0 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73  nection was clos
2e0d0 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73  ed.** but the as
2e0e0 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65  sociated file de
2e0f0 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e  scriptor could n
2e100 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63  ot be closed bec
2e110 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  ause some.** oth
2e120 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
2e130 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  or open on the s
2e140 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64  ame file is hold
2e150 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e  ing a file-lock.
2e160 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d  .** Refer to com
2e170 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69  ments in the uni
2e180 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f  xClose() functio
2e190 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68  n and the length
2e1a0 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73  y comment.** des
2e1b0 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41  cribing "Posix A
2e1c0 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22  dvisory Locking"
2e1d0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2e1e0 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a   this file for .
2e1f0 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69  ** further detai
2e200 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74  ls. Also, ticket
2e210 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66   #4018..**.** If
2e220 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65   a suitable file
2e230 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66   descriptor is f
2e240 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73  ound, then it is
2e250 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
2e260 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65  .** such file de
2e270 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61  scriptor is loca
2e280 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72  ted, -1 is retur
2e290 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55  ned..*/.static U
2e2a0 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e  nixUnusedFd *fin
2e2b0 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73  dReusableFd(cons
2e2c0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69  t char *zPath, i
2e2d0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69  nt flags){.  Uni
2e2e0 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
2e2f0 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f  ed = 0;..  /* Do
2e300 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20   not search for 
2e310 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
2e320 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77  escriptor on vxw
2e330 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73  orks. Not becaus
2e340 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77  e.  ** vxworks w
2e350 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74  ould not benefit
2e360 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65   from the change
2e370 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72   (it might, we'r
2e380 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a  e not sure),.  *
2e390 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f  * but because no
2e3a0 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20   way to test it 
2e3b0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  is currently ava
2e3c0 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65  ilable. It is be
2e3d0 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74  tter .  ** not t
2e3e0 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20  o risk breaking 
2e3f0 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20  vxworks support 
2e400 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20  for the sake of 
2e410 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20  such an obscure 
2e420 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20  .  ** feature.  
2e430 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52  */.#if !OS_VXWOR
2e440 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  KS.  struct stat
2e450 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
2e460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
2e470 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63  ults of stat() c
2e480 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73  all */..  /* A s
2e490 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66  tat() call may f
2e4a0 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ail for various 
2e4b0 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73  reasons. If this
2e4c0 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a   happens, it is.
2e4d0 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74    ** almost cert
2e4e0 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e  ain that an open
2e4f0 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73  () call on the s
2e500 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c  ame path will al
2e510 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f  so fail..  ** Fo
2e520 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69  r this reason, i
2e530 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2e540 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20  s in the stat() 
2e550 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73  call here, it is
2e560 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e  .  ** ignored an
2e570 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  d -1 is returned
2e580 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
2e590 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20  l try to open a 
2e5a0 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65  new file.  ** de
2e5b0 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
2e5c0 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c  same path, fail,
2e5d0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65   and return an e
2e5e0 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a  rror to SQLite..
2e5f0 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69    **.  ** Even i
2e600 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  f a subsequent o
2e610 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20  pen() call does 
2e620 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e  succeed, the con
2e630 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a  sequences of.  *
2e640 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20  * not searching 
2e650 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65 20  for a resusable 
2e660 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2e670 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a  are not dire.  *
2e680 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61  /.  if( 0==osSta
2e690 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29  t(zPath, &sStat)
2e6a0 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64   ){.    unixInod
2e6b0 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a  eInfo *pInode;..
2e6c0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2e6d0 65 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ex();.    pInode
2e6e0 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
2e6f0 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
2e700 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  && (pInode->file
2e710 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74  Id.dev!=sStat.st
2e720 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20  _dev.           
2e730 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e            || pIn
2e740 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21  ode->fileId.ino!
2e750 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29  =sStat.st_ino) )
2e760 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20  {.       pInode 
2e770 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
2e780 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2e790 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55  Inode ){.      U
2e7a0 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70  nixUnusedFd **pp
2e7b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26  ;.      for(pp=&
2e7c0 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
2e7d0 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66   *pp && (*pp)->f
2e7e0 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d  lags!=flags; pp=
2e7f0 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
2e800 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  ;.      pUnused 
2e810 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28  = *pp;.      if(
2e820 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20   pUnused ){.    
2e830 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65      *pp = pUnuse
2e840 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  d->pNext;.      
2e850 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  }.    }.    unix
2e860 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2e870 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69  }.#endif    /* i
2e880 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  f !OS_VXWORKS */
2e890 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65  .  return pUnuse
2e8a0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  d;.}../*.** This
2e8b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2e8c0 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28  led by unixOpen(
2e8d0 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  ) to determine t
2e8e0 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69  he unix permissi
2e8f0 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  ons.** to create
2e900 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e   new files with.
2e910 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
2e920 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
2e930 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
2e940 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73  ** and a value s
2e950 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73  uitable for pass
2e960 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64  ing as the third
2e970 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65   argument to ope
2e980 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74  n(2) is.** writt
2e990 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66  en to *pMode. If
2e9a0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2e9b0 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
2e9c0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
2e9d0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
2e9e0 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64  e value of *pMod
2e9f0 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65  e is not modifie
2ea00 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
2ea10 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
2ea20 64 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  d is a temporary
2ea30 20 66 69 6c 65 2c 20 69 74 20 69 73 20 61 6c 77   file, it is alw
2ea40 61 79 73 20 63 72 65 61 74 65 64 20 77 69 74 68  ays created with
2ea50 0a 2a 2a 20 74 68 65 20 6f 63 74 61 6c 20 70 65  .** the octal pe
2ea60 72 6d 69 73 73 69 6f 6e 73 20 30 36 30 30 20 28  rmissions 0600 (
2ea70 72 65 61 64 2f 77 72 69 74 61 62 6c 65 20 62 79  read/writable by
2ea80 20 6f 77 6e 65 72 20 6f 6e 6c 79 29 2e 20 49 66   owner only). If
2ea90 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20   the file.** is 
2eaa0 61 20 64 61 74 61 62 61 73 65 20 6f 72 20 6d 61  a database or ma
2eab0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2eac0 65 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  e, it is created
2ead0 20 77 69 74 68 20 74 68 65 20 70 65 72 6d 69 73   with the permis
2eae0 73 69 6f 6e 73 20 0a 2a 2a 20 6d 61 73 6b 20 53  sions .** mask S
2eaf0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
2eb00 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 2e 0a  LE_PERMISSIONS..
2eb10 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69  **.** Finally, i
2eb20 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
2eb30 20 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c   opened is a WAL
2eb40 20 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72   or regular jour
2eb50 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a  nal file, then .
2eb60 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
2eb70 20 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c   queries the fil
2eb80 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  e-system for the
2eb90 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20   permissions on 
2eba0 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  the .** correspo
2ebb0 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  nding database f
2ebc0 69 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d  ile and sets *pM
2ebd0 6f 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ode to this valu
2ebe0 65 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20  e. Whenever .** 
2ebf0 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e  possible, WAL an
2ec00 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
2ec10 61 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e  are created usin
2ec20 67 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69  g the same permi
2ec30 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68  ssions .** as th
2ec40 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
2ec50 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2ec60 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
2ec70 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
2ec80 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
2ec90 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ed, then the.** 
2eca0 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d  original filenam
2ecb0 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  e is unavailable
2ecc0 2e 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53  .  But 8_3_NAMES
2ecd0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
2ece0 72 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73  r.** FAT filesys
2ecf0 74 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73  tems and permiss
2ed00 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74  ions do not matt
2ed10 65 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73  er there, so jus
2ed20 74 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66  t use.** the def
2ed30 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  ault permissions
2ed40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ed50 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
2ed60 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de(.  const char
2ed70 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
2ed80 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66        /* Path of
2ed90 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29   file (possibly)
2eda0 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a   being created *
2edb0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edd0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
2ede0 73 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d  sed as 4th argum
2edf0 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a  ent to xOpen() *
2ee00 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64  /.  mode_t *pMod
2ee10 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2ee20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d      /* OUT: Perm
2ee30 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20  issions to open 
2ee40 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75  file with */.  u
2ee50 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20  id_t *pUid,     
2ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ee70 2a 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65  * OUT: uid to se
2ee80 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  t on the file */
2ee90 0a 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20  .  gid_t *pGid  
2eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eeb0 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74     /* OUT: gid t
2eec0 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c  o set on the fil
2eed0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2eee0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2eef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2ef00 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70  urn Code */.  *p
2ef10 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mode = SQLITE_DE
2ef20 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2ef30 53 53 49 4f 4e 53 3b 0a 20 20 69 66 28 20 66 6c  SSIONS;.  if( fl
2ef40 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
2ef50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
2ef60 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
2ef70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62   ){.    char zDb
2ef80 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
2ef90 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
2efa0 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  e file path */. 
2efb0 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20     int nDb;     
2efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
2efe0 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62  lid bytes in zDb
2eff0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
2f000 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
2f010 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2f020 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74  of stat() on dat
2f030 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2f040 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61     /* zPath is a
2f050 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f   path to a WAL o
2f060 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
2f070 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2f080 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20  ock derives.    
2f090 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  ** the path to t
2f0a0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
2f0b0 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d  tabase file from
2f0c0 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f   zPath. This blo
2f0d0 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a  ck handles.    *
2f0e0 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
2f0f0 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  naming conventio
2f100 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ns:.    **.    *
2f110 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2f120 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a  >-journal".    *
2f130 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2f140 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  >-wal".    **   
2f150 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
2f160 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20  urnalNN".    ** 
2f170 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
2f180 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20  walNN".    **.  
2f190 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73    ** where NN is
2f1a0 20 61 20 34 20 64 69 67 69 74 20 64 65 63 69 6d   a 4 digit decim
2f1b0 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e  al number. The N
2f1c0 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73  N naming schemes
2f1d0 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65   are .    ** use
2f1e0 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75  d by the test_mu
2f1f0 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65  ltiplex.c module
2f200 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62  ..    */.    nDb
2f210 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2f220 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a  30(zPath) - 1; .
2f230 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2f240 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20  ABLE_8_3_NAMES. 
2f250 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e 30 20     while( nDb>0 
2f260 26 26 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  && zPath[nDb]!='
2f270 2d 27 20 26 26 20 7a 50 61 74 68 5b 6e 44 62 5d  -' && zPath[nDb]
2f280 21 3d 27 2f 27 20 29 20 6e 44 62 2d 2d 3b 0a 20  !='/' ) nDb--;. 
2f290 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c     if( nDb==0 ||
2f2a0 20 7a 50 61 74 68 5b 6e 44 62 5d 3d 3d 27 2f 27   zPath[nDb]=='/'
2f2b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2f2c0 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 77  _OK;.#else.    w
2f2d0 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d  hile( zPath[nDb]
2f2e0 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 61  !='-' ){.      a
2f2f0 73 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a  ssert( nDb>0 );.
2f300 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 50        assert( zP
2f310 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20 29  ath[nDb]!='\n' )
2f320 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20  ;.      nDb--;. 
2f330 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2f340 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74  memcpy(zDb, zPat
2f350 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62  h, nDb);.    zDb
2f360 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  [nDb] = '\0';.. 
2f370 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74     if( 0==osStat
2f380 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b  (zDb, &sStat) ){
2f390 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  .      *pMode = 
2f3a0 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20  sStat.st_mode & 
2f3b0 30 37 37 37 3b 0a 20 20 20 20 20 20 2a 70 55 69  0777;.      *pUi
2f3c0 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64  d = sStat.st_uid
2f3d0 3b 0a 20 20 20 20 20 20 2a 70 47 69 64 20 3d 20  ;.      *pGid = 
2f3e0 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20  sStat.st_gid;.  
2f3f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2f400 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2f410 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
2f420 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
2f430 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
2f440 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20  LETEONCLOSE ){. 
2f450 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30     *pMode = 0600
2f460 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2f470 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
2f480 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e   the file zPath.
2f490 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73  .** .** Previous
2f4a0 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f  ly, the SQLite O
2f4b0 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72  S layer used thr
2f4c0 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  ee functions in 
2f4d0 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a  place of this.**
2f4e0 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   one:.**.**     
2f4f0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
2f500 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20  dWrite();.**    
2f510 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
2f520 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20  adOnly();.**    
2f530 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
2f540 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a  clusive();.**.**
2f550 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72   These calls cor
2f560 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66  respond to the f
2f570 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
2f580 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a  tions of flags:.
2f590 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72  **.**     ReadWr
2f5a0 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45  ite() ->     (RE
2f5b0 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
2f5c0 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c  ).**     ReadOnl
2f5d0 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41  y()  ->     (REA
2f5e0 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f  DONLY) .**     O
2f5f0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d  penExclusive() -
2f600 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43  > (READWRITE | C
2f610 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56  REATE | EXCLUSIV
2f620 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64  E).**.** The old
2f630 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
2f640 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c   accepted a bool
2f650 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22  ean argument - "
2f660 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20  delFlag". If.** 
2f670 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77  true, the file w
2f680 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  as configured to
2f690 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
2f6a0 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  y deleted when t
2f6b0 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c  he.** file handl
2f6c0 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68  e closed. To ach
2f6d0 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66  ieve the same ef
2f6e0 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20  fect using this 
2f6f0 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63  new .** interfac
2f700 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54  e, add the DELET
2f710 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f  EONCLOSE flag to
2f720 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
2f730 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f   above for .** O
2f740 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a  penExclusive()..
2f750 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2f760 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  ixOpen(.  sqlite
2f770 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2f780 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
2f790 53 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  S for which this
2f7a0 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65   is the xOpen me
2f7b0 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
2f7c0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2f7d0 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61         /* Pathna
2f7e0 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65  me of file to be
2f7f0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c   opened */.  sql
2f800 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
2f810 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2f820 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2f830 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e   to be filled in
2f840 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
2f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f860 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67     /* Input flag
2f870 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  s to control the
2f880 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e   opening */.  in
2f890 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
2f8a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
2f8b0 74 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72  tput flags retur
2f8c0 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f  ned to SQLite co
2f8d0 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  re */.){.  unixF
2f8e0 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69  ile *p = (unixFi
2f8f0 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e  le *)pFile;.  in
2f900 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20  t fd = -1;      
2f910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f920 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2f930 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e  returned by open
2f940 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e  () */.  int open
2f950 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
2f960 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
2f970 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28  to pass to open(
2f980 29 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) */.#if SQLITE_
2f990 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54  ENABLE_DATA_PROT
2f9a0 45 43 54 49 4f 4e 0a 20 20 69 6e 74 20 65 54 79  ECTION.  int eTy
2f9b0 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 30  pe = flags&0xFF0
2f9c0 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20  FFF00;  /* Type 
2f9d0 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  of file to open 
2f9e0 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 65  */.#else.  int e
2f9f0 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
2fa00 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
2fa10 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
2fa20 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e  n */.#endif.  in
2fa30 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20  t noLock;       
2fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fa50 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63  True to omit loc
2fa60 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  king primitives 
2fa70 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2fa80 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2fa90 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
2faa0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a  Return Code */..
2fab0 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
2fac0 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
2fad0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
2fae0 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
2faf0 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
2fb00 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2fb10 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
2fb20 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
2fb30 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
2fb40 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2fb50 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  );.  int isReado
2fb60 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
2fb70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2fb80 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  DONLY);.  int is
2fb90 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
2fba0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2fbb0 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69  N_READWRITE);.#i
2fbc0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2fbd0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2fbe0 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20  int isAutoProxy 
2fbf0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2fc00 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
2fc10 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  Y);.#endif.#if d
2fc20 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2fc30 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
2fc40 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2fc50 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
2fc60 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a   fsInfo;.#endif.
2fc70 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e  .  /* If creatin
2fc80 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61  g a master or ma
2fc90 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c  in-file journal,
2fca0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2fcb0 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20  ill open.  ** a 
2fcc0 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
2fcd0 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  on the directory
2fce0 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20   too. The first 
2fcf0 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a  time unixSync().
2fd00 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74    ** is called t
2fd10 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
2fd20 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
2fd30 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61  l be fsync()ed a
2fd40 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a  nd close()d..  *
2fd50 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
2fd60 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28  = (isCreate && (
2fd70 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d  .        eType==
2fd80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
2fd90 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
2fda0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2fdb0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2fdc0 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
2fdd0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2fde0 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  WAL.  ));..  /* 
2fdf0 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
2fe00 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
2fe10 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
2fe20 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
2fe30 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
2fe40 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
2fe50 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
2fe60 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
2fe70 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
2fe80 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41  char zTmpname[MA
2fe90 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20  X_PATHNAME+1];. 
2fea0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2feb0 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f  me = zPath;..  /
2fec0 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
2fed0 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
2fee0 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
2fef0 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
2ff00 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
2ff10 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
2ff20 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
2ff30 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
2ff40 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
2ff50 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
2ff60 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
2ff70 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
2ff80 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
2ff90 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
2ffa0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
2ffb0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
2ffc0 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
2ffd0 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
2ffe0 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
2fff0 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
30000 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
30010 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
30020 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
30030 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
30040 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
30050 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
30060 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
30070 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
30080 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
30090 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
300a0 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
300b0 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
300c0 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
300d0 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
300e0 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
300f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
30100 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74   never .  ** aut
30110 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
30120 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
30130 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
30140 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
30150 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
30160 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
30170 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
30180 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
30190 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
301a0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
301b0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
301c0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
301d0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
301e0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
301f0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
30200 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
30210 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
30220 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
30230 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
30240 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
30250 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
30260 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
30270 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
30280 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
30290 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
302a0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
302b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
302c0 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
302d0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
302e0 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
302f0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
30300 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
30310 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
30320 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
30330 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
30340 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
30350 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
30360 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
30370 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
30380 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
30390 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
303a0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
303b0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
303c0 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20  OPEN_WAL.  );.. 
303d0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
303e0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
303f0 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53  ..  if( eType==S
30400 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
30410 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e  DB ){.    UnixUn
30420 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
30430 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66  .    pUnused = f
30440 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e  indReusableFd(zN
30450 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ame, flags);.   
30460 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
30470 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73        fd = pUnus
30480 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73  ed->fd;.    }els
30490 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  e{.      pUnused
304a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
304b0 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  c(sizeof(*pUnuse
304c0 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  d));.      if( !
304d0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
304e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
304f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
30500 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e      }.    p->pUn
30510 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
30520 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61    }else if( !zNa
30530 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  me ){.    /* If 
30540 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74  zName is NULL, t
30550 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69  he upper layer i
30560 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74  s requesting a t
30570 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  emp file. */.   
30580 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
30590 20 26 26 20 21 73 79 6e 63 44 69 72 29 3b 0a 20   && !syncDir);. 
305a0 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54     rc = unixGetT
305b0 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48  empname(MAX_PATH
305c0 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65  NAME+1, zTmpname
305d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
305e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
305f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
30600 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a   }.    zName = z
30610 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  Tmpname;.  }..  
30620 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
30630 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c   value of the fl
30640 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70 61  ags parameter pa
30650 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75  ssed to POSIX fu
30660 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e  nction.  ** open
30670 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62  (). These must b
30680 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65  e calculated eve
30690 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e  n if open() is n
306a0 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20  ot called, as.  
306b0 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 73  ** they may be s
306c0 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
306d0 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
306e0 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 65   and used by the
306f0 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69   .  ** 'conch fi
30700 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63  le' locking func
30710 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20  tions later on. 
30720 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64   */.  if( isRead
30730 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67  only )  openFlag
30740 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
30750 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
30760 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
30770 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73  O_RDWR;.  if( is
30780 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e  Create )    open
30790 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54  Flags |= O_CREAT
307a0 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73  ;.  if( isExclus
307b0 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ive ) openFlags 
307c0 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46  |= (O_EXCL|O_NOF
307d0 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c  OLLOW);.  openFl
307e0 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46  ags |= (O_LARGEF
307f0 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a  ILE|O_BINARY);..
30800 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
30810 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f  E_DATA_PROTECTIO
30820 4e 0a 20 20 70 2d 3e 70 72 6f 74 46 6c 61 67 73  N.  p->protFlags
30830 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
30840 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54  TE_OPEN_FILEPROT
30850 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 3b 0a 23 65  ECTION_MASK);.#e
30860 6e 64 69 66 0a 20 20 20 20 0a 20 20 69 66 28 20  ndif.    .  if( 
30870 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65  fd<0 ){.    mode
30880 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20  _t openMode;    
30890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72            /* Per
308a0 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61  missions to crea
308b0 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  te file with */.
308c0 20 20 20 20 75 69 64 5f 74 20 75 69 64 3b 0a 20      uid_t uid;. 
308d0 20 20 20 67 69 64 5f 74 20 67 69 64 3b 0a 20 20     gid_t gid;.  
308e0 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74    rc = findCreat
308f0 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c  eFileMode(zName,
30900 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64   flags, &openMod
30910 65 2c 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a  e, &uid, &gid);.
30920 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
30940 73 73 65 72 74 28 20 21 70 2d 3e 70 55 6e 75 73  ssert( !p->pUnus
30950 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ed );.      asse
30960 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
30970 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54  E_OPEN_WAL || eT
30980 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
30990 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
309a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
309b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d  ;.    }.    fd =
309c0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61   robust_open(zNa
309d0 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f  me, openFlags, o
309e0 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53  penMode);.    OS
309f0 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20  TRACE(("OPENX   
30a00 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20  %-3d %s 0%o\n", 
30a10 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  fd, zName, openF
30a20 6c 61 67 73 29 29 3b 0a 20 20 20 20 69 66 28 20  lags));.    if( 
30a30 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45  fd<0 && errno!=E
30a40 49 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57  ISDIR && isReadW
30a50 72 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75  rite && !isExclu
30a60 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  sive ){.      /*
30a70 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20   Failed to open 
30a80 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61  the file for rea
30a90 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
30aa0 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a  Try read-only. *
30ab0 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d  /.      flags &=
30ac0 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   ~(SQLITE_OPEN_R
30ad0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
30ae0 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
30af0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d      openFlags &=
30b00 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41   ~(O_RDWR|O_CREA
30b10 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20  T);.      flags 
30b20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
30b30 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f  EADONLY;.      o
30b40 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
30b50 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73 52 65  ONLY;.      isRe
30b60 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adonly = 1;.    
30b70 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
30b80 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  en(zName, openFl
30b90 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a  ags, openMode);.
30ba0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64      }.    if( fd
30bb0 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  <0 ){.      rc =
30bc0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
30bd0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
30be0 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d  PT, "open", zNam
30bf0 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  e);.      goto o
30c00 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
30c10 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20 77 65    }.    /* if we
30c20 27 72 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  're opening the 
30c30 77 61 6c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 61  wal or journal a
30c40 6e 64 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  nd running as ro
30c50 6f 74 2c 20 73 65 74 20 74 68 65 20 6a 6f 75 72  ot, set the jour
30c60 6e 61 6c 20 75 69 64 2f 67 69 64 20 2a 2f 0a 20  nal uid/gid */. 
30c70 20 20 20 69 66 28 20 21 69 73 52 65 61 64 6f 6e     if( !isReadon
30c80 6c 79 20 26 26 20 28 66 6c 61 67 73 20 26 20 28  ly && (flags & (
30c90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c  SQLITE_OPEN_WAL|
30ca0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
30cb0 5f 4a 4f 55 52 4e 41 4c 29 29 20 29 7b 0a 20 20  _JOURNAL)) ){.  
30cc0 20 20 20 20 75 69 64 5f 74 20 65 75 69 64 20 3d      uid_t euid =
30cd0 20 67 65 74 65 75 69 64 28 29 3b 0a 20 20 20 20   geteuid();.    
30ce0 20 20 69 66 28 20 65 75 69 64 3d 3d 30 20 26 26    if( euid==0 &&
30cf0 20 28 65 75 69 64 21 3d 75 69 64 20 7c 7c 20 67   (euid!=uid || g
30d00 65 74 65 67 69 64 28 29 21 3d 67 69 64 29 20 29  etegid()!=gid) )
30d10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 63  {.        if( fc
30d20 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c 20 67 69  hown(fd, uid, gi
30d30 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d) ){.          
30d40 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
30d50 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
30d60 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
30d70 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 20  inished;.       
30d80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
30d90 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66  .  }.  assert( f
30da0 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f  d>=0 );.  if( pO
30db0 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a  utFlags ){.    *
30dc0 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67  pOutFlags = flag
30dd0 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  s;.  }..  if( p-
30de0 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  >pUnused ){.    
30df0 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d  p->pUnused->fd =
30e00 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75   fd;.    p->pUnu
30e10 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61  sed->flags = fla
30e20 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  gs;.  }..  if( i
30e30 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f  sDelete ){.#if O
30e40 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50  S_VXWORKS.    zP
30e50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c  ath = zName;.#el
30e60 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  se.    osUnlink(
30e70 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  zName);.#endif. 
30e80 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e   }.#if SQLITE_EN
30e90 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
30ea0 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70  LE.  else{.    p
30eb0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70  ->openFlags = op
30ec0 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e  enFlags;.  }.#en
30ed0 64 69 66 0a 0a 23 69 66 64 65 66 20 46 44 5f 43  dif..#ifdef FD_C
30ee0 4c 4f 45 58 45 43 0a 20 20 6f 73 46 63 6e 74 6c  LOEXEC.  osFcntl
30ef0 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73  (fd, F_SETFD, os
30f00 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  Fcntl(fd, F_GETF
30f10 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
30f20 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e  EC);.#endif..  n
30f30 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53  oLock = eType!=S
30f40 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
30f50 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66 69  DB;..  .#if defi
30f60 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
30f70 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
30f80 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
30f90 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20  if( fstatfs(fd, 
30fa0 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
30fb0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
30fc0 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72  *)pFile)->lastEr
30fd0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
30fe0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
30ff0 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
31000 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31010 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
31020 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73    }.  if (0 == s
31030 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20  trncmp("msdos", 
31040 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
31050 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28  ame, 5)) {.    (
31060 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
31070 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51  )->fsFlags |= SQ
31080 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
31090 4d 53 44 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20  MSDOS;.  }.  if 
310a0 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65  (0 == strncmp("e
310b0 78 66 61 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  xfat", fsInfo.f_
310c0 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
310d0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
310e0 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
310f0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
31100 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
31110 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20  }.#endif.  .#if 
31120 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
31130 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20  CKING_STYLE.#if 
31140 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
31150 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73  OXY_LOCKING.  is
31160 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23  AutoProxy = 1;.#
31170 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75  endif.  if( isAu
31180 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74  toProxy && (zPat
31190 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f  h!=NULL) && (!no
311a0 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78  Lock) && pVfs->x
311b0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  Open ){.    char
311c0 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74   *envforce = get
311d0 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43  env("SQLITE_FORC
311e0 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22  E_PROXY_LOCKING"
311f0 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72  );.    int usePr
31200 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oxy = 0;..    /*
31210 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
31220 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d  OXY_LOCKING==1 m
31230 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79  eans force alway
31240 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d  s use proxy, 0 m
31250 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76  eans .    ** nev
31260 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55  er use proxy, NU
31270 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f  LL means use pro
31280 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c  xy for non-local
31290 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f   files only.  */
312a0 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63  .    if( envforc
312b0 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  e!=NULL ){.     
312c0 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69   useProxy = atoi
312d0 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20  (envforce)>0;.  
312e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
312f0 66 28 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c  f( statfs(zPath,
31300 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
31310 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
31320 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f   theory, the clo
31330 73 65 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73  se(fd) call is s
31340 75 62 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74  ub-optimal. If t
31350 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20  he file opened. 
31360 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66         ** with f
31370 64 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  d is a database 
31380 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20  file, and there 
31390 61 72 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  are other connec
313a0 74 69 6f 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20  tions open.     
313b0 20 20 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69     ** on that fi
313c0 6c 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72  le that are curr
313d0 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64  ently holding ad
313e0 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20  visory locks on 
313f0 69 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  it,.        ** t
31400 68 65 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hen the call to 
31410 63 6c 6f 73 65 28 29 20 77 69 6c 6c 20 63 61 6e  close() will can
31420 63 65 6c 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  cel those locks.
31430 20 49 6e 20 70 72 61 63 74 69 63 65 2c 0a 20 20   In practice,.  
31440 20 20 20 20 20 20 2a 2a 20 77 65 27 72 65 20 61        ** we're a
31450 73 73 75 6d 69 6e 67 20 74 68 61 74 20 73 74 61  ssuming that sta
31460 74 66 73 28 29 20 64 6f 65 73 6e 27 74 20 66 61  tfs() doesn't fa
31470 69 6c 20 76 65 72 79 20 6f 66 74 65 6e 2e 20 41  il very often. A
31480 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
31490 2a 2a 20 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68  ** not while oth
314a0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
314b0 6f 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ors opened by th
314c0 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 6f  e same process o
314d0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
314e0 20 73 61 6d 65 20 66 69 6c 65 20 61 72 65 20 77   same file are w
314f0 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20  orking.  */.    
31500 20 20 20 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f      p->lastErrno
31510 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
31520 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
31530 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
31540 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
31550 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
31560 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  S;.        goto 
31570 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
31580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65       }.      use
31590 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f  Proxy = !(fsInfo
315a0 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43  .f_flags&MNT_LOC
315b0 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  AL);.    }.    i
315c0 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20  f( useProxy ){. 
315d0 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e       rc = fillIn
315e0 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66  UnixFile(pVfs, f
315f0 64 2c 20 73 79 6e 63 44 69 72 2c 20 70 46 69 6c  d, syncDir, pFil
31600 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b  e, zPath, noLock
31610 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31620 20 20 20 20 20 20 20 20 20 20 20 20 69 73 44 65              isDe
31630 6c 65 74 65 2c 20 69 73 52 65 61 64 6f 6e 6c 79  lete, isReadonly
31640 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
31650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31660 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 20 74        /* cache t
31670 68 65 20 70 4d 65 74 68 6f 64 20 69 6e 20 63 61  he pMethod in ca
31680 73 65 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d  se the transform
31690 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20   fails */.      
316a0 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
316b0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
316c0 73 20 2a 70 4d 65 74 68 6f 64 20 3d 20 70 46 69  s *pMethod = pFi
316d0 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 3b 0a 20 20  le->pMethods;.  
316e0 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
316f0 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
31700 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69  e((unixFile*)pFi
31710 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20  le, ":auto:");. 
31720 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
31730 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31740 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69        /* Use uni
31750 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20  xClose to clean 
31760 75 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  up the resources
31770 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e   added in fillIn
31780 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20  UnixFile .      
31790 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72      ** and clear
317a0 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75   all the structu
317b0 72 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e  re's references.
317c0 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
317d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46  .          ** pF
317e0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69  ile->pMethods wi
317f0 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71  ll be NULL so sq
31800 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c  lite3OsClose wil
31810 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20  l be a no-op .  
31820 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31830 20 20 20 20 20 69 66 28 20 70 4d 65 74 68 6f 64       if( pMethod
31840 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  !=NULL ){.      
31850 20 20 20 20 20 20 70 4d 65 74 68 6f 64 2d 3e 78        pMethod->x
31860 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20  Close(pFile);.  
31870 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
31880 20 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 43             unixC
31890 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  lose(pFile);.   
318a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
318b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
318c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
318d0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
318e0 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
318f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
31900 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
31910 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 73 79  ile(pVfs, fd, sy
31920 6e 63 44 69 72 2c 20 70 46 69 6c 65 2c 20 7a 50  ncDir, pFile, zP
31930 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20  ath, noLock,.   
31940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31950 20 20 20 69 73 44 65 6c 65 74 65 2c 20 69 73 52     isDelete, isR
31960 65 61 64 6f 6e 6c 79 29 3b 0a 6f 70 65 6e 5f 66  eadonly);.open_f
31970 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72  inished:.  if( r
31980 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31990 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
319a0 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20  (p->pUnused);.  
319b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
319c0 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
319d0 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74  the file at zPat
319e0 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e  h. If the dirSyn
319f0 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72  c argument is tr
31a00 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74  ue, fsync().** t
31a10 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  he directory aft
31a20 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
31a30 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
31a40 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a  int unixDelete(.
31a50 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e    sqlite3_vfs *N
31a60 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56  otUsed,     /* V
31a70 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  FS containing th
31a80 69 73 20 61 73 20 74 68 65 20 78 44 65 6c 65 74  is as the xDelet
31a90 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  e method */.  co
31aa0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
31ab0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
31ac0 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  of file to be de
31ad0 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  leted */.  int d
31ae0 69 72 53 79 6e 63 20 20 20 20 20 20 20 20 20 20  irSync          
31af0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
31b00 20 66 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f   fsync() directo
31b10 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e  ry after deletin
31b20 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  g file */.){.  i
31b30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
31b40 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  K;.  UNUSED_PARA
31b50 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
31b60 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
31b70 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
31b80 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20  IOERR_DELETE);. 
31b90 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50   if( osUnlink(zP
31ba0 61 74 68 29 3d 3d 28 2d 31 29 20 26 26 20 65 72  ath)==(-1) && er
31bb0 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20  rno!=ENOENT ){. 
31bc0 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
31bd0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
31be0 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c  ERR_DELETE, "unl
31bf0 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ink", zPath);.  
31c00 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
31c10 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
31c20 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63 20 29  .  if( dirSync )
31c30 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20  {.    int fd;.  
31c40 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72    rc = osOpenDir
31c50 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
31c60 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
31c70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
31c80 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
31c90 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d    if( fsync(fd)=
31ca0 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20  =-1 ).#else.    
31cb0 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20    if( fsync(fd) 
31cc0 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  ).#endif.      {
31cd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
31ce0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
31cf0 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
31d00 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74  C, "fsync", zPat
31d10 68 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  h);.      }.#if 
31d20 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c  OSCLOSE_CHECK_CL
31d30 4f 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  OSE_IOERR.      
31d40 69 66 28 20 63 6c 6f 73 65 28 66 64 29 26 26 21  if( close(fd)&&!
31d50 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  rc ){.        rc
31d60 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
31d70 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20  DIR_CLOSE;.     
31d80 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72   }.#else.      r
31d90 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66  obust_close(0, f
31da0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 23 65  d, __LINE__);.#e
31db0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
31dc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
31dd0 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20  NTOPEN ){.      
31de0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
31df0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
31e00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31e10 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  ./*.** Test the 
31e20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20  existance of or 
31e30 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
31e40 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68  ns of file zPath
31e50 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65  . The.** test pe
31e60 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20  rformed depends 
31e70 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
31e80 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
31e90 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
31ea0 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20  XISTS: Return 1 
31eb0 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  if the file exis
31ec0 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  ts.**     SQLITE
31ed0 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
31ee0 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  E: Return 1 if t
31ef0 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20  he file is read 
31f00 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a  and writable..**
31f10 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
31f20 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74  SS_READONLY: Ret
31f30 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
31f40 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a  e is readable..*
31f50 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72  *.** Otherwise r
31f60 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
31f70 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73  ic int unixAcces
31f80 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
31f90 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20   *NotUsed,   /* 
31fa0 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69  The VFS containi
31fb0 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20  ng this xAccess 
31fc0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
31fd0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
31fe0 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74      /* Path of t
31ff0 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69  he file to exami
32000 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ne */.  int flag
32010 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
32020 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61  /* What do we wa
32030 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75  nt to learn abou
32040 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65  t the zPath file
32050 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  ? */.  int *pRes
32060 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Out            /
32070 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62  * Write result b
32080 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29  oolean here */.)
32090 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20  {.  int amode = 
320a0 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  0;.  UNUSED_PARA
320b0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
320c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
320d0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
320e0 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29  _IOERR_ACCESS; )
320f0 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67  ;.  switch( flag
32100 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  s ){.    case SQ
32110 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
32120 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  TS:.      amode 
32130 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = F_OK;.      br
32140 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
32150 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
32160 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f  WRITE:.      amo
32170 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a  de = W_OK|R_OK;.
32180 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32190 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
321a0 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20  ESS_READ:.      
321b0 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20  amode = R_OK;.  
321c0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
321d0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
321e0 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20  ssert(!"Invalid 
321f0 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29  flags argument")
32200 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74  ;.  }.  *pResOut
32210 20 3d 20 28 6f 73 41 63 63 65 73 73 28 7a 50 61   = (osAccess(zPa
32220 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a  th, amode)==0);.
32230 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c    if( flags==SQL
32240 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
32250 53 20 26 26 20 2a 70 52 65 73 4f 75 74 20 29 7b  S && *pResOut ){
32260 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
32270 20 62 75 66 3b 0a 20 20 20 20 69 66 28 20 30 3d   buf;.    if( 0=
32280 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26  =osStat(zPath, &
32290 62 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73  buf) && buf.st_s
322a0 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
322b0 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20  *pResOut = 0;.  
322c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
322d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
322e0 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
322f0 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
32300 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
32310 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76  ame. The relativ
32320 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f  e path.** is sto
32330 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72  red as a nul-ter
32340 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69  minated string i
32350 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
32360 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50  nted to by.** zP
32370 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74  ath. .**.** zOut
32380 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
32390 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
323a0 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
323b0 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a  thname bytes .**
323c0 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20   (in this case, 
323d0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74  MAX_PATHNAME byt
323e0 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61  es). The full-pa
323f0 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  th is written to
32400 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20  .** this buffer 
32410 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
32420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32430 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  unixFullPathname
32440 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
32450 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
32460 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
32470 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
32480 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
32490 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h,            /*
324a0 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69   Possibly relati
324b0 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f  ve input path */
324c0 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20  .  int nOut,    
324d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
324e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70   /* Size of outp
324f0 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74  ut buffer in byt
32500 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f  es */.  char *zO
32510 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
32520 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
32530 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20  buffer */.){..  
32540 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
32550 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
32560 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
32570 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
32580 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
32590 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
325a0 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
325b0 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
325c0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
325d0 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
325e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
325f0 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
32600 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
32610 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
32620 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
32630 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
32640 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
32650 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
32660 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
32670 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d  .  assert( pVfs-
32680 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58  >mxPathname==MAX
32690 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55  _PATHNAME );.  U
326a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
326b0 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e  pVfs);..  zOut[n
326c0 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out-1] = '\0';. 
326d0 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27   if( zPath[0]=='
326e0 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  /' ){.    sqlite
326f0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c  3_snprintf(nOut,
32700 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61   zOut, "%s", zPa
32710 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  th);.  }else{.  
32720 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20    int nCwd;.    
32730 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75  if( osGetcwd(zOu
32740 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b  t, nOut-1)==0 ){
32750 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e  .      return un
32760 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
32770 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
32780 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68   "getcwd", zPath
32790 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77  );.    }.    nCw
327a0 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  d = (int)strlen(
327b0 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
327c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
327d0 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77  -nCwd, &zOut[nCw
327e0 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68  d], "/%s", zPath
327f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
32800 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
32810 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32820 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
32830 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
32840 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
32850 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
32860 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
32870 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
32880 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
32890 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
328a0 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
328b0 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ry..*/.#include 
328c0 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63  <dlfcn.h>.static
328d0 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65   void *unixDlOpe
328e0 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  n(sqlite3_vfs *N
328f0 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68  otUsed, const ch
32900 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
32910 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32920 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
32930 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69  eturn dlopen(zFi
32940 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57  lename, RTLD_NOW
32950 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b   | RTLD_GLOBAL);
32960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65  .}../*.** SQLite
32970 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
32980 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  tion immediately
32990 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
329a0 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a   unixDlSym() or.
329b0 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20  ** unixDlOpen() 
329c0 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61  fails (returns a
329d0 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20   null pointer). 
329e0 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c  If a more detail
329f0 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73  ed error.** mess
32a00 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  age is available
32a10 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20  , it is written 
32a20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e  to zBufOut. If n
32a30 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  o error message.
32a40 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ** is available,
32a50 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74   zBufOut is left
32a60 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20   unmodified and 
32a70 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65  SQLite uses a de
32a80 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d  fault.** error m
32a90 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  essage..*/.stati
32aa0 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72  c void unixDlErr
32ab0 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
32ac0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
32ad0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
32ae0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
32af0 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f  *zErr;.  UNUSED_
32b00 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
32b10 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d);.  unixEnterM
32b20 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d  utex();.  zErr =
32b30 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66   dlerror();.  if
32b40 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ( zErr ){.    sq
32b50 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
32b60 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25  Buf, zBufOut, "%
32b70 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  s", zErr);.  }. 
32b80 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
32b90 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
32ba0 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c   (*unixDlSym(sql
32bb0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
32bc0 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73  d, void *p, cons
32bd0 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f  t char*zSym))(vo
32be0 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  id){.  /* .  ** 
32bf0 47 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74  GCC with -pedant
32c00 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74  ic-errors says t
32c10 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74  hat C90 does not
32c20 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74   allow a void* t
32c30 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69  o be.  ** cast i
32c40 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
32c50 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e   a function.  An
32c60 64 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72  d yet the librar
32c70 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e  y dlsym() routin
32c80 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61  e.  ** returns a
32c90 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20   void* which is 
32ca0 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  really a pointer
32cb0 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20   to a function. 
32cc0 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20   So how do we.  
32cd0 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77  ** use dlsym() w
32ce0 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
32cf0 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rors?.  **.  ** 
32d00 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77  Variable x below
32d10 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
32d20 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
32d30 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67   function taking
32d40 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  .  ** parameters
32d50 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74   void* and const
32d60 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72   char* and retur
32d70 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74  ning a pointer t
32d80 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  o a function..  
32d90 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** We initialize
32da0 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20   x by assigning 
32db0 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  it a pointer to 
32dc0 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63  the dlsym() func
32dd0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74  tion..  ** (That
32de0 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75   assignment requ
32df0 69 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54  ires a cast.)  T
32e00 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20  hen we call the 
32e10 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20  function that.  
32e20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20  ** x points to. 
32e30 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
32e40 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20   work-around is 
32e50 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b  unlikely to work
32e60 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e   correctly on an
32e70 79 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20  y system where. 
32e80 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63   ** you really c
32e90 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e  annot cast a fun
32ea0 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e  ction pointer in
32eb0 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74  to void*.  But t
32ec0 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  hen, on the.  **
32ed0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73   other hand, dls
32ee0 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  ym() will not wo
32ef0 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73  rk on such a sys
32f00 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77  tem either, so w
32f10 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20  e have.  ** not 
32f20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74  really lost anyt
32f30 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69  hing..  */.  voi
32f40 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63  d (*(*x)(void*,c
32f50 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
32f60 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
32f70 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
32f80 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a  .  x = (void(*(*
32f90 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
32fa0 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79  ar*))(void))dlsy
32fb0 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29  m;.  return (*x)
32fc0 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61  (p, zSym);.}.sta
32fd0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43  tic void unixDlC
32fe0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
32ff0 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20   *NotUsed, void 
33000 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55  *pHandle){.  UNU
33010 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
33020 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73  tUsed);.  dlclos
33030 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65  e(pHandle);.}.#e
33040 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45  lse /* if SQLITE
33050 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
33060 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a  SION is defined:
33070 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e   */.  #define un
33080 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64  ixDlOpen  0.  #d
33090 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f  efine unixDlErro
330a0 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e  r 0.  #define un
330b0 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64  ixDlSym   0.  #d
330c0 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73  efine unixDlClos
330d0 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  e 0.#endif../*.*
330e0 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74  * Write nBuf byt
330f0 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74  es of random dat
33100 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  a to the supplie
33110 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a  d buffer zBuf..*
33120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
33130 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  xRandomness(sqli
33140 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
33150 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
33160 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45   *zBuf){.  UNUSE
33170 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
33180 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28  sed);.  assert((
33190 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69  size_t)nBuf>=(si
331a0 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a  zeof(time_t)+siz
331b0 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f  eof(int)));..  /
331c0 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69  * We have to ini
331d0 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20  tialize zBuf to 
331e0 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64  prevent valgrind
331f0 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a   from reporting.
33200 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68    ** errors.  Th
33210 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64  e reports issued
33220 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65   by valgrind are
33230 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20   incorrect - we 
33240 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65  would.  ** prefe
33250 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f  r that the rando
33260 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73  mness be increas
33270 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65  ed by making use
33280 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   of the.  ** uni
33290 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65  nitialized space
332a0 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76   in zBuf - but v
332b0 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74  algrind errors t
332c0 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a  end to worry.  *
332d0 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52  * some users.  R
332e0 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65  ather than argue
332f0 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65  , it seems easie
33300 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61  r just to initia
33310 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68  lize.  ** the wh
33320 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69  ole array and si
33330 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20  lence valgrind, 
33340 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
33350 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65  ns less randomne
33360 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  ss.  ** in the r
33370 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a  andom seed..  **
33380 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69  .  ** When testi
33390 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  ng, initializing
333a0 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20   zBuf[] to zero 
333b0 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54  is all we do.  T
333c0 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74  hat means.  ** t
333d0 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73  hat we always us
333e0 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f  e the same rando
333f0 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63  m number sequenc
33400 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74  e.  This makes t
33410 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65  he.  ** tests re
33420 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  peatable..  */. 
33430 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
33440 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66   nBuf);.#if !def
33450 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
33460 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69  ).  {.    int pi
33470 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20  d, fd;.    fd = 
33480 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65  robust_open("/de
33490 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44  v/urandom", O_RD
334a0 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  ONLY, 0);.    if
334b0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
334c0 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20  time_t t;.      
334d0 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20  time(&t);.      
334e0 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c  memcpy(zBuf, &t,
334f0 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20   sizeof(t));.   
33500 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28     pid = getpid(
33510 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
33520 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d  &zBuf[sizeof(t)]
33530 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
33540 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  id));.      asse
33550 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69  rt( sizeof(t)+si
33560 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65  zeof(pid)<=(size
33570 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20  _t)nBuf );.     
33580 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74   nBuf = sizeof(t
33590 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b  ) + sizeof(pid);
335a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
335b0 20 20 64 6f 7b 20 6e 42 75 66 20 3d 20 6f 73 52    do{ nBuf = osR
335c0 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42  ead(fd, zBuf, nB
335d0 75 66 29 3b 20 7d 77 68 69 6c 65 28 20 6e 42 75  uf); }while( nBu
335e0 66 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  f<0 && errno==EI
335f0 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62  NTR );.      rob
33600 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c  ust_close(0, fd,
33610 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
33620 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
33630 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a  eturn nBuf;.}...
33640 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
33650 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
33660 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
33670 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
33680 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  ..** The argumen
33690 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
336a0 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
336b0 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70  we want to sleep
336c0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
336d0 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
336e0 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
336f0 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74  nds of sleep act
33700 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74  ually.** request
33710 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65  ed from the unde
33720 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
33730 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65   system, a numbe
33740 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  r which.** might
33750 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
33760 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
33770 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e   argument, but n
33780 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  ot less.** than 
33790 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
337a0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
337b0 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
337c0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
337d0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23  microseconds){.#
337e0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
337f0 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
33800 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63  sp;..  sp.tv_sec
33810 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20   = microseconds 
33820 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e  / 1000000;.  sp.
33830 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f  tv_nsec = (micro
33840 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30  seconds % 100000
33850 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e  0) * 1000;.  nan
33860 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c  osleep(&sp, NULL
33870 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
33880 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
33890 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
338a0 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66  conds;.#elif def
338b0 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50  ined(HAVE_USLEEP
338c0 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50  ) && HAVE_USLEEP
338d0 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73  .  usleep(micros
338e0 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45  econds);.  UNUSE
338f0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
33900 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
33910 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
33920 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73  se.  int seconds
33930 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
33940 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30  +999999)/1000000
33950 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64  ;.  sleep(second
33960 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
33970 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
33980 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64  .  return second
33990 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69  s*1000000;.#endi
339a0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
339b0 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
339c0 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
339d0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69  on-zero value, i
339e0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
339f0 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
33a00 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  f seconds since 
33a10 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64  1970 and is used
33a20 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75   to set the resu
33a30 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lt of.** sqlite3
33a40 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20  OsCurrentTime() 
33a50 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a  during testing..
33a60 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
33a70 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
33a80 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d  3_current_time =
33a90 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73   0;  /* Fake sys
33aa0 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f  tem time in seco
33ab0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20  nds since 1970. 
33ac0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
33ad0 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
33ae0 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
33af0 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
33b00 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69   Time).  Write i
33b10 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68  nto *piNow.** th
33b20 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  e current time a
33b30 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
33b40 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74  ian Day number t
33b50 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e  imes 86_400_000.
33b60 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f    In.** other wo
33b70 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20  rds, write into 
33b80 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65  *piNow the numbe
33b90 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
33ba0 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69  s since the Juli
33bb0 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e  an.** epoch of n
33bc0 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68  oon in Greenwich
33bd0 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c   on November 24,
33be0 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64   4714 B.C accord
33bf0 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72  ing to the.** pr
33c00 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61  oleptic Gregoria
33c10 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a  n calendar..**.*
33c20 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
33c30 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
33c40 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
33c50 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
33c60 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
33c70 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
33c80 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
33c90 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
33ca0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
33cb0 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63  piNow){.  static
33cc0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
33cd0 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
33ce0 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
33cf0 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
33d00 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  ;.#if defined(NO
33d10 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f  _GETTOD).  time_
33d20 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b  t t;.  time(&t);
33d30 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71  .  *piNow = ((sq
33d40 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31  lite3_int64)t)*1
33d50 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  000 + unixEpoch;
33d60 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b  .#elif OS_VXWORK
33d70 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
33d80 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63  pec sNow;.  cloc
33d90 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f  k_gettime(CLOCK_
33da0 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29  REALTIME, &sNow)
33db0 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69  ;.  *piNow = uni
33dc0 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
33dd0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
33de0 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
33df0 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b  tv_nsec/1000000;
33e00 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20  .#else.  struct 
33e10 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20  timeval sNow;.  
33e20 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e  gettimeofday(&sN
33e30 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 69 4e 6f 77  ow, 0);.  *piNow
33e40 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
33e50 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
33e60 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
33e70 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30   sNow.tv_usec/10
33e80 30 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  00;.#endif..#ifd
33e90 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
33ea0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
33eb0 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
33ec0 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28   *piNow = 1000*(
33ed0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71  sqlite3_int64)sq
33ee0 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
33ef0 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  me + unixEpoch;.
33f00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55    }.#endif.  UNU
33f10 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
33f20 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
33f30 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   0;.}../*.** Fin
33f40 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
33f50 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
33f60 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
33f70 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
33f80 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
33f90 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
33fa0 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
33fb0 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
33fc0 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
33fd0 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
33fe0 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
33ff0 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
34000 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
34010 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
34020 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
34030 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
34040 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
34050 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  i;.  UNUSED_PARA
34060 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
34070 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d    unixCurrentTim
34080 65 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20  eInt64(0, &i);. 
34090 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30   *prNow = i/8640
340a0 30 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e  0000.0;.  return
340b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20   0;.}../*.** We 
340c0 61 64 64 65 64 20 74 68 65 20 78 47 65 74 4c 61  added the xGetLa
340d0 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64  stError() method
340e0 20 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74   with the intent
340f0 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67  ion of providing
34100 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c  .** better low-l
34110 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61  evel error messa
34120 67 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69  ges when operati
34130 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65  ng-system proble
34140 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75  ms come up.** du
34150 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72  ring SQLite oper
34160 61 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66  ation.  But so f
34170 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74  ar, none of that
34180 20 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d   has been implem
34190 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ented.** in the 
341a0 63 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72  core.  So this r
341b0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
341c0 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77  called.  For now
341d0 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a  , it is merely.*
341e0 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72  * a place-holder
341f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34200 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
34210 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
34220 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
34230 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73  ed2, char *NotUs
34240 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed3){.  UNUSED_P
34250 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
34260 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
34270 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b  METER(NotUsed2);
34280 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
34290 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20  TER(NotUsed3);. 
342a0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
342b0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
342c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
342d0 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  f sqlite3_vfs me
342e0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
342f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34300 2a 0a 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 2a 2a 2a 2a 2a 2a  ****************
34350 2f 0a 0a 2f 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 2a 2a 2a 2a  ****************
343a0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
343b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
343c0 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e  gin Proxy Lockin
343d0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
343e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
343f0 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c  **.**.** Proxy l
34400 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65  ocking is a "ube
34410 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64  r-locking-method
34420 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a  " in this sense:
34430 20 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a    It uses the.**
34440 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d   other locking m
34450 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64  ethods on second
34460 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20  ary lock files. 
34470 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
34480 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65  s a.** meta-laye
34490 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68  r over top of th
344a0 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b  e primitive lock
344b0 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ing implemented 
344c0 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  above.  For.** t
344d0 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
344e0 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
344f0 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78  plements of prox
34500 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66  y locking is def
34510 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c  erred.** until l
34520 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ate in the file 
34530 28 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c  (here) after all
34540 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f   of the other I/
34550 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a  O methods have.*
34560 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d  * been defined -
34570 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69   so that the pri
34580 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d  mitive locking m
34590 65 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c  ethods are avail
345a0 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69  able.** as servi
345b0 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68  ces to help with
345c0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
345d0 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  ion of proxy loc
345e0 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a  king..**.****.**
345f0 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
34600 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20  locking schemes 
34610 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79  in SQLite use by
34620 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f  te-range locks o
34630 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
34640 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69  e file to coordi
34650 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75  nate safe, concu
34660 72 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20  rrent access by 
34670 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
34680 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20  .** and writers 
34690 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f  [http://sqlite.o
346a0 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d  rg/lockingv3.htm
346b0 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69  l].  The five fi
346c0 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  le locking.** st
346d0 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20  ates (UNLOCKED, 
346e0 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c  PENDING, SHARED,
346f0 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55   RESERVED, EXCLU
34700 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d  SIVE) are implem
34710 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49  ented.** as POSI
34720 58 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c  X read & write l
34730 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20  ocks over fixed 
34740 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73  set of locations
34750 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a   (via fsctl),.**
34760 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20   on AFP and SMB 
34770 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62  only exclusive b
34780 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
34790 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69  are available vi
347a0 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20  a fsctl.** with 
347b0 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73  _IOWR('z', 23, s
347c0 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
347d0 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b  ockPB2) to track
347e0 20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74   the same 5 stat
347f0 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61  es..** To simula
34800 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20  te a F_RDLCK on 
34810 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65  the shared range
34820 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f  , on AFP a rando
34830 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20  mly selected.** 
34840 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73  address in the s
34850 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
34860 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45  aken for a SHARE
34870 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69  D lock, the enti
34880 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e  re.** shared ran
34890 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
348a0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
348b0 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50  k):.**.**      P
348c0 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20  ENDING_BYTE     
348d0 20 20 20 30 78 34 30 30 30 30 30 30 30 09 09 20     0x40000000.. 
348e0 20 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53 45    ..**      RESE
348f0 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20  RVED_BYTE       
34900 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20  0x40000001.**   
34910 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20     SHARED_RANGE 
34920 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
34930 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a  2 -> 0x40000200.
34940 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
34950 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   well on the loc
34960 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  al file system, 
34970 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72  but shows a near
34980 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64  ly 100x.** slowd
34990 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66  own in read perf
349a0 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62  ormance on AFP b
349b0 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63  ecause the AFP c
349c0 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a  lient disables.*
349d0 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65  * the read cache
349e0 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65   when byte-range
349f0 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65   locks are prese
34a00 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68  nt.  Enabling th
34a10 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20  e read.** cache 
34a20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20  exposes a cache 
34a30 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65  coherency proble
34a40 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e  m that is presen
34a50 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a  t on all OS X.**
34a60 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f   supported netwo
34a70 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  rk file systems.
34a80 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f    NFS and AFP bo
34a90 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a  th observe the.*
34aa0 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20  * close-to-open 
34ab0 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e  semantics for en
34ac0 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68  suring cache coh
34ad0 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a  erency.** [http:
34ae0 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67  //nfs.sourceforg
34af0 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20  e.net/#faq_a8], 
34b00 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65  which does not e
34b10 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64  ffectively.** ad
34b20 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72  dress the requir
34b30 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75  ements for concu
34b40 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61  rrent database a
34b50 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
34b60 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64  e.** readers and
34b70 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74   writers.** [htt
34b80 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63  p://www.nabble.c
34b90 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53  om/SQLite-on-NFS
34ba0 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79  -cache-coherency
34bb0 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c  -td15655701.html
34bc0 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72  ]..**.** To addr
34bd0 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ess the performa
34be0 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f  nce and cache co
34bf0 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20  herency issues, 
34c00 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
34c10 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68  ng.** changes th
34c20 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61  e way database a
34c30 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c  ccess is control
34c40 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20  led by limiting 
34c50 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73  access to a.** s
34c60 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20  ingle host at a 
34c70 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20  time and moving 
34c80 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f  file locks off o
34c90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
34ca0 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20  ile.** and onto 
34cb0 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20  a proxy file on 
34cc0 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
34cd0 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  ystem.  .**.**.*
34ce0 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f  * Using proxy lo
34cf0 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  cks.** ---------
34d00 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43  --------.**.** C
34d10 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c   APIs.**.**  sql
34d20 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
34d30 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
34d40 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
34d50 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20  XYFILE,.**      
34d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d70 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20   <proxy_path> | 
34d80 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73  ":auto:");.**  s
34d90 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
34da0 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
34db0 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
34dc0 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78  ROXYFILE, &<prox
34dd0 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a  y_path>);.**.**.
34de0 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a  ** SQL pragmas.*
34df0 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  *.**  PRAGMA [da
34e00 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
34e10 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70  xy_file=<proxy_p
34e20 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a  ath> | :auto:.**
34e30 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
34e40 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
34e50 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  ile.**.** Specif
34e60 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65  ying ":auto:" me
34e70 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72  ans that if ther
34e80 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c  e is a conch fil
34e90 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e  e with a matchin
34ea0 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20  g.** host ID in 
34eb0 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61  it, the proxy pa
34ec0 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
34ed0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
34ee0 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20  d, otherwise.** 
34ef0 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73  a proxy path bas
34f00 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73  ed on the user's
34f10 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69   temp dir.** (vi
34f20 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41  a confstr(_CS_DA
34f30 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
34f40 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65  IR,...)) will be
34f50 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
34f60 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69   actual proxy fi
34f70 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72  le name is gener
34f80 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61  ated from the na
34f90 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74  me and path of t
34fa0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
34fb0 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ile.  For exampl
34fc0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46  e:.**.**       F
34fd0 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68  or database path
34fe0 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e   "/Users/me/foo.
34ff0 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68  db" .**       Th
35000 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  e lock path will
35010 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71   be "<tmpdir>/sq
35020 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72  liteplocks/_User
35030 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f  s_me_foo.db:auto
35040 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  :").**.** Once a
35050 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63   lock proxy is c
35060 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20  onfigured for a 
35070 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
35080 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a  ion, it can not.
35090 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68  ** be removed, h
350a0 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65  owever it may be
350b0 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64   switched to a d
350c0 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70  ifferent proxy p
350d0 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61  ath via.** the a
350e0 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d  bove APIs (assum
350f0 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ing the conch fi
35100 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  le is not being 
35110 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a  held by another.
35120 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  ** connection or
35130 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a   process). .**.*
35140 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c  *.** How proxy l
35150 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20  ocking works.** 
35160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35170 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72  -------.**.** Pr
35180 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
35190 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c   relies primaril
351a0 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70  y on two new sup
351b0 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a  porting files: .
351c0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68  **.**   *  conch
351d0 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61   file to limit a
351e0 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
351f0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20  abase file to a 
35200 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20  single host.**  
35210 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a      at a time.**
35220 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66  .**   *  proxy f
35230 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20  ile to act as a 
35240 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64  proxy for the ad
35250 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72  visory locks nor
35260 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61  mally.**      ta
35270 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
35280 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ase.**.** The co
35290 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73  nch file - to us
352a0 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20  e a proxy file, 
352b0 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73  sqlite must firs
352c0 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63  t "hold the conc
352d0 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20  h".** by taking 
352e0 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20  an sqlite-style 
352f0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
35300 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72  he conch file, r
35310 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  eading the.** co
35320 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61  ntents and compa
35330 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20  ring the host's 
35340 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28  unique host ID (
35350 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c  see below) and l
35360 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74  ock.** proxy pat
35370 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61  h against the va
35380 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
35390 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63  he conch.  The c
353a0 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20  onch file is.** 
353b0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61  stored in the sa
353c0 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
353d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
353e0 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e  e and the file n
353f0 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72  ame.** is patter
35400 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61  ned after the da
35410 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
35420 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e   as ".<databasen
35430 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20  ame>-conch"..** 
35440 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  If the conch fil
35450 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
35460 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e  , or it's conten
35470 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20  ts do not match 
35480 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61  the.** host ID a
35490 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68  nd/or proxy path
354a0 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
354b0 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20  is escalated to 
354c0 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  an exclusive.** 
354d0 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e  lock and the con
354e0 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73  ch file contents
354f0 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
35500 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
35510 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61   proxy.** path a
35520 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64  nd the lock is d
35530 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73  owngraded to a s
35540 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e  hared lock again
35550 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a  .  If the conch.
35560 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e  ** is held by an
35570 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77  other process (w
35580 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ith a shared loc
35590 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76  k), the exclusiv
355a0 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66  e lock.** will f
355b0 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42  ail and SQLITE_B
355c0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
355d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
355e0 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65   file - a single
355f0 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20  -byte file used 
35600 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79  for all advisory
35610 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e   file locks.** n
35620 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e  ormally taken on
35630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35640 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77  le.   This allow
35650 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69  s for safe shari
35660 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ng.** of the dat
35670 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d  abase file for m
35680 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
35690 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74  and writers on t
356a0 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20  he same.** host 
356b0 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72  (the conch ensur
356c0 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c  es that they all
356d0 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f   use the same lo
356e0 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a  cal lock file)..
356f0 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67  **.** Requesting
35700 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20   the lock proxy 
35710 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61  does not immedia
35720 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f  tely take the co
35730 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e  nch, it is.** on
35740 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  ly taken when th
35750 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20  e first request 
35760 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65  to lock database
35770 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20   file is made.  
35780 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73  .** This matches
35790 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f   the semantics o
357a0 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61  f the traditiona
357b0 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69  l locking behavi
357c0 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65  or, where.** ope
357d0 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ning a connectio
357e0 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  n to a database 
357f0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61  file does not ta
35800 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e  ke a lock on it.
35810 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c  .** The shared l
35820 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20  ock and an open 
35830 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
35840 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75  are maintained u
35850 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ntil .** the con
35860 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  nection to the d
35870 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65  atabase is close
35880 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  d. .**.** The pr
35890 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65  oxy file and the
358a0 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e   lock file are n
358b0 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20  ever deleted so 
358c0 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a  they only need.*
358d0 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  * to be created 
358e0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
358f0 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a  hey are used..**
35900 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
35910 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d  n options.** ---
35920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35930 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45  --.**.**  SQLITE
35940 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
35950 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  CKING.**.**     
35960 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73    Database files
35970 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e   accessed on non
35980 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74  -local file syst
35990 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20  ems are.**      
359a0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
359b0 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72  onfigured for pr
359c0 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63  oxy locking, loc
359d0 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20  k files are.**  
359e0 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d       named autom
359f0 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74  atically using t
35a00 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73  he same logic as
35a10 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41  .**       PRAGMA
35a20 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
35a30 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20  =":auto:".**    
35a40 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58  .**  SQLITE_PROX
35a50 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20  Y_DEBUG.**.**   
35a60 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20      Enables the 
35a70 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72  logging of error
35a80 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67   messages during
35a90 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a   host id file.**
35aa0 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c         retrieval
35ab0 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a   and creation.**
35ac0 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49  .**  LOCKPROXYDI
35ad0 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76  R.**.**       Ov
35ae0 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61  errides the defa
35af0 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73  ult directory us
35b00 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78  ed for lock prox
35b10 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20  y files that.** 
35b20 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20        are named 
35b30 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69  automatically vi
35b40 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73  a the ":auto:" s
35b50 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51  etting.**.**  SQ
35b60 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
35b70 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
35b80 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65  S.**.**       Pe
35b90 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65  rmissions to use
35ba0 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
35bb0 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73   directory for s
35bc0 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  toring the.**   
35bd0 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66      lock proxy f
35be0 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20  iles, only used 
35bf0 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49  when LOCKPROXYDI
35c00 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a  R is not set..**
35c10 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41      .**    .** A
35c20 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76  s mentioned abov
35c30 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  e, when compiled
35c40 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45   with SQLITE_PRE
35c50 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
35c60 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68  G,.** setting th
35c70 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  e environment va
35c80 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f  riable SQLITE_FO
35c90 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
35ca0 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66  G to 1 will.** f
35cb0 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69  orce proxy locki
35cc0 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ng to be used fo
35cd0 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  r every database
35ce0 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e   file opened, an
35cf0 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63  d 0.** will forc
35d00 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78  e automatic prox
35d10 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
35d20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c  disabled for all
35d30 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
35d40 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61  es (explicity ca
35d50 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45  lling the SQLITE
35d60 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
35d70 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20  LE pragma or.** 
35d80 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74  sqlite_file_cont
35d90 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61  rol API is not a
35da0 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54  ffected by SQLIT
35db0 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
35dc0 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  CKING)..*/../*.*
35dd0 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
35de0 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
35df0 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a  e on MacOSX .*/.
35e00 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
35e10 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
35e20 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
35e30 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  STYLE../*.** The
35e40 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
35e50 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74  text has the pat
35e60 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63  h and file struc
35e70 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65  tures for the re
35e80 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63  mote .** and loc
35e90 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69  al proxy files i
35ea0 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20  n it.*/.typedef 
35eb0 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
35ec0 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79  ingContext proxy
35ed0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
35ee0 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
35ef0 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  ingContext {.  u
35f00 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
35f10 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  le;         /* O
35f20 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  pen conch file *
35f30 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46  /.  char *conchF
35f40 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20  ilePath;        
35f50 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
35f60 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
35f70 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
35f80 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oxy;         /* 
35f90 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20  Open proxy lock 
35fa0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
35fb0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20  lockProxyPath;  
35fc0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
35fd0 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  f the proxy lock
35fe0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
35ff0 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
36000 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
36010 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
36020 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48   */.  int conchH
36030 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eld;            
36040 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63     /* 1 if the c
36050 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31  onch is held, -1
36060 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   if lockless */.
36070 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20 20 20    int nFails;   
36080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36090 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 63  * Number of conc
360a0 68 20 74 61 6b 69 6e 67 20 66 61 69 6c 75 72 65  h taking failure
360b0 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64  s */.  void *old
360c0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  LockingContext; 
360d0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
360e0 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74  lockingcontext t
360f0 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f  o restore on clo
36100 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
36110 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
36120 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20   *pOldMethod;   
36130 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f    /* Original I/
36140 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c  O methods for cl
36150 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ose */.};../* .*
36160 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
36170 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74   file path for t
36180 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64  he database at d
36190 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  bPath is written
361a0 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a   into lPath, .**
361b0 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e   which must poin
361c0 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74  t to valid, writ
361d0 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67  able memory larg
361e0 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d  e enough for a m
361f0 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20  axLen length.** 
36200 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73  file path. .*/.s
36210 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
36220 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  etLockPath(const
36230 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63   char *dbPath, c
36240 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65  har *lPath, size
36250 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e  _t maxLen){.  in
36260 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c  t len;.  int dbL
36270 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  en;.  int i;..#i
36280 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49  fdef LOCKPROXYDI
36290 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  R.  len = strlcp
362a0 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f  y(lPath, LOCKPRO
362b0 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a  XYDIR, maxLen);.
362c0 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43  #else.# ifdef _C
362d0 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
362e0 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69  MP_DIR.  {.    i
362f0 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f  f( !confstr(_CS_
36300 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
36310 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78  _DIR, lPath, max
36320 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53  Len) ){.      OS
36330 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
36340 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65  ATH  failed %s e
36350 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e  rrno=%d pid=%d\n
36360 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
36370 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20    lPath, errno, 
36380 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20  getpid()));.    
36390 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
363a0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
363b0 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  }.    len = strl
363c0 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69  cat(lPath, "sqli
363d0 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65  teplocks", maxLe
363e0 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c  n);    .  }.# el
363f0 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  se.  len = strlc
36400 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f  py(lPath, "/tmp/
36410 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e  ", maxLen);.# en
36420 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  dif.#endif..  if
36430 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d  ( lPath[len-1]!=
36440 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d  '/' ){.    len =
36450 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
36460 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  "/", maxLen);.  
36470 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66  }.  .  /* transf
36480 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20  orm the db path 
36490 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68  to a unique cach
364a0 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65  e name */.  dbLe
364b0 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
364c0 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20  dbPath);.  for( 
364d0 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20  i=0; i<dbLen && 
364e0 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d  (i+len+7)<(int)m
364f0 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  axLen; i++){.   
36500 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68   char c = dbPath
36510 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69  [i];.    lPath[i
36520 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29  +len] = (c=='/')
36530 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50  ?'_':c;.  }.  lP
36540 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b  ath[i+len]='\0';
36550 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68  .  strlcat(lPath
36560 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c  , ":auto:", maxL
36570 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  en);.  OSTRACE((
36580 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72  "GETLOCKPATH  pr
36590 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
365a0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74   pid=%d\n", lPat
365b0 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
365c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
365d0 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72  K;.}../* . ** Cr
365e0 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66  eates the lock f
365f0 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73  ile and any miss
36600 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20  ing directories 
36610 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a  in lockPath. */.
36620 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
36630 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63  CreateLockPath(c
36640 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50  onst char *lockP
36650 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c  ath){.  int i, l
36660 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d  en;.  char buf[M
36670 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e  AXPATHLEN];.  in
36680 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a  t start = 0;.  .
36690 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74    assert(lockPat
366a0 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74  h!=NULL);.  /* t
366b0 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c  ry to create all
366c0 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
366d0 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f  e directories */
366e0 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74  .  len = (int)st
366f0 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a  rlen(lockPath);.
36700 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50    buf[0] = lockP
36710 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69  ath[0];.  for( i
36720 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29  =1; i<len; i++ )
36730 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61  {.    if( lockPa
36740 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20  th[i] == '/' && 
36750 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20  (i - start > 0) 
36760 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  ){.      /* only
36770 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64   mkdir if leaf d
36780 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22  ir != "." or "/"
36790 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20   or ".." */.    
367a0 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20    if( i-start>2 
367b0 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26  || (i-start==1 &
367c0 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
367d0 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74  '.' && buf[start
367e0 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20  ] != '/') .     
367f0 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d      || (i-start=
36800 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  =2 && buf[start]
36810 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73   != '.' && buf[s
36820 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20  tart+1] != '.') 
36830 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69  ){.        buf[i
36840 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  ]='\0';.        
36850 69 66 28 20 6d 6b 64 69 72 28 62 75 66 2c 20 53  if( mkdir(buf, S
36860 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
36870 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
36880 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NS) ){.         
36890 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a   int err=errno;.
368a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
368b0 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20 20  r!=EEXIST ) {.  
368c0 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
368d0 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E(("CREATELOCKPA
368e0 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61 74  TH  FAILED creat
368f0 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20 20  ing %s, ".      
36900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
36910 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20  '%s' proxy lock 
36920 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
36930 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
36940 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74 72          buf, str
36950 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b  error(err), lock
36960 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29  Path, getpid()))
36970 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
36980 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20  turn err;.      
36990 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
369a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
369b0 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20  art=i+1;.    }. 
369c0 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b     buf[i] = lock
369d0 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f  Path[i];.  }.  O
369e0 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c  STRACE(("CREATEL
369f0 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
36a00 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
36a10 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c  %d\n", lockPath,
36a20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72   getpid()));.  r
36a30 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
36a40 69 63 20 69 6e 74 20 69 73 50 72 6f 78 79 4c 6f  ic int isProxyLo
36a50 63 6b 69 6e 67 4d 6f 64 65 28 75 6e 69 78 46 69  ckingMode(unixFi
36a60 6c 65 20 2a 70 46 69 6c 65 29 20 7b 0a 20 20 72  le *pFile) {.  r
36a70 65 74 75 72 6e 20 28 70 46 69 6c 65 2d 3e 70 4d  eturn (pFile->pM
36a80 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49  ethod == &proxyI
36a90 6f 4d 65 74 68 6f 64 73 29 20 3f 20 31 20 3a 20  oMethods) ? 1 : 
36aa0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
36ab0 72 6e 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  rn the shared me
36ac0 6d 6f 72 79 20 62 61 73 65 20 70 61 74 68 20 62  mory base path b
36ad0 61 73 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63 6b  ased on the lock
36ae0 20 70 72 6f 78 79 20 66 69 6c 65 20 69 66 20 74   proxy file if t
36af0 68 65 20 0a 2a 2a 20 6c 6f 63 6b 20 70 72 6f 78  he .** lock prox
36b00 79 20 66 69 6c 65 20 69 73 20 68 6f 73 74 65 64  y file is hosted
36b10 20 6f 6e 20 61 20 73 68 61 72 65 64 20 6d 65 6d   on a shared mem
36b20 6f 72 79 20 63 6f 6d 70 61 74 69 62 6c 65 20 46  ory compatible F
36b30 53 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  S.*/.static cons
36b40 74 20 63 68 61 72 20 2a 70 72 6f 78 79 53 68 61  t char *proxySha
36b50 72 65 64 4d 65 6d 6f 72 79 42 61 73 65 50 61 74  redMemoryBasePat
36b60 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
36b70 65 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  e) {.  proxyLock
36b80 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
36b90 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4c  ;.  unixFile *pL
36ba0 6f 63 6b 46 69 6c 65 3b 0a 20 20 0a 20 20 61 73  ockFile;.  .  as
36bb0 73 65 72 74 28 70 46 69 6c 65 21 3d 4e 55 4c 4c  sert(pFile!=NULL
36bc0 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   && pFile->locki
36bd0 6e 67 43 6f 6e 74 65 78 74 21 3d 4e 55 4c 4c 29  ngContext!=NULL)
36be0 3b 0a 20 20 61 73 73 65 72 74 28 70 46 69 6c 65  ;.  assert(pFile
36bf0 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72  ->pMethod == &pr
36c00 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a 20  oxyIoMethods);. 
36c10 20 70 43 74 78 20 3d 20 28 28 70 72 6f 78 79 4c   pCtx = ((proxyL
36c20 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
36c30 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
36c40 6f 6e 74 65 78 74 29 29 3b 0a 20 20 70 4c 6f 63  ontext));.  pLoc
36c50 6b 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 6c 6f  kFile = pCtx->lo
36c60 63 6b 50 72 6f 78 79 3b 0a 20 20 69 66 28 20 70  ckProxy;.  if( p
36c70 4c 6f 63 6b 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  LockFile->pMetho
36c80 64 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26  d->iVersion>=2 &
36c90 26 20 70 4c 6f 63 6b 46 69 6c 65 2d 3e 70 4d 65  & pLockFile->pMe
36ca0 74 68 6f 64 2d 3e 78 53 68 6d 4d 61 70 21 3d 30  thod->xShmMap!=0
36cb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
36cc0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
36cd0 74 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  th;.  }.  return
36ce0 20 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   NULL;.}../*.** 
36cf0 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53  Create a new VFS
36d00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
36d10 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f   (stored in memo
36d20 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
36d30 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
36d40 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65  oc) and open the
36d50 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74   file named "pat
36d60 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  h" in the file d
36d70 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
36d80 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
36d90 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f  esponsible not o
36da0 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  nly for closing 
36db0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
36dc0 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20  tor.** but also 
36dd0 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
36de0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
36df0 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  d with the file 
36e00 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73  descriptor..*/.s
36e10 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
36e20 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20  reateUnixFile(. 
36e30 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
36e40 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70  ath,        /* p
36e50 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ath for the new 
36e60 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20  unixFile */.    
36e70 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c  unixFile **ppFil
36e80 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78  e,       /* unix
36e90 46 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64  File created and
36ea0 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66   returned by ref
36eb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f   */.    int islo
36ec0 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20  ckfile          
36ed0 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20   /* if non zero 
36ee0 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c  missing dirs wil
36ef0 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  l be created */.
36f00 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ) {.  int fd = -
36f10 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  1;.  unixFile *p
36f20 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
36f30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
36f40 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
36f50 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20  DWR | O_CREAT;. 
36f60 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d   sqlite3_vfs dum
36f70 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72  myVfs;.  int ter
36f80 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55  rno = 0;.  UnixU
36f90 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
36fa0 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31   = NULL;..  /* 1
36fb0 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f  . first try to o
36fc0 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66  pen/create the f
36fd0 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74  ile.  ** 2. if t
36fe0 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74  hat fails, and t
36ff0 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69  his is a lock fi
37000 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20  le (not-conch), 
37010 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  try creating.  *
37020 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72  * the parent dir
37030 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65  ectories and the
37040 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a  n try again..  *
37050 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69  * 3. if that fai
37060 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ls, try to open 
37070 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e  the file read-on
37080 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73  ly.  ** otherwis
37090 65 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69  e return BUSY (i
370a0 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20  f lock file) or 
370b0 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65  CANTOPEN for the
370c0 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f   conch file.  */
370d0 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e  .  pUnused = fin
370e0 64 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68  dReusableFd(path
370f0 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20  , openFlags);.  
37100 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
37110 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
37120 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >fd;.  }else{.  
37130 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
37140 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
37150 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20  f(*pUnused));.  
37160 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29    if( !pUnused )
37170 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
37180 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
37190 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c   }.  }.  if( fd<
371a0 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f  0 ){.    fd = ro
371b0 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
371c0 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54  openFlags, SQLIT
371d0 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
371e0 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
371f0 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
37200 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
37210 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26   errno==ENOENT &
37220 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  & islockfile ){.
37230 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43        if( proxyC
37240 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61  reateLockPath(pa
37250 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  th) == SQLITE_OK
37260 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d   ){.        fd =
37270 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
37280 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51  h, openFlags, SQ
37290 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
372a0 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
372b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
372c0 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
372d0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20      openFlags = 
372e0 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64  O_RDONLY;.    fd
372f0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
37300 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
37310 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
37320 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
37330 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
37340 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rrno;.  }.  if( 
37350 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  fd<0 ){.    sqli
37360 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65 64  te3_free(pUnused
37370 29 3b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63  );.    if( isloc
37380 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  kfile ){.      r
37390 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
373a0 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69  Y;.    }.    swi
373b0 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20  tch (terrno) {. 
373c0 20 20 20 20 20 63 61 73 65 20 45 41 43 43 45 53       case EACCES
373d0 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  :.        return
373e0 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
373f0 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20      case EIO: . 
37400 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
37410 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
37420 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20   /* even though 
37430 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20  it is the conch 
37440 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  */.      default
37450 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  :.        return
37460 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
37470 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
37480 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e  .  .  pNew = (un
37490 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  ixFile *)sqlite3
374a0 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
374b0 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e  pNew));.  if( pN
374c0 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ew==NULL ){.    
374d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
374e0 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  M;.    goto end_
374f0 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20  create_proxy;.  
37500 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c  }.  memset(pNew,
37510 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
37520 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f  ile));.  pNew->o
37530 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46  penFlags = openF
37540 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26  lags;.  memset(&
37550 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a  dummyVfs, 0, siz
37560 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a  eof(dummyVfs));.
37570 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44    dummyVfs.pAppD
37580 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75  ata = (void*)&au
37590 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a  tolockIoFinder;.
375a0 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65    dummyVfs.zName
375b0 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55   = "dummy";.  pU
375c0 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a  nused->fd = fd;.
375d0 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73    pUnused->flags
375e0 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
375f0 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20  pNew->pUnused = 
37600 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63  pUnused;.  .  rc
37610 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
37620 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c  e(&dummyVfs, fd,
37630 20 30 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c   0, (sqlite3_fil
37640 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30  e*)pNew, path, 0
37650 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
37660 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
37670 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e      *ppFile = pN
37680 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ew;.    return S
37690 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e  QLITE_OK;.  }.en
376a0 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20  d_create_proxy: 
376b0 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f     .  robust_clo
376c0 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c  se(pNew, fd, __L
376d0 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65  INE__);.  sqlite
376e0 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
376f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e  sqlite3_free(pUn
37700 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  used);.  return 
37710 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
37720 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d  LITE_TEST./* sim
37730 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
37740 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
37750 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
37760 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74  ile paths */.int
37770 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
37780 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  num = 0;.#endif.
37790 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48  .#define PROXY_H
377a0 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20  OSTIDLEN    16  
377b0 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f  /* conch file ho
377c0 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a  st id length */.
377d0 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64  ./* Not always d
377e0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65  efined in the he
377f0 61 64 65 72 73 20 61 73 20 69 74 20 6f 75 67 68  aders as it ough
37800 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72  t to be */.exter
37810 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75 75 69  n int gethostuui
37820 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e  d(uuid_t id, con
37830 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  st struct timesp
37840 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20 67  ec *wait);../* g
37850 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20 76  et the host ID v
37860 69 61 20 67 65 74 68 6f 73 74 75 75 69 64 28 29  ia gethostuuid()
37870 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70  , pHostID must p
37880 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f  oint to PROXY_HO
37890 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65  STIDLEN .** byte
378a0 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65  s of writable me
378b0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
378c0 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74  int proxyGetHost
378d0 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ID(unsigned char
378e0 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a   *pHostID, int *
378f0 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65 72  pError){.  asser
37900 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  t(PROXY_HOSTIDLE
37910 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64  N == sizeof(uuid
37920 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  _t));.  memset(p
37930 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59  HostID, 0, PROXY
37940 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66  _HOSTIDLEN);.#if
37950 20 48 41 56 45 5f 47 45 54 48 4f 53 54 55 55 49   HAVE_GETHOSTUUI
37960 44 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74  D.  {.    struct
37970 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75   timespec timeou
37980 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31  t = {1, 0}; /* 1
37990 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a   sec timeout */.
379a0 20 20 20 20 0a 20 20 20 20 69 66 28 20 67 65 74      .    if( get
379b0 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44  hostuuid(pHostID
379c0 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20  , &timeout) ){. 
379d0 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65       int err = e
379e0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
379f0 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  pError ){.      
37a00 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b    *pError = err;
37a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
37a20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
37a30 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
37a40 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
37a50 41 4d 45 54 45 52 28 70 45 72 72 6f 72 29 3b 0a  AMETER(pError);.
37a60 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
37a70 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73  LITE_TEST.  /* s
37a80 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
37a90 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
37aa0 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
37ab0 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20   file paths */. 
37ac0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73   if( sqlite3_hos
37ad0 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20  tid_num != 0){. 
37ae0 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20     pHostID[0] = 
37af0 28 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30  (char)(pHostID[0
37b00 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74  ] + (char)(sqlit
37b10 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20  e3_hostid_num & 
37b20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  0xFF));.  }.#end
37b30 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53  if.  .  return S
37b40 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
37b50 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  The conch file c
37b60 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61 64  ontains the head
37b70 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20  er, host id and 
37b80 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20  lock file path. 
37b90 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
37ba0 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20  _CONCHVERSION 2 
37bb0 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64    /* 1-byte head
37bc0 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74  er, 16-byte host
37bd0 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65   id, path */.#de
37be0 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45  fine PROXY_HEADE
37bf0 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63  RLEN    1   /* c
37c00 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64 65 72  onch file header
37c10 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69   length */.#defi
37c20 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  ne PROXY_PATHIND
37c30 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41  EX    (PROXY_HEA
37c40 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
37c50 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20  TIDLEN).#define 
37c60 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
37c70 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52  N  (PROXY_HEADER
37c80 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
37c90 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a  LEN+MAXPATHLEN).
37ca0 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e  ./* .** Takes an
37cb0 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65   open conch file
37cc0 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e  , copies the con
37cd0 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70  tents to a new p
37ce0 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76  ath and then mov
37cf0 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20  es .** it back. 
37d00 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74   The newly creat
37d10 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64  ed file's file d
37d20 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 73 73  escriptor is ass
37d30 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  igned to the.** 
37d40 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63  conch file struc
37d50 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79  ture and finally
37d60 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
37d70 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  nch file descrip
37d80 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65  tor is .** close
37d90 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f  d.  Returns zero
37da0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
37db0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
37dc0 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63  oxyBreakConchLoc
37dd0 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
37de0 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74  e, uuid_t myHost
37df0 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  ID){.  proxyLock
37e00 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
37e10 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
37e20 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
37e30 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
37e40 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f   .  unixFile *co
37e50 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
37e60 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61  conchFile;.  cha
37e70 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  r tPath[MAXPATHL
37e80 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  EN];.  char buf[
37e90 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
37ea0 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74  N];.  char *cPat
37eb0 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  h = pCtx->conchF
37ec0 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f  ilePath;.  size_
37ed0 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
37ee0 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20   size_t pathLen 
37ef0 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d  = 0;.  char errm
37f00 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69  sg[64] = "";.  i
37f10 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e  nt fd = -1;.  in
37f20 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55  t rc = -1;.  UNU
37f30 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79  SED_PARAMETER(my
37f40 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63  HostID);..  /* c
37f50 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 74 68  reate a new path
37f60 20 62 79 20 72 65 70 6c 61 63 65 20 74 68 65 20   by replace the 
37f70 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68  trailing '-conch
37f80 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20  ' with '-break' 
37f90 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73  */.  pathLen = s
37fa0 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50  trlcpy(tPath, cP
37fb0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
37fc0 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e  ;.  if( pathLen>
37fd0 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61  MAXPATHLEN || pa
37fe0 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20  thLen<6 || .    
37ff0 20 28 73 74 72 6c 63 70 79 28 26 74 50 61 74 68   (strlcpy(&tPath
38000 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72  [pathLen-5], "br
38010 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29  eak", 6) != 5) )
38020 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
38030 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
38040 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61  rmsg),errmsg,"pa
38050 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64  th error (len %d
38060 29 22 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29  )",(int)pathLen)
38070 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
38080 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
38090 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63  /* read the conc
380a0 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72  h content */.  r
380b0 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64  eadLen = osPread
380c0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62  (conchFile->h, b
380d0 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
380e0 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28  CHLEN, 0);.  if(
380f0 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50   readLen<PROXY_P
38100 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20  ATHINDEX ){.    
38110 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
38120 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
38130 65 72 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72  errmsg,"read err
38140 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e  or (len %d)",(in
38150 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20  t)readLen);.    
38160 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
38170 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69  ck;.  }.  /* wri
38180 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
38190 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b   temporary break
381a0 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20   file */.  fd = 
381b0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74  robust_open(tPat
381c0 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  h, (O_RDWR|O_CRE
381d0 41 54 7c 4f 5f 45 58 43 4c 29 2c 0a 20 20 20 20  AT|O_EXCL),.    
381e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
381f0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
38200 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
38210 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
38220 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
38230 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
38240 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65  g), errmsg, "cre
38250 61 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22  ate failed (%d)"
38260 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f  , errno);.    go
38270 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
38280 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77  ;.  }.  if( osPw
38290 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65  rite(fd, buf, re
382a0 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73 73  adLen, 0) != (ss
382b0 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b  ize_t)readLen ){
382c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
382d0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
382e0 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 77  msg), errmsg, "w
382f0 72 69 74 65 20 66 61 69 6c 65 64 20 28 25 64 29  rite failed (%d)
38300 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
38310 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
38320 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e  k;.  }.  if( ren
38330 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74 68  ame(tPath, cPath
38340 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
38350 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
38360 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67  (errmsg), errmsg
38370 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64  , "rename failed
38380 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a   (%d)", errno);.
38390 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
383a0 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63  aklock;.  }.  rc
383b0 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28   = 0;.  fprintf(
383c0 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73  stderr, "broke s
383d0 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c  tale lock on %s\
383e0 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20 72 6f  n", cPath);.  ro
383f0 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
38400 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  , conchFile->h, 
38410 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e  __LINE__);.  con
38420 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a  chFile->h = fd;.
38430 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65    conchFile->ope
38440 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
38450 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f  | O_CREAT;..end_
38460 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28  breaklock:.  if(
38470 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66   rc ){.    if( f
38480 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  d>=0 ){.      os
38490 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20  Unlink(tPath);. 
384a0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
384b0 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c  e(pFile, fd, __L
384c0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20  INE__);.    }.  
384d0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
384e0 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62 72 65  , "failed to bre
384f0 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e  ak stale lock on
38500 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74   %s, %s\n", cPat
38510 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a  h, errmsg);.  }.
38520 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
38530 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71 75  /* Take the requ
38540 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  ested lock on th
38550 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64  e conch file and
38560 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20 6c   break a stale l
38570 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 68  ock if the .** h
38580 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2e 0a  ost id matches..
38590 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
385a0 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69  oxyConchLock(u