/ Hex Artifact Content
Login

Artifact 1aa113b261a0ad44fd410a001f6e39bfc1ebd4279b2fb8c2d636a7620d76a45a:


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 20 55 73 65 20 70 72 65 61 64 28  f../* Use pread(
0b40: 29 20 61 6e 64 20 70 77 72 69 74 65 28 29 20 69  ) and pwrite() i
0b50: 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69 6c  f they are avail
0b60: 61 62 6c 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  able */.#if defi
0b70: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
0b80: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 52 45   define HAVE_PRE
0b90: 41 44 20 31 0a 23 20 64 65 66 69 6e 65 20 48 41  AD 1.# define HA
0ba0: 56 45 5f 50 57 52 49 54 45 20 31 0a 23 65 6e 64  VE_PWRITE 1.#end
0bb0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
0bc0: 41 56 45 5f 50 52 45 41 44 36 34 29 20 26 26 20  AVE_PREAD64) && 
0bd0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 57 52  defined(HAVE_PWR
0be0: 49 54 45 36 34 29 0a 23 20 75 6e 64 65 66 20 55  ITE64).# undef U
0bf0: 53 45 5f 50 52 45 41 44 0a 23 20 64 65 66 69 6e  SE_PREAD.# defin
0c00: 65 20 55 53 45 5f 50 52 45 41 44 36 34 20 31 0a  e USE_PREAD64 1.
0c10: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
0c20: 56 45 5f 50 52 45 41 44 29 20 26 26 20 64 65 66  VE_PREAD) && def
0c30: 69 6e 65 64 28 48 41 56 45 5f 50 57 52 49 54 45  ined(HAVE_PWRITE
0c40: 29 0a 23 20 75 6e 64 65 66 20 55 53 45 5f 50 52  ).# undef USE_PR
0c50: 45 41 44 36 34 0a 23 20 64 65 66 69 6e 65 20 55  EAD64.# define U
0c60: 53 45 5f 50 52 45 41 44 20 31 0a 23 65 6e 64 69  SE_PREAD 1.#endi
0c70: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0c80: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0c90: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0ca0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0cd0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0ce0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c  s/ioctl.h>.#incl
0cf0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
0d00: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
0d10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0d20: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0d30: 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 20 21 64  <errno.h>.#if !d
0d40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
0d50: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
0d60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
0d70: 30 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  0.# include <sys
0d80: 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a  /mman.h>.#endif.
0d90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
0da0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0db0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0dc0: 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75  ioctl.h>.# inclu
0dd0: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
0de0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70  # include <sys/p
0df0: 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  aram.h>.#endif /
0e00: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
0e10: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
0e20: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
0e30: 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f 5f  APPLE__) && ((__
0e40: 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAC_OS_X_VERSION
0e50: 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e 20  _MIN_REQUIRED > 
0e60: 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20 20  1050) || \.     
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45 5f        (__IPHONE_
0e90: 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52  OS_VERSION_MIN_R
0ea0: 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29 29  EQUIRED > 2000))
0eb0: 0a 23 20 20 69 66 20 28 21 64 65 66 69 6e 65 64  .#  if (!defined
0ec0: 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45 44  (TARGET_OS_EMBED
0ed0: 44 45 44 29 20 7c 7c 20 28 54 41 52 47 45 54 5f  DED) || (TARGET_
0ee0: 4f 53 5f 45 4d 42 45 44 44 45 44 3d 3d 30 29 29  OS_EMBEDDED==0))
0ef0: 20 5c 0a 20 20 20 20 20 20 20 26 26 20 28 21 64   \.       && (!d
0f00: 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 49 50  efined(TARGET_IP
0f10: 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 29 20  HONE_SIMULATOR) 
0f20: 7c 7c 20 28 54 41 52 47 45 54 5f 49 50 48 4f 4e  || (TARGET_IPHON
0f30: 45 5f 53 49 4d 55 4c 41 54 4f 52 3d 3d 30 29 29  E_SIMULATOR==0))
0f40: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 48 41 56  .#    define HAV
0f50: 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31 0a  E_GETHOSTUUID 1.
0f60: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 77 61 72  #  else.#    war
0f70: 6e 69 6e 67 20 22 67 65 74 68 6f 73 74 75 75 69  ning "gethostuui
0f80: 64 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2e  d() is disabled.
0f90: 22 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  ".#  endif.#endi
0fa0: 66 0a 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  f...#if OS_VXWOR
0fb0: 4b 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  KS.# include <sy
0fc0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63  s/ioctl.h>.# inc
0fd0: 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e  lude <semaphore.
0fe0: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c 69  h>.# include <li
0ff0: 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  mits.h>.#endif /
1000: 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1010: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
1020: 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
1030: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1040: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1050: 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23   <sys/mount.h>.#
1060: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41  endif..#ifdef HA
1070: 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75  VE_UTIME.# inclu
1080: 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e  de <utime.h>.#en
1090: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
10a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
10b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
10c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
10d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
10e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
10f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1100: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1110: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1120: 73 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 23 69 66  s header..*/.#if
1130: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
1140: 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 74  FE.# include <pt
1150: 68 72 65 61 64 2e 68 3e 0a 23 65 6e 64 69 66 0a  hread.h>.#endif.
1160: 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70  ./*.** Default p
1170: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1180: 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 66  creating a new f
1190: 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ile.*/.#ifndef S
11a0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
11b0: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  LE_PERMISSIONS.#
11c0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
11d0: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
11e0: 49 53 53 49 4f 4e 53 20 30 36 34 34 0a 23 65 6e  ISSIONS 0644.#en
11f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
1200: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
1210: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 75 74  hen creating aut
1220: 6f 20 70 72 6f 78 79 20 64 69 72 0a 2a 2f 0a 23  o proxy dir.*/.#
1230: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
1240: 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
1250: 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66  ERMISSIONS.# def
1260: 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ine SQLITE_DEFAU
1270: 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
1280: 49 53 53 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e  ISSIONS 0755.#en
1290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
12a0: 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 74  um supported pat
12b0: 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65  h-length..*/.#de
12c0: 66 69 6e 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d  fine MAX_PATHNAM
12d0: 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78  E 512../*.** Max
12e0: 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 73  imum supported s
12f0: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73 0a 2a 2f  ymbolic links.*/
1300: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
1310: 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53 20 31 30 30  MAX_SYMLINKS 100
1320: 0a 0a 2f 2a 20 41 6c 77 61 79 73 20 63 61 73 74  ../* Always cast
1330: 20 74 68 65 20 67 65 74 70 69 64 28 29 20 72 65   the getpid() re
1340: 74 75 72 6e 20 74 79 70 65 20 66 6f 72 20 63 6f  turn type for co
1350: 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
1360: 0a 2a 2a 20 6b 65 72 6e 65 6c 20 6d 6f 64 75 6c  .** kernel modul
1370: 65 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 2a  es in VxWorks. *
1380: 2f 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 70  /.#define osGetp
1390: 69 64 28 58 29 20 28 70 69 64 5f 74 29 67 65 74  id(X) (pid_t)get
13a0: 70 69 64 28 29 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c  pid()../*.** Onl
13b0: 79 20 73 65 74 20 74 68 65 20 6c 61 73 74 45 72  y set the lastEr
13c0: 72 6e 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  rno if the error
13d0: 20 63 6f 64 65 20 69 73 20 61 20 72 65 61 6c 20   code is a real 
13e0: 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a  error and not .*
13f0: 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63  * a normal expec
1400: 74 65 64 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ted return code 
1410: 6f 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  of SQLITE_BUSY o
1420: 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23  r SQLITE_OK.*/.#
1430: 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45  define IS_LOCK_E
1440: 52 52 4f 52 28 78 29 20 20 28 28 78 20 21 3d 20  RROR(x)  ((x != 
1450: 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 78  SQLITE_OK) && (x
1460: 20 21 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 29   != SQLITE_BUSY)
1470: 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  )../* Forward re
1480: 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74 79 70 65  ferences */.type
1490: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53  def struct unixS
14a0: 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20 20 20 20  hm unixShm;     
14b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
14c0: 6e 65 63 74 69 6f 6e 20 73 68 61 72 65 64 20 6d  nection shared m
14d0: 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66  emory */.typedef
14e0: 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e   struct unixShmN
14f0: 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 3b  ode unixShmNode;
1500: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1510: 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61 6e 63 65   memory instance
1520: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1530: 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ct unixInodeInfo
1540: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 3b 20   unixInodeInfo; 
1550: 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64 65 20 2a    /* An i-node *
1560: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1570: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 55 6e   UnixUnusedFd Un
1580: 69 78 55 6e 75 73 65 64 46 64 3b 20 20 20 20 20  ixUnusedFd;     
1590: 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20 66 69 6c  /* An unused fil
15a0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
15b0: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  ./*.** Sometimes
15c0: 2c 20 61 66 74 65 72 20 61 20 66 69 6c 65 20 68  , after a file h
15d0: 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 20  andle is closed 
15e0: 62 79 20 53 51 4c 69 74 65 2c 20 74 68 65 20 66  by SQLite, the f
15f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
1600: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73  * cannot be clos
1610: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  ed immediately. 
1620: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 2c 20  In these cases, 
1630: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
1640: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
1650: 72 75 63 74 75 72 65 20 61 72 65 20 75 73 65 64  ructure are used
1660: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
1670: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 68  le descriptor wh
1680: 69 6c 65 20 77 61 69 74 69 6e 67 20 66 6f 72 20  ile waiting for 
1690: 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  an.** opportunit
16a0: 79 20 74 6f 20 65 69 74 68 65 72 20 63 6c 6f 73  y to either clos
16b0: 65 20 6f 72 20 72 65 75 73 65 20 69 74 2e 0a 2a  e or reuse it..*
16c0: 2f 0a 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75  /.struct UnixUnu
16d0: 73 65 64 46 64 20 7b 0a 20 20 69 6e 74 20 66 64  sedFd {.  int fd
16e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16f0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
1700: 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f 73 65 20  riptor to close 
1710: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20  */.  int flags; 
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1730: 2a 20 46 6c 61 67 73 20 74 68 69 73 20 66 69 6c  * Flags this fil
1740: 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 61 73  e descriptor was
1750: 20 6f 70 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a   opened with */.
1760: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1770: 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e  pNext;      /* N
1780: 65 78 74 20 75 6e 75 73 65 64 20 66 69 6c 65 20  ext unused file 
1790: 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 73 61  descriptor on sa
17a0: 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f  me file */.};../
17b0: 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69 6c  *.** The unixFil
17c0: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 73  e structure is s
17d0: 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74  ubclass of sqlit
17e0: 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66 69 63  e3_file specific
17f0: 20 74 6f 20 74 68 65 20 75 6e 69 78 0a 2a 2a 20   to the unix.** 
1800: 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
1810: 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ons..*/.typedef 
1820: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20  struct unixFile 
1830: 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63 74  unixFile;.struct
1840: 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73 71   unixFile {.  sq
1850: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1860: 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b   const *pMethod;
1870: 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65 20    /* Always the 
1880: 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20  first entry */. 
1890: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
18a0: 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fs;             
18b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
18c0: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
18d0: 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20  s unixFile */.  
18e0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
18f0: 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  Inode;          
1900: 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75      /* Info abou
1910: 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20  t locks on this 
1920: 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68  inode */.  int h
1930: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1950: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
1960: 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67  iptor */.  unsig
1970: 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f  ned char eFileLo
1980: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ck;            /
1990: 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 6c 6f  * The type of lo
19a0: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20  ck held on this 
19b0: 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  fd */.  unsigned
19c0: 20 73 68 6f 72 74 20 69 6e 74 20 63 74 72 6c 46   short int ctrlF
19d0: 6c 61 67 73 3b 20 20 20 20 20 20 20 2f 2a 20 42  lags;       /* B
19e0: 65 68 61 76 69 6f 72 61 6c 20 62 69 74 73 2e 20  ehavioral bits. 
19f0: 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67   UNIXFILE_* flag
1a00: 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45  s */.  int lastE
1a10: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
1a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a30: 65 20 75 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f  e unix errno fro
1a40: 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72  m last I/O error
1a50: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b   */.  void *lock
1a60: 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20  ingContext;     
1a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
1a80: 6b 69 6e 67 20 73 74 79 6c 65 20 73 70 65 63 69  king style speci
1a90: 66 69 63 20 73 74 61 74 65 20 2a 2f 0a 20 20 55  fic state */.  U
1aa0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 50 72  nixUnusedFd *pPr
1ab0: 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
1ac0: 3b 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61  ;  /* Pre-alloca
1ad0: 74 65 64 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ted UnixUnusedFd
1ae0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1af0: 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 20 20   *zPath;        
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1b10: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  e of the file */
1b20: 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 53 68 6d  .  unixShm *pShm
1b30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b40: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1b50: 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20   memory segment 
1b60: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
1b70: 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20   int szChunk;   
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72       /* Configur
1ba0: 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e  ed by FCNTL_CHUN
1bb0: 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51  K_SIZE */.#if SQ
1bc0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1bd0: 5a 45 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74 63  ZE>0.  int nFetc
1be0: 68 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  hOut;           
1bf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1c00: 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64  mber of outstand
1c10: 69 6e 67 20 78 46 65 74 63 68 20 72 65 66 73 20  ing xFetch refs 
1c20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
1c30: 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20 20  64 mmapSize;    
1c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 61 62           /* Usab
1c50: 6c 65 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 69  le size of mappi
1c60: 6e 67 20 61 74 20 70 4d 61 70 52 65 67 69 6f 6e  ng at pMapRegion
1c70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1c80: 74 36 34 20 6d 6d 61 70 53 69 7a 65 41 63 74 75  t64 mmapSizeActu
1c90: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 41 63 74  al;       /* Act
1ca0: 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d 61 70 70  ual size of mapp
1cb0: 69 6e 67 20 61 74 20 70 4d 61 70 52 65 67 69 6f  ing at pMapRegio
1cc0: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
1cd0: 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78  nt64 mmapSizeMax
1ce0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;          /* Co
1cf0: 6e 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d  nfigured FCNTL_M
1d00: 4d 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a  MAP_SIZE value *
1d10: 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65  /.  void *pMapRe
1d20: 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
1d30: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
1d40: 79 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  y mapped region 
1d50: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20  */.#endif.  int 
1d60: 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  sectorSize;     
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 2f 2a 20 44 65 76 69 63 65 20 73 65 63 74 6f 72  /* Device sector
1d90: 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 64   size */.  int d
1da0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1db0: 74 69 63 73 3b 20 20 20 20 20 20 20 20 20 20 2f  tics;          /
1dc0: 2a 20 50 72 65 63 6f 6d 70 75 74 65 64 20 64 65  * Precomputed de
1dd0: 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
1de0: 74 69 63 73 20 2a 2f 0a 23 69 66 20 53 51 4c 49  tics */.#if SQLI
1df0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1e00: 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70  G_STYLE.  int op
1e10: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e30: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
1e40: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
1e50: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
1e60: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1e70: 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69  NG_STYLE || defi
1e80: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1e90: 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67   unsigned fsFlag
1ea0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1eb0: 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64       /* cached d
1ec0: 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74  etails from stat
1ed0: 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  fs() */.#endif.#
1ee0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1ef0: 42 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55  BLE_SETLK_TIMEOU
1f00: 54 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 42 75  T.  unsigned iBu
1f10: 73 79 54 69 6d 65 6f 75 74 3b 20 20 20 20 20 20  syTimeout;      
1f20: 20 20 20 20 20 20 20 20 2f 2a 20 57 61 69 74 20          /* Wait 
1f30: 74 68 69 73 20 6d 61 6e 79 20 6d 69 6c 6c 69 73  this many millis
1f40: 65 63 20 6f 6e 20 6c 6f 63 6b 73 20 2a 2f 0a 23  ec on locks */.#
1f50: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57  endif.#if OS_VXW
1f60: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
1f70: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
1f80: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
1f90: 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a  ique file ID */.
1fa0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1fb0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1fc0: 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f  The next group o
1fd0: 66 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  f variables are 
1fe0: 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20 77 68  used to track wh
1ff0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2000: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
2010: 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20 62 79 74  n counter in byt
2020: 65 73 20 32 34 2d 32 37 20 6f 66 20 64 61 74 61  es 24-27 of data
2030: 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 75  base files are u
2040: 70 64 61 74 65 64 0a 20 20 2a 2a 20 77 68 65 6e  pdated.  ** when
2050: 65 76 65 72 20 61 6e 79 20 70 61 72 74 20 6f 66  ever any part of
2060: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 68   the database ch
2070: 61 6e 67 65 73 2e 20 20 41 6e 20 61 73 73 65 72  anges.  An asser
2080: 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c 0a  tion fault will.
2090: 20 20 2a 2a 20 6f 63 63 75 72 20 69 66 20 61 20    ** occur if a 
20a0: 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20  file is updated 
20b0: 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 75 70 64  without also upd
20c0: 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61  ating the transa
20d0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74  ction.  ** count
20e0: 65 72 2e 20 20 54 68 69 73 20 74 65 73 74 20 69  er.  This test i
20f0: 73 20 6d 61 64 65 20 74 6f 20 61 76 6f 69 64 20  s made to avoid 
2100: 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20 73 69 6d  new problems sim
2110: 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
2120: 20 6f 6e 65 20 64 65 73 63 72 69 62 65 64 20 62   one described b
2130: 79 20 74 69 63 6b 65 74 20 23 33 35 38 34 2e 20  y ticket #3584. 
2140: 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  .  */.  unsigned
2150: 20 63 68 61 72 20 74 72 61 6e 73 43 6e 74 72 43   char transCntrC
2160: 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  hng;   /* True i
2170: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
2180: 6e 20 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65  n counter change
2190: 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
21a0: 63 68 61 72 20 64 62 55 70 64 61 74 65 3b 20 20  char dbUpdate;  
21b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
21c0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 64 61 74   any part of dat
21d0: 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
21e0: 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
21f0: 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c 57 72   char inNormalWr
2200: 69 74 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  ite;   /* True i
2210: 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 77 72  f in a normal wr
2220: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ite operation */
2230: 0a 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ..#endif..#ifdef
2240: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
2250: 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20  * In test mode, 
2260: 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  increase the siz
2270: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
2280: 75 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61  ure a bit so tha
2290: 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61  t .  ** it is la
22a0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74  rger than the st
22b0: 72 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64  ruct CrashFile d
22c0: 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e  efined in test6.
22d0: 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61  c..  */.  char a
22e0: 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e  Padding[32];.#en
22f0: 64 69 66 0a 7d 3b 0a 0a 2f 2a 20 54 68 69 73 20  dif.};../* This 
2300: 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 74  variable holds t
2310: 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 28 70  he process id (p
2320: 69 64 29 20 66 72 6f 6d 20 77 68 65 6e 20 74 68  id) from when th
2330: 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 28 29 0a  e xRandomness().
2340: 2a 2a 20 6d 65 74 68 6f 64 20 77 61 73 20 63 61  ** method was ca
2350: 6c 6c 65 64 2e 20 20 49 66 20 78 4f 70 65 6e 28  lled.  If xOpen(
2360: 29 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  ) is called from
2370: 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f   a different pro
2380: 63 65 73 73 20 69 64 2c 0a 2a 2a 20 69 6e 64 69  cess id,.** indi
2390: 63 61 74 69 6e 67 20 74 68 61 74 20 61 20 66 6f  cating that a fo
23a0: 72 6b 28 29 20 68 61 73 20 6f 63 63 75 72 72 65  rk() has occurre
23b0: 64 2c 20 74 68 65 20 50 52 4e 47 20 77 69 6c 6c  d, the PRNG will
23c0: 20 62 65 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74   be reset..*/.st
23d0: 61 74 69 63 20 70 69 64 5f 74 20 72 61 6e 64 6f  atic pid_t rando
23e0: 6d 6e 65 73 73 50 69 64 20 3d 20 30 3b 0a 0a 2f  mnessPid = 0;../
23f0: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
2400: 75 65 73 20 66 6f 72 20 74 68 65 20 75 6e 69 78  ues for the unix
2410: 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 20 62  File.ctrlFlags b
2420: 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69  itmask:.*/.#defi
2430: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  ne UNIXFILE_EXCL
2440: 20 20 20 20 20 20 20 20 30 78 30 31 20 20 20 20          0x01    
2450: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 73 20   /* Connections 
2460: 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65 73 73  from one process
2470: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
2480: 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
2490: 20 20 20 20 20 20 30 78 30 32 20 20 20 20 20 2f        0x02     /
24a0: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * Connection is 
24b0: 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  read only */.#de
24c0: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 45  fine UNIXFILE_PE
24d0: 52 53 49 53 54 5f 57 41 4c 20 30 78 30 34 20 20  RSIST_WAL 0x04  
24e0: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
24f0: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66   WAL mode */.#if
2500: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
2510: 42 4c 45 5f 44 49 52 53 59 4e 43 0a 23 20 64 65  BLE_DIRSYNC.# de
2520: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49  fine UNIXFILE_DI
2530: 52 53 59 4e 43 20 20 20 20 30 78 30 38 20 20 20  RSYNC    0x08   
2540: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 73    /* Directory s
2550: 79 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65  ync needed */.#e
2560: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 4e 49  lse.# define UNI
2570: 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20  XFILE_DIRSYNC   
2580: 20 30 78 30 30 0a 23 65 6e 64 69 66 0a 23 64 65   0x00.#endif.#de
2590: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 53  fine UNIXFILE_PS
25a0: 4f 57 20 20 20 20 20 20 20 20 30 78 31 30 20 20  OW        0x10  
25b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43     /* SQLITE_IOC
25c0: 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
25d0: 52 57 52 49 54 45 20 2a 2f 0a 23 64 65 66 69 6e  RWRITE */.#defin
25e0: 65 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  e UNIXFILE_DELET
25f0: 45 20 20 20 20 20 20 30 78 32 30 20 20 20 20 20  E      0x20     
2600: 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f  /* Delete on clo
2610: 73 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  se */.#define UN
2620: 49 58 46 49 4c 45 5f 55 52 49 20 20 20 20 20 20  IXFILE_URI      
2630: 20 20 20 30 78 34 30 20 20 20 20 20 2f 2a 20 46     0x40     /* F
2640: 69 6c 65 6e 61 6d 65 20 6d 69 67 68 74 20 68 61  ilename might ha
2650: 76 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ve query paramet
2660: 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ers */.#define U
2670: 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20  NIXFILE_NOLOCK  
2680: 20 20 20 20 30 78 38 30 20 20 20 20 20 2f 2a 20      0x80     /* 
2690: 44 6f 20 6e 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  Do no file locki
26a0: 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  ng */../*.** Inc
26b0: 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69  lude code that i
26c0: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  s common to all 
26d0: 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a  os_*.c files.*/.
26e0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d  #include "os_com
26f0: 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65  mon.h"../*.** De
2700: 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63  fine various mac
2710: 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73  ros that are mis
2720: 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73  sing from some s
2730: 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
2740: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2750: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2760: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2770: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
2780: 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f  LE_LFS.# undef O
2790: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
27a0: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
27b0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
27c0: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65   O_NOFOLLOW.# de
27d0: 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20  fine O_NOFOLLOW 
27e0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
27f0: 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69   O_BINARY.# defi
2800: 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65  ne O_BINARY 0.#e
2810: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
2820: 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72  threadid macro r
2830: 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74  esolves to the t
2840: 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30  hread-id or to 0
2850: 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74  .  Used for.** t
2860: 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
2870: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
2880: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
2890: 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65  AFE.#define thre
28a0: 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c  adid pthread_sel
28b0: 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  f().#else.#defin
28c0: 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e  e threadid 0.#en
28d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 41 56 45 5f  dif../*.** HAVE_
28e0: 4d 52 45 4d 41 50 20 64 65 66 61 75 6c 74 73 20  MREMAP defaults 
28f0: 74 6f 20 74 72 75 65 20 6f 6e 20 4c 69 6e 75 78  to true on Linux
2900: 20 61 6e 64 20 66 61 6c 73 65 20 65 76 65 72 79   and false every
2910: 77 68 65 72 65 20 65 6c 73 65 2e 0a 2a 2f 0a 23  where else..*/.#
2920: 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56 45  if !defined(HAVE
2930: 5f 4d 52 45 4d 41 50 29 0a 23 20 69 66 20 64 65  _MREMAP).# if de
2940: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
2950: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 47 4e 55   && defined(_GNU
2960: 5f 53 4f 55 52 43 45 29 0a 23 20 20 64 65 66 69  _SOURCE).#  defi
2970: 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 31  ne HAVE_MREMAP 1
2980: 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  .# else.#  defin
2990: 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 30 0a  e HAVE_MREMAP 0.
29a0: 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  # endif.#endif..
29b0: 2f 2a 0a 2a 2a 20 45 78 70 6c 69 63 69 74 6c 79  /*.** Explicitly
29c0: 20 63 61 6c 6c 20 74 68 65 20 36 34 2d 62 69 74   call the 64-bit
29d0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 6c 73 65 65   version of lsee
29e0: 6b 28 29 20 6f 6e 20 41 6e 64 72 6f 69 64 2e 20  k() on Android. 
29f0: 4f 74 68 65 72 77 69 73 65 2c 20 6c 73 65 65 6b  Otherwise, lseek
2a00: 28 29 0a 2a 2a 20 69 73 20 74 68 65 20 33 32 2d  ().** is the 32-
2a10: 62 69 74 20 76 65 72 73 69 6f 6e 2c 20 65 76 65  bit version, eve
2a20: 6e 20 69 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45  n if _FILE_OFFSE
2a30: 54 5f 42 49 54 53 3d 36 34 20 69 73 20 64 65 66  T_BITS=64 is def
2a40: 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ined..*/.#ifdef 
2a50: 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 23 20 64 65  __ANDROID__.# de
2a60: 66 69 6e 65 20 6c 73 65 65 6b 20 6c 73 65 65 6b  fine lseek lseek
2a70: 36 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  64.#endif..#ifde
2a80: 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a  f __linux__./*.*
2a90: 2a 20 4c 69 6e 75 78 2d 73 70 65 63 69 66 69 63  * Linux-specific
2aa0: 20 49 4f 43 54 4c 20 6d 61 67 69 63 20 6e 75 6d   IOCTL magic num
2ab0: 62 65 72 73 20 75 73 65 64 20 66 6f 72 20 63 6f  bers used for co
2ac0: 6e 74 72 6f 6c 6c 69 6e 67 20 46 32 46 53 0a 2a  ntrolling F2FS.*
2ad0: 2f 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f 49  /.#define F2FS_I
2ae0: 4f 43 54 4c 5f 4d 41 47 49 43 20 20 20 20 20 20  OCTL_MAGIC      
2af0: 20 20 30 78 66 35 0a 23 64 65 66 69 6e 65 20 46    0xf5.#define F
2b00: 32 46 53 5f 49 4f 43 5f 53 54 41 52 54 5f 41 54  2FS_IOC_START_AT
2b10: 4f 4d 49 43 5f 57 52 49 54 45 20 20 20 20 20 5f  OMIC_WRITE     _
2b20: 49 4f 28 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41  IO(F2FS_IOCTL_MA
2b30: 47 49 43 2c 20 31 29 0a 23 64 65 66 69 6e 65 20  GIC, 1).#define 
2b40: 46 32 46 53 5f 49 4f 43 5f 43 4f 4d 4d 49 54 5f  F2FS_IOC_COMMIT_
2b50: 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 20 20 20  ATOMIC_WRITE    
2b60: 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54 4c 5f 4d  _IO(F2FS_IOCTL_M
2b70: 41 47 49 43 2c 20 32 29 0a 23 64 65 66 69 6e 65  AGIC, 2).#define
2b80: 20 46 32 46 53 5f 49 4f 43 5f 53 54 41 52 54 5f   F2FS_IOC_START_
2b90: 56 4f 4c 41 54 49 4c 45 5f 57 52 49 54 45 20 20  VOLATILE_WRITE  
2ba0: 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54 4c 5f   _IO(F2FS_IOCTL_
2bb0: 4d 41 47 49 43 2c 20 33 29 0a 23 64 65 66 69 6e  MAGIC, 3).#defin
2bc0: 65 20 46 32 46 53 5f 49 4f 43 5f 41 42 4f 52 54  e F2FS_IOC_ABORT
2bd0: 5f 56 4f 4c 41 54 49 4c 45 5f 57 52 49 54 45 20  _VOLATILE_WRITE 
2be0: 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54 4c    _IO(F2FS_IOCTL
2bf0: 5f 4d 41 47 49 43 2c 20 35 29 0a 23 64 65 66 69  _MAGIC, 5).#defi
2c00: 6e 65 20 46 32 46 53 5f 49 4f 43 5f 47 45 54 5f  ne F2FS_IOC_GET_
2c10: 46 45 41 54 55 52 45 53 20 20 20 20 20 20 20 20  FEATURES        
2c20: 20 20 20 5f 49 4f 52 28 46 32 46 53 5f 49 4f 43     _IOR(F2FS_IOC
2c30: 54 4c 5f 4d 41 47 49 43 2c 20 31 32 2c 20 75 33  TL_MAGIC, 12, u3
2c40: 32 29 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f  2).#define F2FS_
2c50: 46 45 41 54 55 52 45 5f 41 54 4f 4d 49 43 5f 57  FEATURE_ATOMIC_W
2c60: 52 49 54 45 20 30 78 30 30 30 34 0a 23 65 6e 64  RITE 0x0004.#end
2c70: 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20  if /* __linux__ 
2c80: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65  */.../*.** Diffe
2c90: 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d  rent Unix system
2ca0: 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29  s declare open()
2cb0: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61   in different wa
2cc0: 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a  ys.  Same use.**
2cd0: 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72   open(const char
2ce0: 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20  *,int,mode_t).  
2cf0: 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28  Others use open(
2d00: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c  const char*,int,
2d10: 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66  ...)..** The dif
2d20: 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72  ference is impor
2d30: 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20  tant when using 
2d40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2d50: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
2d60: 20 54 68 65 20 73 61 66 65 73 74 20 77 61 79 20   The safest way 
2d70: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 65  to deal with the
2d80: 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61   problem is to a
2d90: 6c 77 61 79 73 20 75 73 65 20 74 68 69 73 20 77  lways use this w
2da0: 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20  rapper.** which 
2db0: 61 6c 77 61 79 73 20 68 61 73 20 74 68 65 20 73  always has the s
2dc0: 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64  ame well-defined
2dd0: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73   interface..*/.s
2de0: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f  tatic int posixO
2df0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
2e00: 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  zFile, int flags
2e10: 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72  , int mode){.  r
2e20: 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65  eturn open(zFile
2e30: 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a  , flags, mode);.
2e40: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
2e50: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
2e60: 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74  c int openDirect
2e70: 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ory(const char*,
2e80: 20 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69   int*);.static i
2e90: 6e 74 20 75 6e 69 78 47 65 74 70 61 67 65 73 69  nt unixGetpagesi
2ea0: 7a 65 28 76 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a  ze(void);../*.**
2eb0: 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c   Many system cal
2ec0: 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20  ls are accessed 
2ed0: 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d  through pointer-
2ee0: 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20  to-functions so 
2ef0: 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79  that.** they may
2f00: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61   be overridden a
2f10: 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63  t runtime to fac
2f20: 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e  ilitate fault in
2f30: 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a  jection during.*
2f40: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61  * testing and sa
2f50: 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66  ndboxing.  The f
2f60: 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68  ollowing array h
2f70: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61  olds the names a
2f80: 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74  nd pointers.** t
2f90: 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62  o all overrideab
2fa0: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e  le system calls.
2fb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
2fc0: 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b  t unix_syscall {
2fd0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2fe0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
2ff0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3000: 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20  system call */. 
3010: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
3020: 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f  _ptr pCurrent; /
3030: 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * Current value 
3040: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
3050: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
3060: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66  syscall_ptr pDef
3070: 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74  ault; /* Default
3080: 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73   value */.} aSys
3090: 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22  call[] = {.  { "
30a0: 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28  open",         (
30b0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
30c0: 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20  ptr)posixOpen,  
30d0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
30e0: 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28  Open      ((int(
30f0: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
3100: 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  nt,int))aSyscall
3110: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [0].pCurrent).. 
3120: 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20   { "close",     
3130: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3140: 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20  all_ptr)close,  
3150: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3160: 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28  e osClose     ((
3170: 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73  int(*)(int))aSys
3180: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
3190: 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c  )..  { "access",
31a0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
31b0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65  syscall_ptr)acce
31c0: 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ss,     0  },.#d
31d0: 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20  efine osAccess  
31e0: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
31f0: 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73   char*,int))aSys
3200: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
3210: 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c  )..  { "getcwd",
3220: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3230: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63  syscall_ptr)getc
3240: 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  wd,     0  },.#d
3250: 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20  efine osGetcwd  
3260: 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61    ((char*(*)(cha
3270: 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  r*,size_t))aSysc
3280: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
3290: 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20  ..  { "stat",   
32a0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
32b0: 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c  yscall_ptr)stat,
32c0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
32d0: 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20  fine osStat     
32e0: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
32f0: 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61  char*,struct sta
3300: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  t*))aSyscall[4].
3310: 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a  pCurrent)../*.**
3320: 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69   The DJGPP compi
3330: 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ler environment 
3340: 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b  looks mostly lik
3350: 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a  e Unix, but it.*
3360: 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74  * lacks the fcnt
3370: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  l() system call.
3380: 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63    So redefine fc
3390: 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65  ntl() to be some
33a0: 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c  thing.** that al
33b0: 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20  ways succeeds.  
33c0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
33d0: 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74  locking does not
33e0: 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20   occur under.** 
33f0: 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69  DJGPP.  But it i
3400: 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64  s DOS - what did
3410: 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a   you expect?.*/.
3420: 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  #ifdef __DJGPP__
3430: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
3440: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
3450: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64          0  },.#d
3460: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c  efine osFstat(a,
3470: 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20  b,c)    0.#else 
3480: 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22      .  { "fstat"
3490: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
34a0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73  3_syscall_ptr)fs
34b0: 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  tat,      0  },.
34c0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20  #define osFstat 
34d0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
34e0: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
34f0: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
3500: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  ent).#endif..  {
3510: 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20   "ftruncate",   
3520: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3530: 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c  l_ptr)ftruncate,
3540: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3550: 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e  osFtruncate ((in
3560: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29  t(*)(int,off_t))
3570: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
3580: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74  rent)..  { "fcnt
3590: 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  l",        (sqli
35a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35b0: 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d  fcntl,      0  }
35c0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  ,.#define osFcnt
35d0: 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  l     ((int(*)(i
35e0: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
35f0: 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74  call[7].pCurrent
3600: 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20  )..  { "read",  
3610: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3620: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
3630: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
3640: 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20  efine osRead    
3650: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3660: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  nt,void*,size_t)
3670: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
3680: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3690: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
36a0: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
36b0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
36c0: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
36d0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
36e0: 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20  ll_ptr)pread,   
36f0: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
3700: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
3710: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3720: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3730: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3740: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3750: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
3760: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
3770: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
3780: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
3790: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
37a0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
37b0: 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73  read64",      (s
37c0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
37d0: 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20 30  tr)pread64,    0
37e0: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
37f0: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3800: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3810: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3820: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3830: 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20 28  fine osPread64 (
3840: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
3850: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
3860: 36 34 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  64_t))aSyscall[1
3870: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
3880: 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20 20  { "write",      
3890: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
38a0: 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20  ll_ptr)write,   
38b0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
38c0: 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28 73   osWrite     ((s
38d0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
38e0: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
38f0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70  ))aSyscall[11].p
3900: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3910: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
3920: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
3930: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3940: 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20    { "pwrite",   
3950: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3960: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c  call_ptr)pwrite,
3970: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
3980: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
3990: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
39a0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
39b0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
39c0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
39d0: 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ite    ((ssize_t
39e0: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
39f0: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3a00: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3a10: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3a20: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
3a30: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3a40: 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77  PREAD64).  { "pw
3a50: 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71  rite64",     (sq
3a60: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3a70: 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30 20  r)pwrite64,   0 
3a80: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
3a90: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
3aa0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3ab0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3ac0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3ad0: 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20 20  ine osPwrite64  
3ae0: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3af0: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3b00: 65 5f 74 2c 6f 66 66 36 34 5f 74 29 29 5c 0a 20  e_t,off64_t))\. 
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b20: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e     aSyscall[13].
3b30: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3b40: 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28  fchmod",       (
3b50: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3b60: 70 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20  ptr)fchmod,     
3b70: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3b80: 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28  ne osFchmod    (
3b90: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65  (int(*)(int,mode
3ba0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d  _t))aSyscall[14]
3bb0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3bc0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53  defined(HAVE_POS
3bd0: 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26  IX_FALLOCATE) &&
3be0: 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c   HAVE_POSIX_FALL
3bf0: 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f  OCATE.  { "fallo
3c00: 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74  cate",    (sqlit
3c10: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3c20: 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20  osix_fallocate, 
3c30: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3c40: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
3c50: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3c60: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3c70: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3c80: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c  if.#define osFal
3c90: 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  locate ((int(*)(
3ca0: 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29  int,off_t,off_t)
3cb0: 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43  )aSyscall[15].pC
3cc0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e  urrent)..  { "un
3cd0: 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71  link",       (sq
3ce0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3cf0: 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20  r)unlink,       
3d00: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3d10: 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69   osUnlink    ((i
3d20: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3d30: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e  *))aSyscall[16].
3d40: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3d50: 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20  openDirectory", 
3d60: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3d70: 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65  all_ptr)openDire
3d80: 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c  ctory,      0 },
3d90: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44  .#define osOpenD
3da0: 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a  irectory ((int(*
3db0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  )(const char*,in
3dc0: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d  t*))aSyscall[17]
3dd0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3de0: 22 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20 20  "mkdir",        
3df0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3e00: 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20 20  _ptr)mkdir,     
3e10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69        0 },.#defi
3e20: 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20 28  ne osMkdir     (
3e30: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
3e40: 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73  ar*,mode_t))aSys
3e50: 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e  call[18].pCurren
3e60: 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c  t)..  { "rmdir",
3e70: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3e80: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64  _syscall_ptr)rmd
3e90: 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  ir,           0 
3ea0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d 64  },.#define osRmd
3eb0: 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  ir     ((int(*)(
3ec0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79  const char*))aSy
3ed0: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65  scall[19].pCurre
3ee0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3ef0: 28 48 41 56 45 5f 46 43 48 4f 57 4e 29 0a 20 20  (HAVE_FCHOWN).  
3f00: 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20 20 20  { "fchown",     
3f10: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3f20: 6c 6c 5f 70 74 72 29 66 63 68 6f 77 6e 2c 20 20  ll_ptr)fchown,  
3f30: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3f40: 73 65 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c  se.  { "fchown",
3f50: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3f60: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3f80: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
3f90: 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69   osFchown    ((i
3fa0: 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c  nt(*)(int,uid_t,
3fb0: 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  gid_t))aSyscall[
3fc0: 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  20].pCurrent)..#
3fd0: 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
3fe0: 46 43 48 4f 57 4e 29 0a 20 20 7b 20 22 67 65 74  FCHOWN).  { "get
3ff0: 65 75 69 64 22 2c 20 20 20 20 20 20 28 73 71 6c  euid",      (sql
4000: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4010: 29 67 65 74 65 75 69 64 2c 20 20 20 20 20 20 20  )geteuid,       
4020: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4030: 20 22 67 65 74 65 75 69 64 22 2c 20 20 20 20 20   "geteuid",     
4040: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4050: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
4060: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4070: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  if.#define osGet
4080: 65 75 69 64 20 20 20 28 28 75 69 64 5f 74 28 2a  euid   ((uid_t(*
4090: 29 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c  )(void))aSyscall
40a0: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [21].pCurrent)..
40b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
40c0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
40d0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
40e0: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61  _SIZE>0.  { "mma
40f0: 70 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  p",         (sql
4100: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4110: 29 6d 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  )mmap,          
4120: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4130: 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 20   "mmap",        
4140: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4150: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
4160: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4170: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61  if.#define osMma
4180: 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69  p ((void*(*)(voi
4190: 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e  d*,size_t,int,in
41a0: 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79  t,int,off_t))aSy
41b0: 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65  scall[22].pCurre
41c0: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
41d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
41e0: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
41f0: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b  _MMAP_SIZE>0.  {
4200: 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20   "munmap",      
4210: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4220: 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20  l_ptr)munmap,   
4230: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4240: 65 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20  e.  { "munmap", 
4250: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
4260: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
4270: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4280: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
4290: 6f 73 4d 75 6e 6d 61 70 20 28 28 69 6e 74 28 2a  osMunmap ((int(*
42a0: 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29  )(void*,size_t))
42b0: 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75  aSyscall[23].pCu
42c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56 45  rrent)..#if HAVE
42d0: 5f 4d 52 45 4d 41 50 20 26 26 20 28 21 64 65 66  _MREMAP && (!def
42e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
42f0: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
4300: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29  MAX_MMAP_SIZE>0)
4310: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
4320: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
4330: 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70  scall_ptr)mremap
4340: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
4350: 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61  #else.  { "mrema
4360: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
4370: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
4380: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4390: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66  0 },.#endif.#def
43a0: 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76  ine osMremap ((v
43b0: 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69  oid*(*)(void*,si
43c0: 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c  ze_t,size_t,int,
43d0: 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 34  ...))aSyscall[24
43e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
43f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4400: 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51  _OMIT_WAL) || SQ
4410: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
4420: 5a 45 3e 30 0a 20 20 7b 20 22 67 65 74 70 61 67  ZE>0.  { "getpag
4430: 65 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65  esize",  (sqlite
4440: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e  3_syscall_ptr)un
4450: 69 78 47 65 74 70 61 67 65 73 69 7a 65 2c 20 30  ixGetpagesize, 0
4460: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 67   },.#else.  { "g
4470: 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73  etpagesize",  (s
4480: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
4490: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  tr)0,           
44a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
44b0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 70 61 67  #define osGetpag
44c0: 65 73 69 7a 65 20 28 28 69 6e 74 28 2a 29 28 76  esize ((int(*)(v
44d0: 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b 32 35  oid))aSyscall[25
44e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
44f0: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45   defined(HAVE_RE
4500: 41 44 4c 49 4e 4b 29 0a 20 20 7b 20 22 72 65 61  ADLINK).  { "rea
4510: 64 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c  dlink",     (sql
4520: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4530: 29 72 65 61 64 6c 69 6e 6b 2c 20 20 20 20 20 20  )readlink,      
4540: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4550: 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 20 20 20   "readlink",    
4560: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4570: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
4580: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4590: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  if.#define osRea
45a0: 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f 74 28  dlink ((ssize_t(
45b0: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  *)(const char*,c
45c0: 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  har*,size_t))aSy
45d0: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
45e0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
45f0: 28 48 41 56 45 5f 4c 53 54 41 54 29 0a 20 20 7b  (HAVE_LSTAT).  {
4600: 20 22 6c 73 74 61 74 22 2c 20 20 20 20 20 20 20   "lstat",       
4610: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
4620: 6c 6c 5f 70 74 72 29 6c 73 74 61 74 2c 20 20 20  ll_ptr)lstat,   
4630: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4640: 65 0a 20 20 7b 20 22 6c 73 74 61 74 22 2c 20 20  e.  { "lstat",  
4650: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
4660: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
4670: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4680: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
4690: 6f 73 4c 73 74 61 74 20 20 20 20 20 20 28 28 69  osLstat      ((i
46a0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
46b0: 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29  *,struct stat*))
46c0: 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43 75  aSyscall[27].pCu
46d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
46e0: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26  ned(__linux__) &
46f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4700: 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
4710: 4f 4d 49 43 5f 57 52 49 54 45 29 0a 23 20 69 66  OMIC_WRITE).# if
4720: 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a  def __ANDROID__.
4730: 20 20 7b 20 22 69 6f 63 74 6c 22 2c 20 28 73 71    { "ioctl", (sq
4740: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
4750: 72 29 28 69 6e 74 28 2a 29 28 69 6e 74 2c 20 69  r)(int(*)(int, i
4760: 6e 74 2c 20 2e 2e 2e 29 29 69 6f 63 74 6c 2c 20  nt, ...))ioctl, 
4770: 30 20 7d 2c 0a 23 20 65 6c 73 65 0a 20 20 7b 20  0 },.# else.  { 
4780: 22 69 6f 63 74 6c 22 2c 20 20 20 20 20 20 20 20  "ioctl",        
4790: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
47a0: 6c 5f 70 74 72 29 69 6f 63 74 6c 2c 20 20 20 20  l_ptr)ioctl,    
47b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 20 65 6e 64        0 },.# end
47c0: 69 66 0a 23 65 6c 73 65 0a 20 20 7b 20 22 69 6f  if.#else.  { "io
47d0: 63 74 6c 22 2c 20 20 20 20 20 20 20 20 20 28 73  ctl",         (s
47e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
47f0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  tr)0,           
4800: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
4810: 64 65 66 69 6e 65 20 6f 73 49 6f 63 74 6c 20 28  define osIoctl (
4820: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c  (int(*)(int,int,
4830: 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 38  ...))aSyscall[28
4840: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20  ].pCurrent)..}; 
4850: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76  /* End of the ov
4860: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
4870: 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 0a 2f 2a 0a  m calls */.../*.
4880: 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  ** On some syste
4890: 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20 66 63 68  ms, calls to fch
48a0: 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72 69 67 67  own() will trigg
48b0: 65 72 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  er a message in 
48c0: 61 20 73 65 63 75 72 69 74 79 0a 2a 2a 20 6c 6f  a security.** lo
48d0: 67 20 69 66 20 74 68 65 79 20 63 6f 6d 65 20 66  g if they come f
48e0: 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70 72 6f  rom non-root pro
48f0: 63 65 73 73 65 73 2e 20 20 53 6f 20 61 76 6f 69  cesses.  So avoi
4900: 64 20 63 61 6c 6c 69 6e 67 20 66 63 68 6f 77 6e  d calling fchown
4910: 28 29 20 69 66 0a 2a 2a 20 77 65 20 61 72 65 20  () if.** we are 
4920: 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61 73 20 72  not running as r
4930: 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oot..*/.static i
4940: 6e 74 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28  nt robustFchown(
4950: 69 6e 74 20 66 64 2c 20 75 69 64 5f 74 20 75 69  int fd, uid_t ui
4960: 64 2c 20 67 69 64 5f 74 20 67 69 64 29 7b 0a 23  d, gid_t gid){.#
4970: 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
4980: 46 43 48 4f 57 4e 29 0a 20 20 72 65 74 75 72 6e  FCHOWN).  return
4990: 20 6f 73 47 65 74 65 75 69 64 28 29 20 3f 20 30   osGeteuid() ? 0
49a0: 20 3a 20 6f 73 46 63 68 6f 77 6e 28 66 64 2c 75   : osFchown(fd,u
49b0: 69 64 2c 67 69 64 29 3b 0a 23 65 6c 73 65 0a 20  id,gid);.#else. 
49c0: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
49d0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  f.}../*.** This 
49e0: 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65  is the xSetSyste
49f0: 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f  mCall() method o
4a00: 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f  f sqlite3_vfs fo
4a10: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
4a20: 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52  "unix" VFSes.  R
4a30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4a40: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
4a50: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
4a60: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
4a70: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
4a80: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
4a90: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
4aa0: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
4ab0: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
4ac0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4ad0: 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c  unixSetSystemCal
4ae0: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
4af0: 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20   *pNotUsed,     
4b00: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f     /* The VFS po
4b10: 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64  inter.  Not used
4b20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4b30: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
4b40: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
4b50: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76  ystem call to ov
4b60: 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69  erride */.  sqli
4b70: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
4b80: 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69  pNewFunc  /* Poi
4b90: 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74  nter to new syst
4ba0: 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f  em call value */
4bb0: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
4bc0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
4bd0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
4be0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
4bf0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
4c00: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
4c10: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
4c20: 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20  zName is given, 
4c30: 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74  restore all syst
4c40: 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69  em calls to thei
4c50: 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  r default.    **
4c60: 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65   settings and re
4c70: 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f  turn NULL.    */
4c80: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
4c90: 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  _OK;.    for(i=0
4ca0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
4cb0: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
4cc0: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
4cd0: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
4ce0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29  ll[i].pDefault )
4cf0: 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  {.        aSysca
4d00: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
4d10: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4d20: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  fault;.      }. 
4d30: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
4d40: 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
4d50: 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72   specified, oper
4d60: 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20  ate on only the 
4d70: 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  one system call.
4d80: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
4d90: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
4da0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
4db0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
4dc0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
4dd0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
4de0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
4df0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
4e00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
4e10: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4e20: 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  fault==0 ){.    
4e30: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
4e40: 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79  ].pDefault = aSy
4e50: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4e60: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
4e70: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4e80: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
4e90: 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70   pNewFunc==0 ) p
4ea0: 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61  NewFunc = aSysca
4eb0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
4ec0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
4ed0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70  [i].pCurrent = p
4ee0: 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  NewFunc;.       
4ef0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4f00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4f10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4f20: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
4f30: 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c   of a system cal
4f40: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
4f50: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
4f60: 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20  a.** recognized 
4f70: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
4f80: 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20  .  NULL is also 
4f90: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
4fa0: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69  system call.** i
4fb0: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  s currently unde
4fc0: 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
4fd0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
4fe0: 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79 73 74  _ptr unixGetSyst
4ff0: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
5000: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
5010: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5020: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
5030: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
5040: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
5050: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
5060: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
5070: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
5080: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
5090: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
50a0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
50b0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
50c0: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
50d0: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
50e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
50f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5100: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
5110: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
5120: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
5130: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
5140: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
5150: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
5160: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
5170: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
5180: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
5190: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
51a0: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
51b0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
51c0: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
51d0: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
51e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
51f0: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
5200: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
5210: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5220: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
5230: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
5240: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
5250: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
5260: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
5270: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
5280: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
5290: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
52a0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
52b0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
52c0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
52d0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
52e0: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
52f0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
5300: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
5310: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
5320: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
5330: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
5340: 2a 20 44 6f 20 6e 6f 74 20 61 63 63 65 70 74 20  * Do not accept 
5350: 61 6e 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  any file descrip
5360: 74 6f 72 20 6c 65 73 73 20 74 68 61 6e 20 74 68  tor less than th
5370: 69 73 20 76 61 6c 75 65 2c 20 69 6e 20 6f 72 64  is value, in ord
5380: 65 72 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 6f  er to avoid.** o
5390: 70 65 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  pening database 
53a0: 66 69 6c 65 20 75 73 69 6e 67 20 66 69 6c 65 20  file using file 
53b0: 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74  descriptors that
53c0: 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c 79 20 75 73   are commonly us
53d0: 65 64 20 66 6f 72 20 0a 2a 2a 20 73 74 61 6e 64  ed for .** stand
53e0: 61 72 64 20 69 6e 70 75 74 2c 20 6f 75 74 70 75  ard input, outpu
53f0: 74 2c 20 61 6e 64 20 65 72 72 6f 72 2e 0a 2a 2f  t, and error..*/
5400: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5410: 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53  MINIMUM_FILE_DES
5420: 43 52 49 50 54 4f 52 0a 23 20 64 65 66 69 6e 65  CRIPTOR.# define
5430: 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f   SQLITE_MINIMUM_
5440: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 20  FILE_DESCRIPTOR 
5450: 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  3.#endif../*.** 
5460: 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29 2e 20 20  Invoke open().  
5470: 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c 65 20 74  Do so multiple t
5480: 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69 74 20 65  imes, until it e
5490: 69 74 68 65 72 20 73 75 63 63 65 65 64 73 20 6f  ither succeeds o
54a0: 72 0a 2a 2a 20 66 61 69 6c 73 20 66 6f 72 20 73  r.** fails for s
54b0: 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74 68 65 72  ome reason other
54c0: 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a 2a 2a 0a   than EINTR..**.
54d0: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 63  ** If the file c
54e0: 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 22 6d 22  reation mode "m"
54f0: 20 69 73 20 30 20 74 68 65 6e 20 73 65 74 20 69   is 0 then set i
5500: 74 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  t to the default
5510: 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74 65 2e 20   for.** SQLite. 
5520: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
5530: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
5540: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
5550: 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 30 36 34  (normally.** 064
5560: 34 29 20 61 73 20 6d 6f 64 69 66 69 65 64 20 62  4) as modified b
5570: 79 20 74 68 65 20 73 79 73 74 65 6d 20 75 6d 61  y the system uma
5580: 73 6b 2e 20 20 49 66 20 6d 20 69 73 20 6e 6f 74  sk.  If m is not
5590: 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d 61 6b 65   0, then.** make
55a0: 20 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69   the file creati
55b0: 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78 61 63 74  on mode be exact
55c0: 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67 20 74 68  ly m ignoring th
55d0: 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e umask..**.** T
55e0: 68 65 20 6d 20 70 61 72 61 6d 65 74 65 72 20 77  he m parameter w
55f0: 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20  ill be non-zero 
5600: 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65 61 74 69  only when creati
5610: 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75 72 6e 61  ng -wal, -journa
5620: 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68 6d 20 66  l,.** and -shm f
5630: 69 6c 65 73 2e 20 20 57 65 20 77 61 6e 74 20 74  iles.  We want t
5640: 68 6f 73 65 20 66 69 6c 65 73 20 74 6f 20 68 61  hose files to ha
5650: 76 65 20 2a 65 78 61 63 74 6c 79 2a 20 74 68 65  ve *exactly* the
5660: 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d 69 73 73   same.** permiss
5670: 69 6f 6e 73 20 61 73 20 74 68 65 69 72 20 6f 72  ions as their or
5680: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2c  iginal database,
5690: 20 75 6e 61 64 75 6c 74 65 72 61 74 65 64 20 62   unadulterated b
56a0: 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20  y the umask..** 
56b0: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 69 66 20  In that way, if 
56c0: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
56d0: 69 73 20 2d 72 77 2d 72 77 2d 72 77 20 6f 72 20  is -rw-rw-rw or 
56e0: 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e 64 20 61  -rw-rw-r-, and a
56f0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
5700: 63 72 61 73 68 65 73 20 61 6e 64 20 6c 65 61 76  crashes and leav
5710: 65 73 20 62 65 68 69 6e 64 20 68 6f 74 20 6a 6f  es behind hot jo
5720: 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 61 6e 79  urnals, then any
5730: 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74  .** process that
5740: 20 69 73 20 61 62 6c 65 20 74 6f 20 77 72 69 74   is able to writ
5750: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
5760: 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62 65 20 61  e will also be a
5770: 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63 6f 76 65  ble to.** recove
5780: 72 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  r the hot journa
5790: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
57a0: 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f  t robust_open(co
57b0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
57c0: 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29 7b 0a 20   f, mode_t m){. 
57d0: 20 69 6e 74 20 66 64 3b 0a 20 20 6d 6f 64 65 5f   int fd;.  mode_
57e0: 74 20 6d 32 20 3d 20 6d 20 3f 20 6d 20 3a 20 53  t m2 = m ? m : S
57f0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
5800: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a  LE_PERMISSIONS;.
5810: 20 20 77 68 69 6c 65 28 31 29 7b 0a 23 69 66 20    while(1){.#if 
5820: 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45  defined(O_CLOEXE
5830: 43 29 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70  C).    fd = osOp
5840: 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45 58 45 43  en(z,f|O_CLOEXEC
5850: 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ,m2);.#else.    
5860: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c  fd = osOpen(z,f,
5870: 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  m2);.#endif.    
5880: 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
5890: 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e    if( errno==EIN
58a0: 54 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  TR ) continue;. 
58b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
58c0: 7d 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 53 51  }.    if( fd>=SQ
58d0: 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c  LITE_MINIMUM_FIL
58e0: 45 5f 44 45 53 43 52 49 50 54 4f 52 20 29 20 62  E_DESCRIPTOR ) b
58f0: 72 65 61 6b 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  reak;.    osClos
5900: 65 28 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(fd);.    sqlit
5910: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
5920: 52 4e 49 4e 47 2c 20 0a 20 20 20 20 20 20 20 20  RNING, .        
5930: 20 20 20 20 20 20 20 20 22 61 74 74 65 6d 70 74          "attempt
5940: 20 74 6f 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20   to open \"%s\" 
5950: 61 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  as file descript
5960: 6f 72 20 25 64 22 2c 20 7a 2c 20 66 64 29 3b 0a  or %d", z, fd);.
5970: 20 20 20 20 66 64 20 3d 20 2d 31 3b 0a 20 20 20      fd = -1;.   
5980: 20 69 66 28 20 6f 73 4f 70 65 6e 28 22 2f 64 65   if( osOpen("/de
5990: 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20 6d 29 3c 30  v/null", f, m)<0
59a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
59b0: 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
59c0: 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20   if( m!=0 ){.   
59d0: 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
59e0: 74 61 74 62 75 66 3b 0a 20 20 20 20 20 20 69 66  tatbuf;.      if
59f0: 28 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  ( osFstat(fd, &s
5a00: 74 61 74 62 75 66 29 3d 3d 30 20 0a 20 20 20 20  tatbuf)==0 .    
5a10: 20 20 20 26 26 20 73 74 61 74 62 75 66 2e 73 74     && statbuf.st
5a20: 5f 73 69 7a 65 3d 3d 30 0a 20 20 20 20 20 20 20  _size==0.       
5a30: 26 26 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  && (statbuf.st_m
5a40: 6f 64 65 26 30 37 37 37 29 21 3d 6d 20 0a 20 20  ode&0777)!=m .  
5a50: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 6f      ){.        o
5a60: 73 46 63 68 6d 6f 64 28 66 64 2c 20 6d 29 3b 0a  sFchmod(fd, m);.
5a70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
5a80: 66 20 64 65 66 69 6e 65 64 28 46 44 5f 43 4c 4f  f defined(FD_CLO
5a90: 45 58 45 43 29 20 26 26 20 28 21 64 65 66 69 6e  EXEC) && (!defin
5aa0: 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29 20 7c 7c  ed(O_CLOEXEC) ||
5ab0: 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30 29 0a 20   O_CLOEXEC==0). 
5ac0: 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46     osFcntl(fd, F
5ad0: 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28  _SETFD, osFcntl(
5ae0: 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
5af0: 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
5b00: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
5b10: 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn fd;.}../*.** 
5b20: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
5b30: 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
5b40: 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
5b50: 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
5b60: 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
5b70: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
5b80: 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ct the unixInode
5b90: 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f  Info and.** vxwo
5ba0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
5bb0: 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66  s used by this f
5bc0: 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
5bd0: 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61  h may be .** sha
5be0: 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
5bf0: 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
5c00: 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65  unction unixMute
5c10: 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
5c20: 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
5c30: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
5c40: 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
5c50: 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
5c60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
5c70: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
5c80: 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
5c90: 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
5ca0: 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74  .**.**   unixEnt
5cb0: 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
5cc0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
5cd0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
5ce0: 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28   unixEnterLeave(
5cf0: 29 0a 2a 2a 0a 2a 2a 20 54 6f 20 70 72 65 76 65  ).**.** To preve
5d00: 6e 74 20 64 65 61 64 6c 6f 63 6b 2c 20 74 68 65  nt deadlock, the
5d10: 20 67 6c 6f 62 61 6c 20 75 6e 69 78 42 69 67 4c   global unixBigL
5d20: 6f 63 6b 20 6d 75 73 74 20 6d 75 73 74 20 62 65  ock must must be
5d30: 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 62 65 66   acquired.** bef
5d40: 6f 72 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  ore the unixInod
5d50: 65 49 6e 66 6f 2e 70 4c 6f 63 6b 4d 75 74 65 78  eInfo.pLockMutex
5d60: 20 6d 75 74 65 78 2c 20 69 66 20 62 6f 74 68 20   mutex, if both 
5d70: 61 72 65 20 68 65 6c 64 2e 20 20 49 74 20 69 73  are held.  It is
5d80: 0a 2a 2a 20 4f 4b 20 74 6f 20 67 65 74 20 74 68  .** OK to get th
5d90: 65 20 70 4c 6f 63 6b 4d 75 74 65 78 20 77 69 74  e pLockMutex wit
5da0: 68 6f 75 74 20 68 6f 6c 64 69 6e 67 20 75 6e 69  hout holding uni
5db0: 78 42 69 67 4c 6f 63 6b 20 66 69 72 73 74 2c 20  xBigLock first, 
5dc0: 62 75 74 20 69 66 0a 2a 2a 20 74 68 61 74 20 68  but if.** that h
5dd0: 61 70 70 65 6e 73 2c 20 74 68 65 20 75 6e 69 78  appens, the unix
5de0: 42 69 67 4c 6f 63 6b 20 6d 75 74 65 78 20 6d 75  BigLock mutex mu
5df0: 73 74 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72  st not be acquir
5e00: 65 64 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  ed until after.*
5e10: 2a 20 70 4c 6f 63 6b 4d 75 74 65 78 20 69 73 20  * pLockMutex is 
5e20: 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
5e30: 20 20 20 20 20 4f 4b 3a 20 20 20 20 20 65 6e 74       OK:     ent
5e40: 65 72 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29 2c  er(unixBigLock),
5e50: 20 20 65 6e 74 65 72 28 70 4c 6f 63 6b 49 6e 66    enter(pLockInf
5e60: 6f 29 0a 2a 2a 20 20 20 20 20 20 4f 4b 3a 20 20  o).**      OK:  
5e70: 20 20 20 65 6e 74 65 72 28 75 6e 69 78 42 69 67     enter(unixBig
5e80: 4c 6f 63 6b 29 0a 2a 2a 20 20 20 20 20 20 4f 4b  Lock).**      OK
5e90: 3a 20 20 20 20 20 65 6e 74 65 72 28 70 4c 6f 63  :     enter(pLoc
5ea0: 6b 49 6e 66 6f 29 0a 2a 2a 20 20 20 45 52 52 4f  kInfo).**   ERRO
5eb0: 52 3a 20 20 20 20 20 65 6e 74 65 72 28 70 4c 6f  R:     enter(pLo
5ec0: 63 6b 49 6e 66 6f 29 2c 20 65 6e 74 65 72 28 75  ckInfo), enter(u
5ed0: 6e 69 78 42 69 67 4c 6f 63 6b 29 0a 2a 2f 0a 73  nixBigLock).*/.s
5ee0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 75  tatic sqlite3_mu
5ef0: 74 65 78 20 2a 75 6e 69 78 42 69 67 4c 6f 63 6b  tex *unixBigLock
5f00: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f 69   = 0;.static voi
5f10: 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  d unixEnterMutex
5f20: 28 76 6f 69 64 29 7b 0a 20 20 61 73 73 65 72 74  (void){.  assert
5f30: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5f40: 6e 6f 74 68 65 6c 64 28 75 6e 69 78 42 69 67 4c  notheld(unixBigL
5f50: 6f 63 6b 29 20 29 3b 20 20 2f 2a 20 4e 6f 74 20  ock) );  /* Not 
5f60: 61 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65  a recursive mute
5f70: 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  x */.  sqlite3_m
5f80: 75 74 65 78 5f 65 6e 74 65 72 28 75 6e 69 78 42  utex_enter(unixB
5f90: 69 67 4c 6f 63 6b 29 3b 0a 7d 0a 73 74 61 74 69  igLock);.}.stati
5fa0: 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61 76 65  c void unixLeave
5fb0: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 61  Mutex(void){.  a
5fc0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5fd0: 75 74 65 78 5f 68 65 6c 64 28 75 6e 69 78 42 69  utex_held(unixBi
5fe0: 67 4c 6f 63 6b 29 20 29 3b 0a 20 20 73 71 6c 69  gLock) );.  sqli
5ff0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6000: 75 6e 69 78 42 69 67 4c 6f 63 6b 29 3b 0a 7d 0a  unixBigLock);.}.
6010: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
6020: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75  BUG.static int u
6030: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69  nixMutexHeld(voi
6040: 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  d) {.  return sq
6050: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6060: 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29 3b 0a 7d  (unixBigLock);.}
6070: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66  .#endif...#ifdef
6080: 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f   SQLITE_HAVE_OS_
6090: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  TRACE./*.** Help
60a0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
60b0: 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61  printing out tra
60c0: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
60d0: 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a  rom debugging.**
60e0: 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20   binaries. This 
60f0: 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
6100: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
6110: 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  n of the supplie
6120: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63  d.** integer loc
6130: 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69  k-type..*/.stati
6140: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
6150: 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69  FileLock(int eFi
6160: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63  leLock){.  switc
6170: 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  h( eFileLock ){.
6180: 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b      case NO_LOCK
6190: 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b  : return "NONE";
61a0: 0a 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44  .    case SHARED
61b0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53  _LOCK: return "S
61c0: 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65  HARED";.    case
61d0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20   RESERVED_LOCK: 
61e0: 72 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44  return "RESERVED
61f0: 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44  ";.    case PEND
6200: 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  ING_LOCK: return
6210: 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20   "PENDING";.    
6220: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
6230: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43  OCK: return "EXC
6240: 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72  LUSIVE";.  }.  r
6250: 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d  eturn "ERROR";.}
6260: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
6270: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
6280: 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75  E./*.** Print ou
6290: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  t information ab
62a0: 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20  out all locking 
62b0: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
62c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
62d0: 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62  s used for troub
62e0: 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73  leshooting locks
62f0: 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65   on multithreade
6300: 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20  d.** platforms. 
6310: 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69   Enable by compi
6320: 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44  ling with the -D
6330: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
6340: 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  E.** command-lin
6350: 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20  e option on the 
6360: 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20  compiler.  This 
6370: 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  code is normally
6380: 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a  .** turned off..
6390: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
63a0: 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20  ckTrace(int fd, 
63b0: 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66  int op, struct f
63c0: 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72  lock *p){.  char
63d0: 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70   *zOpName, *zTyp
63e0: 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e  e;.  int s;.  in
63f0: 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  t savedErrno;.  
6400: 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20  if( op==F_GETLK 
6410: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
6420: 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "GETLK";.  }els
6430: 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c  e if( op==F_SETL
6440: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
6450: 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "SETLK";.  }e
6460: 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46  lse{.    s = osF
6470: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
6480: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
6490: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75  gPrintf("fcntl u
64a0: 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c  nknown %d %d %d\
64b0: 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a  n", fd, op, s);.
64c0: 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20      return s;.  
64d0: 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  }.  if( p->l_typ
64e0: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
64f0: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
6500: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
6510: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
6520: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
6530: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "WRLCK";.  }els
6540: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
6550: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
6560: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
6570: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
6580: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20  sert( 0 );.  }. 
6590: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68   assert( p->l_wh
65a0: 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29  ence==SEEK_SET )
65b0: 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28  ;.  s = osFcntl(
65c0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61  fd, op, p);.  sa
65d0: 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  vedErrno = errno
65e0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
65f0: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64  Printf("fcntl %d
6600: 20 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20   %d %s %s %d %d 
6610: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74  %d %d\n",.     t
6620: 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70  hreadid, fd, zOp
6630: 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e  Name, zType, (in
6640: 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69  t)p->l_start, (i
6650: 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20  nt)p->l_len,.   
6660: 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c    (int)p->l_pid,
6670: 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d   s);.  if( s==(-
6680: 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c  1) && op==F_SETL
6690: 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d  K && (p->l_type=
66a0: 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c  =F_RDLCK || p->l
66b0: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20  _type==F_WRLCK) 
66c0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
66d0: 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d  ock l2;.    l2 =
66e0: 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c   *p;.    osFcntl
66f0: 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  (fd, F_GETLK, &l
6700: 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c  2);.    if( l2.l
6710: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
6720: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
6730: 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "RDLCK";.    }el
6740: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
6750: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
6760: 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43     zType = "WRLC
6770: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
6780: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55  ( l2.l_type==F_U
6790: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  NLCK ){.      zT
67a0: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
67b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
67c0: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20  assert( 0 );.   
67d0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
67e0: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
67f0: 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a  -failure-reason:
6800: 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %s %d %d %d\n",
6810: 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28  .       zType, (
6820: 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20  int)l2.l_start, 
6830: 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28  (int)l2.l_len, (
6840: 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20  int)l2.l_pid);. 
6850: 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76   }.  errno = sav
6860: 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72  edErrno;.  retur
6870: 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73  n s;.}.#undef os
6880: 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73  Fcntl.#define os
6890: 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a  Fcntl lockTrace.
68a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
68b0: 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a  _LOCK_TRACE */..
68c0: 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75  /*.** Retry ftru
68d0: 6e 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68  ncate() calls th
68e0: 61 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45  at fail due to E
68f0: 49 4e 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  INTR.**.** All c
6900: 61 6c 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74  alls to ftruncat
6910: 65 28 29 20 77 69 74 68 69 6e 20 74 68 69 73 20  e() within this 
6920: 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d  file should be m
6930: 61 64 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74  ade through.** t
6940: 68 69 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e  his wrapper.  On
6950: 20 74 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61   the Android pla
6960: 74 66 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67  tform, bypassing
6970: 20 74 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77   the logic below
6980: 0a 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  .** could lead t
6990: 6f 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  o a corrupt data
69a0: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
69b0: 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  int robust_ftrun
69c0: 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69  cate(int h, sqli
69d0: 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20  te3_int64 sz){. 
69e0: 20 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20   int rc;.#ifdef 
69f0: 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a  __ANDROID__.  /*
6a00: 20 4f 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72   On Android, ftr
6a10: 75 6e 63 61 74 65 28 29 20 61 6c 77 61 79 73 20  uncate() always 
6a20: 75 73 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73  uses 32-bit offs
6a30: 65 74 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20  ets, even if .  
6a40: 2a 2a 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ** _FILE_OFFSET_
6a50: 42 49 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e  BITS=64 is defin
6a60: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ed. This means i
6a70: 74 20 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61  t is unsafe to a
6a80: 74 74 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74  ttempt to.  ** t
6a90: 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
6aa0: 6f 20 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65  o any size large
6ab0: 72 20 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c  r than 2GiB. Sil
6ac0: 65 6e 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79  ently ignore any
6ad0: 0a 20 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d  .  ** such attem
6ae0: 70 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73  pts.  */.  if( s
6af0: 7a 3e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  z>(sqlite3_int64
6b00: 29 30 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20  )0x7FFFFFFF ){. 
6b10: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
6b20: 4b 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  K;.  }else.#endi
6b30: 66 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46  f.  do{ rc = osF
6b40: 74 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20  truncate(h,sz); 
6b50: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
6b60: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
6b70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6b80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6b90: 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20  ne translates a 
6ba0: 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65  standard POSIX e
6bb0: 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73  rrno code into s
6bc0: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66  omething.** usef
6bd0: 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  ul to the client
6be0: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  s of the sqlite3
6bf0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65   functions.  Spe
6c00: 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73  cifically, it is
6c10: 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20  .** intended to 
6c20: 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69  translate a vari
6c30: 65 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69  ety of "try agai
6c40: 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53  n" errors into S
6c50: 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e  QLITE_BUSY.** an
6c60: 64 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  d a variety of "
6c70: 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65  please close the
6c80: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6c90: 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74   NOW" errors int
6ca0: 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  o .** SQLITE_IOE
6cb0: 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73  RR.** .** Errors
6cc0: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
6cd0: 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c  zation of locks,
6ce0: 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20   or file system 
6cf0: 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b  support for lock
6d00: 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e  s,.** should han
6d10: 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54  dle ENOLCK, ENOT
6d20: 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20  SUP, EOPNOTSUPP 
6d30: 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73  separately..*/.s
6d40: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
6d50: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
6d60: 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72  ror(int posixErr
6d70: 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f  or, int sqliteIO
6d80: 45 72 72 29 20 7b 0a 20 20 61 73 73 65 72 74 28  Err) {.  assert(
6d90: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
6da0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
6db0: 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  CK) || .        
6dc0: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
6dd0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
6de0: 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20  NLOCK) || .     
6df0: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6e00: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6e10: 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20  R_RDLOCK) ||.   
6e20: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
6e30: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
6e40: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
6e50: 44 4c 4f 43 4b 29 20 29 3b 0a 20 20 73 77 69 74  DLOCK) );.  swit
6e60: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
6e70: 7b 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a  {.  case EACCES:
6e80: 20 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a   .  case EAGAIN:
6e90: 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55  .  case ETIMEDOU
6ea0: 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a  T:.  case EBUSY:
6eb0: 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20  .  case EINTR:. 
6ec0: 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a   case ENOLCK:  .
6ed0: 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46      /* random NF
6ee0: 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75  S retry error, u
6ef0: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
6f00: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
6f10: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
6f20: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
6f30: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
6f40: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
6f50: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
6f60: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a  LITE_BUSY;.    .
6f70: 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20    case EPERM: . 
6f80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6f90: 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 64 65  _PERM;.    .  de
6fa0: 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75  fault: .    retu
6fb0: 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a  rn sqliteIOErr;.
6fc0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a    }.}.../*******
6fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7010: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
7020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
7030: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
7040: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
7050: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
7060: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e  *******.**.** On
7070: 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f   most versions o
7080: 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67  f unix, we can g
7090: 65 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66  et a unique ID f
70a0: 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e  or a file by con
70b0: 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68  catenating.** th
70c0: 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20  e device number 
70d0: 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  and the inode nu
70e0: 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20  mber.  But this 
70f0: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
7100: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20   VxWorks..** On 
7110: 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75  VxWorks, a uniqu
7120: 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62  e file id must b
7130: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  e based on the c
7140: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
7150: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  e..**.** A point
7160: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
7170: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
7180: 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  ng structure can
7190: 20 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   be used as a.**
71a0: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
71b0: 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63  in VxWorks.  Eac
71c0: 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
71d0: 69 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  is structure con
71e0: 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20  tains.** a copy 
71f0: 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  of the canonical
7200: 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72   filename.  Ther
7210: 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65  e is also a refe
7220: 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a  rence count.  .*
7230: 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20  * The structure 
7240: 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65  is reclaimed whe
7250: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7260: 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64  pointers to it d
7270: 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e  rops to.** zero.
7280: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
7290: 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79   never very many
72a0: 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f   files open at o
72b0: 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b  ne time and look
72c0: 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  ups are not.** a
72d0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69   performance-cri
72e0: 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69  tical path, so i
72f0: 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  t is sufficient 
7300: 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20  to put these.** 
7310: 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20  structures on a 
7320: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  linked list..*/.
7330: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7340: 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20  leId {.  struct 
7350: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
7360: 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69  Next;  /* Next i
7370: 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  n a list of them
7380: 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   all */.  int nR
7390: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
73a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
73b0: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
73c0: 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  to this one */. 
73d0: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
73f0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
7400: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d  zCanonicalName[]
7410: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61   string */.  cha
7420: 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  r *zCanonicalNam
7430: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  e;         /* Ca
7440: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
7450: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56   */.};..#if OS_V
7460: 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c  XWORKS./* .** Al
7470: 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d  l unique filenam
7480: 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61  es are held on a
7490: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61   linked list hea
74a0: 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76  ded by this.** v
74b0: 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74  ariable:.*/.stat
74c0: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
74d0: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
74e0: 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  FileList = 0;../
74f0: 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20  *.** Simplify a 
7500: 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74  filename into it
7510: 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d  s canonical form
7520: 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68  .** by making th
7530: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e  e following chan
7540: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65  ges:.**.**  * re
7550: 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c  moving any trail
7560: 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74  ing and duplicat
7570: 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  e /.**  * conver
7580: 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20  t /./ into just 
7590: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
75a0: 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69  /A/../ where A i
75b0: 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d  s any simple nam
75c0: 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a  e into just /.**
75d0: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20  .** Changes are 
75e0: 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20  made in-place.  
75f0: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e  Return the new n
7600: 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a  ame length..**.*
7610: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  * The original f
7620: 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b  ilename is in z[
7630: 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e  0..n-1].  Return
7640: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
7650: 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  * characters in 
7660: 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e  the simplified n
7670: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
7680: 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69  nt vxworksSimpli
7690: 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20  fyName(char *z, 
76a0: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c  int n){.  int i,
76b0: 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31   j;.  while( n>1
76c0: 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20   && z[n-1]=='/' 
76d0: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28  ){ n--; }.  for(
76e0: 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
76f0: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
7700: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '/' ){.      if(
7710: 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63   z[i+1]=='/' ) c
7720: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
7730: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
7740: 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+2<n && z[i+2
7750: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
7760: 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20    i += 1;.      
7770: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
7780: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b    }.      if( z[
7790: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33  i+1]=='.' && i+3
77a0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e  <n && z[i+2]=='.
77b0: 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27  ' && z[i+3]=='/'
77c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
77d0: 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d  e( j>0 && z[j-1]
77e0: 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  !='/' ){ j--; }.
77f0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20          if( j>0 
7800: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
7810: 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    i += 2;.      
7820: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
7830: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
7840: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d  j++] = z[i];.  }
7850: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72  .  z[j] = 0;.  r
7860: 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn j;.}../*.*
7870: 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20  * Find a unique 
7880: 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20  file ID for the 
7890: 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70  given absolute p
78a0: 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  athname.  Return
78b0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
78c0: 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65   the vxworksFile
78d0: 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  Id object.  This
78e0: 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20   pointer is the 
78f0: 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49  unique.** file I
7900: 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65  D..**.** The nRe
7910: 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76  f field of the v
7920: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
7930: 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ect is increment
7940: 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
7950: 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72   object is retur
7960: 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f  ned.  A new vxwo
7970: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
7980: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
7990: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
79a0: 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e  global list if n
79b0: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
79c0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
79d0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
79e0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
79f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
7a00: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7a10: 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c   *vxworksFindFil
7a20: 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eId(const char *
7a30: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a  zAbsoluteName){.
7a40: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
7a50: 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20  FileId *pNew;   
7a60: 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20        /* search 
7a70: 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65  key and new file
7a80: 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20   ID */.  struct 
7a90: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
7aa0: 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20  Candidate;   /* 
7ab0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
7ac0: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
7ad0: 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  Ds */.  int n;  
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7b00: 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75  ength of zAbsolu
7b10: 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f  teName string */
7b20: 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73  ..  assert( zAbs
7b30: 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f  oluteName[0]=='/
7b40: 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  ' );.  n = (int)
7b50: 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65  strlen(zAbsolute
7b60: 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Name);.  pNew = 
7b70: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
7b80: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
7b90: 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28  + (n+1) );.  if(
7ba0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
7bb0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61  n 0;.  pNew->zCa
7bc0: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63  nonicalName = (c
7bd0: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
7be0: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43   memcpy(pNew->zC
7bf0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41  anonicalName, zA
7c00: 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31  bsoluteName, n+1
7c10: 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73  );.  n = vxworks
7c20: 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65  SimplifyName(pNe
7c30: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
7c40: 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61  e, n);..  /* Sea
7c50: 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74  rch for an exist
7c60: 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d  ing entry that m
7c70: 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f  atching the cano
7c80: 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a  nical name..  **
7c90: 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65   If found, incre
7ca0: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
7cb0: 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74  ce count and ret
7cc0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
7cd0: 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69  .  ** the existi
7ce0: 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f  ng file ID..  */
7cf0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
7d00: 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64  x();.  for(pCand
7d10: 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c  idate=vxworksFil
7d20: 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74  eList; pCandidat
7d30: 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43  e; pCandidate=pC
7d40: 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29  andidate->pNext)
7d50: 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64 69  {.    if( pCandi
7d60: 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a  date->nName==n .
7d70: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
7d80: 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f  Candidate->zCano
7d90: 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d  nicalName, pNew-
7da0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
7db0: 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20   n)==0.    ){.  
7dc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7dd0: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  e(pNew);.       
7de0: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66  pCandidate->nRef
7df0: 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c  ++;.       unixL
7e00: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
7e10: 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64      return pCand
7e20: 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  idate;.    }.  }
7e30: 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20  ..  /* No match 
7e40: 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77  was found.  We w
7e50: 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66  ill make a new f
7e60: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77  ile ID */.  pNew
7e70: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e  ->nRef = 1;.  pN
7e80: 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20  ew->nName = n;. 
7e90: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76   pNew->pNext = v
7ea0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a  xworksFileList;.
7eb0: 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73    vxworksFileLis
7ec0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78  t = pNew;.  unix
7ed0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
7ee0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
7ef0: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
7f00: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
7f10: 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73  unt on a vxworks
7f20: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20  FileId object.  
7f30: 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  Free.** the obje
7f40: 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ct when the refe
7f50: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
7f60: 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  hes zero..*/.sta
7f70: 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73  tic void vxworks
7f80: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74  ReleaseFileId(st
7f90: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7fa0: 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78  Id *pId){.  unix
7fb0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
7fc0: 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65  assert( pId->nRe
7fd0: 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52  f>0 );.  pId->nR
7fe0: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d  ef--;.  if( pId-
7ff0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
8000: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
8010: 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66  leId **pp;.    f
8020: 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69  or(pp=&vxworksFi
8030: 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a  leList; *pp && *
8040: 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28  pp!=pId; pp = &(
8050: 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d  (*pp)->pNext)){}
8060: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
8070: 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70  ==pId );.    *pp
8080: 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20   = pId->pNext;. 
8090: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
80a0: 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  pId);.  }.  unix
80b0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
80c0: 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
80d0: 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORKS */./*******
80e0: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
80f0: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
8100: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
8110: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
8120: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
8130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8170: 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a  ******/.../*****
8180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
81d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81e0: 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69  ***** Posix Advi
81f0: 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  sory Locking ***
8200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
8220: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
8230: 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  ocks are broken 
8240: 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49  by design.  ANSI
8250: 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39   STD 1003.1 (199
8260: 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e  6).** section 6.
8270: 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20  5.2.2 lines 483 
8280: 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63  through 490 spec
8290: 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20  ify that when a 
82a0: 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20  process.** sets 
82b0: 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b  or clears a lock
82c0: 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e  , that operation
82d0: 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70   overrides any p
82e0: 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a  rior locks set.*
82f0: 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  * by the same pr
8300: 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20  ocess.  It does 
8310: 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73  not explicitly s
8320: 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20  ay so, but this 
8330: 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20  implies.** that 
8340: 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63  it overrides loc
8350: 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61  ks set by the sa
8360: 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67  me process using
8370: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
8380: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
8390: 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20    Consider this 
83a0: 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a  test case:.**.**
83b0: 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d         int fd1 =
83c0: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c   open("./file1",
83d0: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
83e0: 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20   0644);.**      
83f0: 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28   int fd2 = open(
8400: 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57  "./file2", O_RDW
8410: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
8420: 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ;.**.** Suppose 
8430: 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69  ./file1 and ./fi
8440: 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74  le2 are really t
8450: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65  he same file (be
8460: 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20  cause.** one is 
8470: 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c  a hard or symbol
8480: 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f  ic link to the o
8490: 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f  ther) then if yo
84a0: 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c  u set.** an excl
84b0: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64  usive lock on fd
84c0: 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67  1, then try to g
84d0: 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
84e0: 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20  lock.** on fd2, 
84f0: 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75  it works.  I wou
8500: 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64  ld have expected
8510: 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b   the second lock
8520: 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63   to.** fail sinc
8530: 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65  e there was alre
8540: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ady a lock on th
8550: 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64  e file due to fd
8560: 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f  1..** But not so
8570: 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f  .  Since both lo
8580: 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68  cks came from th
8590: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20  e same process, 
85a0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76  the.** second ov
85b0: 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73  errides the firs
85c0: 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  t, even though t
85d0: 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66  hey were on diff
85e0: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
85f0: 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64  scriptors opened
8600: 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69   on different fi
8610: 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20  le names..**.** 
8620: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
8630: 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f  we cannot use PO
8640: 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e  SIX locks to syn
8650: 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63  chronize file ac
8660: 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f  cess.** among co
8670: 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20  mpeting threads 
8680: 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  of the same proc
8690: 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b  ess.  POSIX lock
86a0: 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  s will work fine
86b0: 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69  .** to synchroni
86c0: 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68  ze access for th
86d0: 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74  reads in separat
86e0: 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74  e processes, but
86f0: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20   not.** threads 
8700: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
8710: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
8720: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
8730: 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74  e problem, SQLit
8740: 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20  e has to manage 
8750: 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72  file locks inter
8760: 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20  nally.** on its 
8770: 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61  own.  Whenever a
8780: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
8790: 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65   opened, we have
87a0: 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20   to find the.** 
87b0: 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f  specific inode o
87c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
87d0: 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69  ile (the inode i
87e0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
87f0: 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e  the.** st_dev an
8800: 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20  d st_ino fields 
8810: 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75  of the stat stru
8820: 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74  cture that fstat
8830: 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20  () fills in).** 
8840: 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f  and check for lo
8850: 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  cks already exis
8860: 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f  ting on that ino
8870: 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20  de.  When locks 
8880: 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f  are.** created o
8890: 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61  r removed, we ha
88a0: 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75  ve to look at ou
88b0: 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72  r own internal r
88c0: 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20  ecord of the.** 
88d0: 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  locks to see if 
88e0: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
88f0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
8900: 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  t a lock on that
8910: 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a   same.** inode..
8920: 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68  **.** (Aside: Th
8930: 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e  e use of inode n
8940: 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75 65  umbers as unique
8950: 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f   IDs does not wo
8960: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
8970: 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77  * For VxWorks, w
8980: 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74 68  e have to use th
8990: 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e  e alternative un
89a0: 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20 62  ique ID system b
89b0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e  ased on.** canon
89c0: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e  ical filename an
89d0: 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  d implemented in
89e0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64 69   the previous di
89f0: 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54  vision.).**.** T
8a00: 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
8a10: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f  structure for PO
8a20: 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  SIX is no longer
8a30: 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72   just an integer
8a40: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
8a50: 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20  tor.  It is now 
8a60: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
8a70: 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67   holds the integ
8a80: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
8a90: 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e  iptor and a poin
8aa0: 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75  ter to a structu
8ab0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
8ac0: 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a  s the internal.*
8ad0: 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63  * locks on the c
8ae0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f  orresponding ino
8af0: 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e  de.  There is on
8b00: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
8b10: 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65  ure.** per inode
8b20: 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65  , so if the same
8b30: 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64   inode is opened
8b40: 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69   twice, both uni
8b50: 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73  xFile structures
8b60: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
8b70: 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74   same locking st
8b80: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f  ructure.  The lo
8b90: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
8ba0: 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72  keeps.** a refer
8bb0: 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77  ence count (so w
8bc0: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e  e will know when
8bd0: 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61   to delete it) a
8be0: 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69  nd a "cnt".** fi
8bf0: 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75  eld that tells u
8c00: 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c  s its internal l
8c10: 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74  ock status.  cnt
8c20: 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a  ==0 means the.**
8c30: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
8c40: 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e  d.  cnt==-1 mean
8c50: 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61  s the file has a
8c60: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
8c70: 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73  ..** cnt>0 means
8c80: 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73   there are cnt s
8c90: 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74  hared locks on t
8ca0: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  he file..**.** A
8cb0: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ny attempt to lo
8cc0: 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66  ck or unlock a f
8cd0: 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73  ile first checks
8ce0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   the locking.** 
8cf0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
8d00: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
8d10: 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f  all is only invo
8d20: 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a  ked to set a .**
8d30: 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74   POSIX lock if t
8d40: 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  he internal lock
8d50: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
8d60: 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a  itions between.*
8d70: 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61  * a locked and a
8d80: 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65  n unlocked state
8d90: 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74  ..**.** But wait
8da0: 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65 74  :  there are yet
8db0: 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77   more problems w
8dc0: 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f  ith POSIX adviso
8dd0: 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ry locks..**.** 
8de0: 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66  If you close a f
8df0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
8e00: 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  hat points to a 
8e10: 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f  file that has lo
8e20: 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b  cks,.** all lock
8e30: 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  s on that file t
8e40: 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79  hat are owned by
8e50: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
8e60: 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65  cess are.** rele
8e70: 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61  ased.  To work a
8e80: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
8e90: 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f  em, each unixIno
8ea0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a  deInfo object.**
8eb0: 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75   maintains a cou
8ec0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
8ed0: 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   of pending lock
8ee0: 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a  s on tha inode..
8ef0: 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d  ** When an attem
8f00: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
8f10: 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c  ose an unixFile,
8f20: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
8f30: 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20   other unixFile 
8f40: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
8f50: 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20   inode that are 
8f60: 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74  holding locks, t
8f70: 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c  he call.** to cl
8f80: 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64  ose() the file d
8f90: 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66  escriptor is def
8fa0: 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20  erred until all 
8fb0: 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65  of the locks cle
8fc0: 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49  ar..** The unixI
8fd0: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
8fe0: 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20  re keeps a list 
8ff0: 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  of file descript
9000: 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
9010: 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  .** be closed an
9020: 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77  d that list is w
9030: 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72  alked (and clear
9040: 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ed) when the las
9050: 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73  t lock.** clears
9060: 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74  ..**.** Yet anot
9070: 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69  her problem:  Li
9080: 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f  nuxThreads do no
9090: 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68  t play well with
90a0: 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a   posix locks..**
90b0: 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76  .** Many older v
90c0: 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78  ersions of linux
90d0: 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68   use the LinuxTh
90e0: 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77 68  reads library wh
90f0: 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f  ich is.** not po
9100: 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20  six compliant.  
9110: 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61  Under LinuxThrea
9120: 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  ds, a lock creat
9130: 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20  ed by thread.** 
9140: 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69  A cannot be modi
9150: 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64  fied or overridd
9160: 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65 6e  en by a differen
9170: 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  t thread B..** O
9180: 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e  nly thread A can
9190: 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b   modify the lock
91a0: 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76  .  Locking behav
91b0: 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a  ior is correct.*
91c0: 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74  * if the appliat
91d0: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77  ion uses the new
91e0: 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20  er Native Posix 
91f0: 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28  Thread Library (
9200: 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75  NPTL).** on linu
9210: 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20  x - with NPTL a 
9220: 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20  lock created by 
9230: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65  thread A can ove
9240: 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69  rride locks.** i
9250: 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75 74  n thread B.  But
9260: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
9270: 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70   to know at comp
9280: 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a  ile-time which.*
9290: 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72  * threading libr
92a0: 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65  ary is being use
92b0: 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20  d.  So there is 
92c0: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
92d0: 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t.** compile-tim
92e0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
92f0: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
9300: 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20  erride locks on 
9310: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65  thread B..** One
9320: 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e   has to do a run
9330: 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64  -time check to d
9340: 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68 61  iscover the beha
9350: 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63  vior of the.** c
9360: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a  urrent process..
9370: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  **.** SQLite use
9380: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e  d to support Lin
9390: 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74 20  uxThreads.  But 
93a0: 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75  support for Linu
93b0: 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20  xThreads.** was 
93c0: 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e  dropped beginnin
93d0: 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33  g with version 3
93e0: 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69  .7.0.  SQLite wi
93f0: 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69  ll still work wi
9400: 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61  th.** LinuxThrea
9410: 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61 74  ds provided that
9420: 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f   (1) there is no
9430: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
9440: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65  onnection .** pe
9450: 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
9460: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
9470: 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74 61  ess and (2) data
9480: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
9490: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20  .** do not move 
94a0: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a  across threads..
94b0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  */../*.** An ins
94c0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
94d0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
94e0: 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b   serves as the k
94f0: 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f  ey used.** to lo
9500: 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61  cate a particula
9510: 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  r unixInodeInfo 
9520: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63  object..*/.struc
9530: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20  t unixFileId {. 
9540: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20   dev_t dev;     
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9560: 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f  Device number */
9570: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
9580: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
9590: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a  FileId *pId;  /*
95a0: 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   Unique file ID 
95b0: 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a  for vxworks. */.
95c0: 23 65 6c 73 65 0a 20 20 2f 2a 20 57 65 20 61 72  #else.  /* We ar
95d0: 65 20 74 6f 6c 64 20 74 68 61 74 20 73 6f 6d 65  e told that some
95e0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 41 6e 64   versions of And
95f0: 72 6f 69 64 20 63 6f 6e 74 61 69 6e 20 61 20 62  roid contain a b
9600: 75 67 20 74 68 61 74 0a 20 20 2a 2a 20 73 69 7a  ug that.  ** siz
9610: 65 73 20 69 6e 6f 5f 74 20 61 74 20 6f 6e 6c 79  es ino_t at only
9620: 20 33 32 2d 62 69 74 73 20 69 6e 73 74 65 61 64   32-bits instead
9630: 20 6f 66 20 36 34 2d 62 69 74 73 2e 20 28 53 65   of 64-bits. (Se
9640: 65 0a 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 61  e.  ** https://a
9650: 6e 64 72 6f 69 64 2d 72 65 76 69 65 77 2e 67 6f  ndroid-review.go
9660: 6f 67 6c 65 73 6f 75 72 63 65 2e 63 6f 6d 2f 23  oglesource.com/#
9670: 2f 63 2f 31 31 35 33 35 31 2f 33 2f 64 69 73 74  /c/115351/3/dist
9680: 2f 73 71 6c 69 74 65 33 2e 63 29 0a 20 20 2a 2a  /sqlite3.c).  **
9690: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
96a0: 74 68 69 73 2c 20 61 6c 77 61 79 73 20 61 6c 6c  this, always all
96b0: 6f 63 61 74 65 20 36 34 2d 62 69 74 73 20 66 6f  ocate 64-bits fo
96c0: 72 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  r the inode numb
96d0: 65 72 2e 20 20 0a 20 20 2a 2a 20 4f 6e 20 73 6d  er.  .  ** On sm
96e0: 61 6c 6c 20 6d 61 63 68 69 6e 65 73 20 74 68 61  all machines tha
96f0: 74 20 6f 6e 6c 79 20 68 61 76 65 20 33 32 2d 62  t only have 32-b
9700: 69 74 20 69 6e 6f 64 65 73 2c 20 74 68 69 73 20  it inodes, this 
9710: 77 61 73 74 65 73 20 34 20 62 79 74 65 73 2c 0a  wastes 4 bytes,.
9720: 20 20 2a 2a 20 62 75 74 20 74 68 61 74 20 73 68    ** but that sh
9730: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 62 69  ould not be a bi
9740: 67 20 64 65 61 6c 2e 20 2a 2f 0a 20 20 2f 2a 20  g deal. */.  /* 
9750: 57 41 53 3a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b  WAS:  ino_t ino;
9760: 20 20 20 2a 2f 0a 20 20 75 36 34 20 69 6e 6f 3b     */.  u64 ino;
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62     /* Inode numb
9790: 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  er */.#endif.};.
97a0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
97b0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
97c0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
97d0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
97e0: 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64  ach open.** inod
97f0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c  e..**.** A singl
9800: 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65  e inode can have
9810: 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64   multiple file d
9820: 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65  escriptors, so e
9830: 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  ach unixFile.** 
9840: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
9850: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
9860: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
9870: 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  his object and t
9880: 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65  his.** object ke
9890: 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  eps a count of t
98a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69  he number of uni
98b0: 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74  xFile pointing t
98c0: 6f 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4d 75 74 65  o it..**.** Mute
98d0: 78 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  x rules:.**.**  
98e0: 28 31 29 20 4f 6e 6c 79 20 74 68 65 20 70 4c 6f  (1) Only the pLo
98f0: 63 6b 4d 75 74 65 78 20 6d 75 74 65 78 20 6d 75  ckMutex mutex mu
9900: 73 74 20 62 65 20 68 65 6c 64 20 69 6e 20 6f 72  st be held in or
9910: 64 65 72 20 74 6f 20 72 65 61 64 20 6f 72 20 77  der to read or w
9920: 72 69 74 65 0a 2a 2a 20 20 20 20 20 20 61 6e 79  rite.**      any
9930: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
9940: 66 69 65 6c 64 73 3a 0a 2a 2a 20 20 20 20 20 20  fields:.**      
9950: 20 20 20 20 6e 53 68 61 72 65 64 2c 20 6e 4c 6f      nShared, nLo
9960: 63 6b 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 62  ck, eFileLock, b
9970: 50 72 6f 63 65 73 73 4c 6f 63 6b 2c 20 70 55 6e  ProcessLock, pUn
9980: 75 73 65 64 0a 2a 2a 0a 2a 2a 20 20 28 32 29 20  used.**.**  (2) 
9990: 57 68 65 6e 20 6e 52 65 66 3e 30 2c 20 74 68 65  When nRef>0, the
99a0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
99b0: 66 69 65 6c 64 73 20 61 72 65 20 75 6e 63 68 61  fields are uncha
99c0: 6e 67 69 6e 67 20 61 6e 64 20 63 61 6e 0a 2a 2a  nging and can.**
99d0: 20 20 20 20 20 20 62 65 20 72 65 61 64 20 28 62        be read (b
99e0: 75 74 20 6e 6f 74 20 77 72 69 74 74 65 6e 29 20  ut not written) 
99f0: 77 69 74 68 6f 75 74 20 68 6f 6c 64 69 6e 67 20  without holding 
9a00: 61 6e 79 20 6d 75 74 65 78 3a 0a 2a 2a 20 20 20  any mutex:.**   
9a10: 20 20 20 20 20 20 20 66 69 6c 65 49 64 2c 20 70         fileId, p
9a20: 4c 6f 63 6b 4d 75 74 65 78 0a 2a 2a 0a 2a 2a 20  LockMutex.**.** 
9a30: 20 28 33 29 20 57 69 74 68 20 74 68 65 20 65 78   (3) With the ex
9a40: 63 65 70 74 69 6f 6e 73 20 61 62 6f 76 65 2c 20  ceptions above, 
9a50: 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 6d  all the fields m
9a60: 61 79 20 6f 6e 6c 79 20 62 65 20 72 65 61 64 0a  ay only be read.
9a70: 2a 2a 20 20 20 20 20 20 6f 72 20 77 72 69 74 74  **      or writt
9a80: 65 6e 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  en while holding
9a90: 20 74 68 65 20 67 6c 6f 62 61 6c 20 75 6e 69 78   the global unix
9aa0: 42 69 67 4c 6f 63 6b 20 6d 75 74 65 78 2e 0a 2a  BigLock mutex..*
9ab0: 2a 0a 2a 2a 20 44 65 61 64 6c 6f 63 6b 20 70 72  *.** Deadlock pr
9ac0: 65 76 65 6e 74 69 6f 6e 3a 20 20 54 68 65 20 67  evention:  The g
9ad0: 6c 6f 62 61 6c 20 75 6e 69 78 42 69 67 4c 6f 63  lobal unixBigLoc
9ae0: 6b 20 6d 75 74 65 78 20 6d 61 79 20 6e 6f 74 0a  k mutex may not.
9af0: 2a 2a 20 62 65 20 61 63 71 75 69 72 65 64 20 77  ** be acquired w
9b00: 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
9b10: 20 70 4c 6f 63 6b 4d 75 74 65 78 20 6d 75 74 65   pLockMutex mute
9b20: 78 2e 20 20 49 66 20 62 6f 74 68 20 75 6e 69 78  x.  If both unix
9b30: 42 69 67 4c 6f 63 6b 0a 2a 2a 20 61 6e 64 20 70  BigLock.** and p
9b40: 4c 6f 63 6b 4d 75 74 65 78 20 61 72 65 20 6e 65  LockMutex are ne
9b50: 65 64 65 64 2c 20 74 68 65 6e 20 75 6e 69 78 42  eded, then unixB
9b60: 69 67 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 61  igLock must be a
9b70: 63 71 75 69 72 65 64 20 66 69 72 73 74 2e 0a 2a  cquired first..*
9b80: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f  /.struct unixIno
9b90: 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63  deInfo {.  struc
9ba0: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
9bb0: 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  eId;       /* Th
9bc0: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
9bd0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
9be0: 2a 70 4c 6f 63 6b 4d 75 74 65 78 3b 20 20 20 20  *pLockMutex;    
9bf0: 20 20 2f 2a 20 48 6f 6c 64 20 74 68 69 73 20 6d    /* Hold this m
9c00: 75 74 65 78 20 66 6f 72 2e 2e 2e 20 2a 2f 0a 20  utex for... */. 
9c10: 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20   int nShared;   
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9c40: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c  SHARED locks hel
9c50: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  d */.  int nLock
9c60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9c80: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
9c90: 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a  g file locks */.
9ca0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9cb0: 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20  eFileLock;      
9cc0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48      /* One of SH
9cd0: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
9ce0: 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f  VED_LOCK etc. */
9cf0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9d00: 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20   bProcessLock;  
9d10: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75       /* An exclu
9d20: 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63  sive process loc
9d30: 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 55  k is held */.  U
9d40: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
9d50: 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  used;           
9d60: 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20   /* Unused file 
9d70: 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63  descriptors to c
9d80: 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  lose */.  int nR
9d90: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
9da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9db0: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
9dc0: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
9dd0: 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  e */.  unixShmNo
9de0: 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
9df0: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
9e00: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
9e10: 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f  ed with this ino
9e20: 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  de */.  unixInod
9e30: 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20  eInfo *pNext;   
9e40: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
9e50: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
9e60: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Info objects */.
9e70: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
9e80: 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  *pPrev;         
9e90: 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75    /*    .... dou
9ea0: 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69  bly linked */.#i
9eb0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9ec0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
9ed0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
9ee0: 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20  ng sharedByte;  
9ef0: 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c  /* for AFP simul
9f00: 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b  ated shared lock
9f10: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
9f20: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f  S_VXWORKS.  sem_
9f30: 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20  t *pSem;        
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9f50: 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70  amed POSIX semap
9f60: 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61  hore */.  char a
9f70: 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  SemName[MAX_PATH
9f80: 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d  NAME+2];  /* Nam
9f90: 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68  e of that semaph
9fa0: 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ore */.#endif.#i
9fb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 41 52  fdef SQLITE_SHAR
9fc0: 45 44 5f 4d 41 50 50 49 4e 47 0a 20 20 73 71 6c  ED_MAPPING.  sql
9fd0: 69 74 65 33 5f 69 6e 74 36 34 20 6e 53 68 61 72  ite3_int64 nShar
9fe0: 65 64 4d 61 70 70 69 6e 67 3b 20 20 20 2f 2a 20  edMapping;   /* 
9ff0: 53 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72  Size of mapped r
a000: 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a  egion in bytes *
a010: 2f 0a 20 20 76 6f 69 64 20 2a 70 53 68 61 72 65  /.  void *pShare
a020: 64 4d 61 70 70 69 6e 67 3b 20 20 20 20 20 20 20  dMapping;       
a030: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
a040: 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23  pped region */.#
a050: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
a060: 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75  A lists of all u
a070: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
a080: 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 4d 75 73 74  ects..**.** Must
a090: 20 68 6f 6c 64 20 75 6e 69 78 42 69 67 4c 6f 63   hold unixBigLoc
a0a0: 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  k in order to re
a0b0: 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 69 73  ad or write this
a0c0: 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74   variable..*/.st
a0d0: 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e  atic unixInodeIn
a0e0: 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20  fo *inodeList = 
a0f0: 30 3b 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 49  0;  /* All unixI
a100: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
a110: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a120: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
a130: 72 75 65 20 69 66 20 74 68 65 20 69 6e 6f 64 65  rue if the inode
a140: 20 6d 75 74 65 78 20 28 6f 6e 20 74 68 65 20 75   mutex (on the u
a150: 6e 69 78 46 69 6c 65 2e 70 46 69 6c 65 4d 75 74  nixFile.pFileMut
a160: 65 78 20 66 69 65 6c 64 29 20 69 73 20 68 65 6c  ex field) is hel
a170: 64 2c 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 20 54 68  d, or not..** Th
a180: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
a190: 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
a1a0: 73 73 65 72 74 28 29 20 74 6f 20 68 65 6c 70 20  ssert() to help 
a1b0: 76 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 6d  verify correct m
a1c0: 75 74 65 78 0a 2a 2a 20 75 73 61 67 65 2e 0a 2a  utex.** usage..*
a1d0: 2f 0a 69 6e 74 20 75 6e 69 78 46 69 6c 65 4d 75  /.int unixFileMu
a1e0: 74 65 78 48 65 6c 64 28 75 6e 69 78 46 69 6c 65  texHeld(unixFile
a1f0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73 65   *pFile){.  asse
a200: 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  rt( pFile->pInod
a210: 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  e );.  return sq
a220: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a230: 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  (pFile->pInode->
a240: 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 7d 0a 69  pLockMutex);.}.i
a250: 6e 74 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78  nt unixFileMutex
a260: 4e 6f 74 68 65 6c 64 28 75 6e 69 78 46 69 6c 65  Notheld(unixFile
a270: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73 65   *pFile){.  asse
a280: 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  rt( pFile->pInod
a290: 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  e );.  return sq
a2a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
a2b0: 65 6c 64 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  eld(pFile->pInod
a2c0: 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a  e->pLockMutex);.
a2d0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 0a  }.#endif../*.**.
a2e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
a2f0: 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41   - unixLogErrorA
a300: 74 4c 69 6e 65 28 29 2c 20 69 73 20 6f 6e 6c 79  tLine(), is only
a310: 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61   ever called via
a320: 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e   the macro.** un
a330: 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a  ixLogError()..**
a340: 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65  .** It is invoke
a350: 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72  d after an error
a360: 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53   occurs in an OS
a370: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72   function and er
a380: 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  rno has been.** 
a390: 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d  set. It logs a m
a3a0: 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c  essage using sql
a3b0: 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61  ite3_log() conta
a3c0: 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ining the curren
a3d0: 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72  t value of.** er
a3e0: 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73  rno and, if poss
a3f0: 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d  ible, the human-
a400: 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c  readable equival
a410: 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f  ent from strerro
a420: 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72  r() or.** strerr
a430: 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  or_r()..**.** Th
a440: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
a450: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
a460: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
a470: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
a480: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
a490: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
a4a0: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
a4b0: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
a4c0: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a  TE_CANTOPEN). .*
a4d0: 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71  * The two subseq
a4e0: 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73  uent arguments s
a4f0: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d  hould be the nam
a500: 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63  e of the OS func
a510: 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69  tion that.** fai
a520: 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e  led (e.g. "unlin
a530: 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20  k", "open") and 
a540: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
a550: 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c  ile-system path,
a560: 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23  .** if any..*/.#
a570: 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72  define unixLogEr
a580: 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75  ror(a,b,c)     u
a590: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
a5a0: 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f  e(a,b,c,__LINE__
a5b0: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  ).static int uni
a5c0: 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  xLogErrorAtLine(
a5d0: 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20  .  int errcode, 
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5f0: 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72     /* SQLite err
a600: 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e  or code */.  con
a610: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20  st char *zFunc, 
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a630: 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74  Name of OS funct
a640: 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20  ion that failed 
a650: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
a660: 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
a670: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74       /* File pat
a680: 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  h associated wit
a690: 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74  h error */.  int
a6a0: 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20   iLine          
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a6c0: 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62  Source line numb
a6d0: 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f  er where error o
a6e0: 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20  ccurred */.){.  
a6f0: 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20  char *zErr;     
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a710: 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20  /* Message from 
a720: 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71  strerror() or eq
a730: 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e  uivalent */.  in
a740: 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t iErrno = errno
a750: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a760: 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65   Saved syscall e
a770: 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a  rror number */..
a780: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
a790: 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61 66 65  not a threadsafe
a7a0: 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54   build (SQLITE_T
a7b0: 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74  HREADSAFE==0), t
a7c0: 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65  hen use.  ** the
a7d0: 20 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63   strerror() func
a7e0: 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74  tion to obtain t
a7f0: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
a800: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  e error message.
a810: 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20    ** equivalent 
a820: 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77  to errno. Otherw
a830: 69 73 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f  ise, use strerro
a840: 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66  r_r()..  */ .#if
a850: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
a860: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 48 41  FE && defined(HA
a870: 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20  VE_STRERROR_R). 
a880: 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a   char aErr[80];.
a890: 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30    memset(aErr, 0
a8a0: 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b  , sizeof(aErr));
a8b0: 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a  .  zErr = aErr;.
a8c0: 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f  .  /* If STRERRO
a8d0: 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20  R_R_CHAR_P (set 
a8e0: 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69  by autoconf scri
a8f0: 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e  pts) or __USE_GN
a900: 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20  U is defined,.  
a910: 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  ** assume that t
a920: 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64  he system provid
a930: 65 73 20 74 68 65 20 47 4e 55 20 76 65 72 73 69  es the GNU versi
a940: 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f 72  on of strerror_r
a950: 28 29 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 74  () that.  ** ret
a960: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
a970: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
a980: 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20  ining the error 
a990: 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f  message. That po
a9a0: 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20  inter .  ** may 
a9b0: 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c  point to aErr[],
a9c0: 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74   or it may point
a9d0: 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20   to some static 
a9e0: 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72  storage somewher
a9f0: 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  e. .  ** Otherwi
aa00: 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
aa10: 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69  the system provi
aa20: 64 65 73 20 74 68 65 20 50 4f 53 49 58 20 76 65  des the POSIX ve
aa30: 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73  rsion of .  ** s
aa40: 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69  trerror_r(), whi
aa50: 63 68 20 61 6c 77 61 79 73 20 77 72 69 74 65 73  ch always writes
aa60: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
aa70: 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20  e into aErr[].. 
aa80: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
aa90: 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  code incorrectly
aaa0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
aab0: 20 69 73 20 74 68 65 20 50 4f 53 49 58 20 76 65   is the POSIX ve
aac0: 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20  rsion that is.  
aad0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ** available, th
aae0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
aaf0: 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e  will often be an
ab00: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e   empty string. N
ab10: 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70  ot a.  ** huge p
ab20: 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63  roblem. Incorrec
ab30: 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74  tly concluding t
ab40: 68 61 74 20 74 68 65 20 47 4e 55 20 76 65 72 73  hat the GNU vers
ab50: 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
ab60: 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61   .  ** could lea
ab70: 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20  d to a segfault 
ab80: 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66  though..  */.#if
ab90: 20 64 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f   defined(STRERRO
aba0: 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64  R_R_CHAR_P) || d
abb0: 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55  efined(__USE_GNU
abc0: 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e  ).  zErr = .# en
abd0: 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72  dif.  strerror_r
abe0: 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73  (iErrno, aErr, s
abf0: 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a  izeof(aErr)-1);.
ac00: 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48  .#elif SQLITE_TH
ac10: 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68  READSAFE.  /* Th
ac20: 69 73 20 69 73 20 61 20 74 68 72 65 61 64 73 61  is is a threadsa
ac30: 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74  fe build, but st
ac40: 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f  rerror_r() is no
ac50: 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a  t available. */.
ac60: 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c    zErr = "";.#el
ac70: 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65  se.  /* Non-thre
ac80: 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73  adsafe build, us
ac90: 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f  e strerror(). */
aca0: 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72  .  zErr = strerr
acb0: 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64  or(iErrno);.#end
acc0: 69 66 0a 0a 20 20 69 66 28 20 7a 50 61 74 68 3d  if..  if( zPath=
acd0: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
ace0: 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65  .  sqlite3_log(e
acf0: 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f  rrcode,.      "o
ad00: 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64  s_unix.c:%d: (%d
ad10: 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a  ) %s(%s) - %s",.
ad20: 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72        iLine, iEr
ad30: 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74  rno, zFunc, zPat
ad40: 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20  h, zErr.  );..  
ad50: 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a  return errcode;.
ad60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ad70: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
ad80: 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d  ..**.** We assum
ad90: 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61  e that close() a
ada0: 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72  lmost always wor
adb0: 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20  ks, since it is 
adc0: 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72  only in a.** ver
add0: 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69  y sick applicati
ade0: 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20  on or on a very 
adf0: 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68  sick platform th
ae00: 61 74 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c  at it might fail
ae10: 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20  ..** If it does 
ae20: 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61  fail, simply lea
ae30: 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  k the file descr
ae40: 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f  iptor, but do lo
ae50: 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a  g the.** error..
ae60: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
ae70: 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  it is not safe t
ae80: 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20  o retry close() 
ae90: 61 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63  after EINTR sinc
aea0: 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65  e the.** file de
aeb0: 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68  scriptor might h
aec0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
aed0: 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68   reused by anoth
aee0: 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f  er thread..** So
aef0: 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74   we don't even t
af00: 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72  ry to recover fr
af10: 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75  om an EINTR.  Ju
af20: 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72  st log the error
af30: 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e  .** and move on.
af40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
af50: 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69  robust_close(uni
af60: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  xFile *pFile, in
af70: 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29  t h, int lineno)
af80: 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28  {.  if( osClose(
af90: 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f  h) ){.    unixLo
afa0: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c  gErrorAtLine(SQL
afb0: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c  ITE_IOERR_CLOSE,
afc0: 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20   "close",.      
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afe0: 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e   pFile ? pFile->
aff0: 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e  zPath : 0, linen
b000: 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
b010: 20 53 65 74 20 74 68 65 20 70 46 69 6c 65 2d 3e   Set the pFile->
b020: 6c 61 73 74 45 72 72 6e 6f 2e 20 20 44 6f 20 74  lastErrno.  Do t
b030: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
b040: 69 6e 65 20 61 73 20 74 68 61 74 20 70 72 6f 76  ine as that prov
b050: 69 64 65 73 0a 2a 2a 20 61 20 63 6f 6e 76 65 6e  ides.** a conven
b060: 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65  ient place to se
b070: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a  t a breakpoint..
b080: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
b090: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 75 6e  toreLastErrno(un
b0a0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
b0b0: 6e 74 20 65 72 72 6f 72 29 7b 0a 20 20 70 46 69  nt error){.  pFi
b0c0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
b0d0: 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  error;.}../*.** 
b0e0: 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64  Close all file d
b0f0: 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d  escriptors accum
b100: 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69  uated in the uni
b110: 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75  xInodeInfo->pUnu
b120: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74  sed list..*/ .st
b130: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50  atic void closeP
b140: 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69  endingFds(unixFi
b150: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
b160: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
b170: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
b180: 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  ode;.  UnixUnuse
b190: 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e  dFd *p;.  UnixUn
b1a0: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20  usedFd *pNext;. 
b1b0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c   assert( unixFil
b1c0: 65 4d 75 74 65 78 48 65 6c 64 28 70 46 69 6c 65  eMutexHeld(pFile
b1d0: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e  ) );.  for(p=pIn
b1e0: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b  ode->pUnused; p;
b1f0: 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
b200: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
b210: 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
b220: 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20  e(pFile, p->fd, 
b230: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73  __LINE__);.    s
b240: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
b250: 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55    }.  pInode->pU
b260: 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nused = 0;.}../*
b270: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e  .** Release a un
b280: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
b290: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
b2a0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
b2b0: 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a  ndInodeInfo()..*
b2c0: 2a 0a 2a 2a 20 54 68 65 20 67 6c 6f 62 61 6c 20  *.** The global 
b2d0: 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
b2e0: 6c 64 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ld when this rou
b2f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
b300: 62 75 74 20 74 68 65 20 6d 75 74 65 78 0a 2a 2a  but the mutex.**
b310: 20 6f 6e 20 74 68 65 20 69 6e 6f 64 65 20 62 65   on the inode be
b320: 69 6e 67 20 64 65 6c 65 74 65 64 20 6d 75 73 74  ing deleted must
b330: 20 4e 4f 54 20 62 65 20 68 65 6c 64 2e 0a 2a 2f   NOT be held..*/
b340: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
b350: 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e  easeInodeInfo(un
b360: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
b370: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
b380: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
b390: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
b3a0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
b3b0: 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  () );.  assert( 
b3c0: 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74  unixFileMutexNot
b3d0: 68 65 6c 64 28 70 46 69 6c 65 29 20 29 3b 0a 20  held(pFile) );. 
b3e0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 6f   if( ALWAYS(pIno
b3f0: 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  de) ){.    pInod
b400: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  e->nRef--;.    i
b410: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d  f( pInode->nRef=
b420: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
b430: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  rt( pInode->pShm
b440: 4e 6f 64 65 3d 3d 30 20 29 3b 0a 23 69 66 64 65  Node==0 );.#ifde
b450: 66 20 53 51 4c 49 54 45 5f 53 48 41 52 45 44 5f  f SQLITE_SHARED_
b460: 4d 41 50 50 49 4e 47 0a 20 20 20 20 20 20 69 66  MAPPING.      if
b470: 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 61 72 65  ( pInode->pShare
b480: 64 4d 61 70 70 69 6e 67 20 29 7b 0a 20 20 20 20  dMapping ){.    
b490: 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 49 6e      osMunmap(pIn
b4a0: 6f 64 65 2d 3e 70 53 68 61 72 65 64 4d 61 70 70  ode->pSharedMapp
b4b0: 69 6e 67 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ing, pInode->nSh
b4c0: 61 72 65 64 4d 61 70 70 69 6e 67 29 3b 0a 20 20  aredMapping);.  
b4d0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 53        pInode->pS
b4e0: 68 61 72 65 64 4d 61 70 70 69 6e 67 20 3d 20 30  haredMapping = 0
b4f0: 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ;.        pInode
b500: 2d 3e 6e 53 68 61 72 65 64 4d 61 70 70 69 6e 67  ->nSharedMapping
b510: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 0;.      }.#e
b520: 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74  ndif.      sqlit
b530: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
b540: 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
b550: 78 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50  x);.      closeP
b560: 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
b570: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
b580: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f  mutex_leave(pIno
b590: 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b  de->pLockMutex);
b5a0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
b5b0: 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  e->pPrev ){.    
b5c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
b5d0: 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  de->pPrev->pNext
b5e0: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
b5f0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65      pInode->pPre
b600: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64  v->pNext = pInod
b610: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
b620: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
b630: 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74  ssert( inodeList
b640: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
b650: 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20      inodeList = 
b660: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
b670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b680: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29   pInode->pNext )
b690: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
b6a0: 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d  ( pInode->pNext-
b6b0: 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29  >pPrev==pInode )
b6c0: 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ;.        pInode
b6d0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
b6e0: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a   pInode->pPrev;.
b6f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
b700: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
b710: 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
b720: 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tex);.      sqli
b730: 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29  te3_free(pInode)
b740: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
b750: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c  *.** Given a fil
b760: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f  e descriptor, lo
b770: 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f  cate the unixIno
b780: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  deInfo object th
b790: 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20  at.** describes 
b7a0: 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69  that file descri
b7b0: 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20  ptor.  Create a 
b7c0: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
b7d0: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65  sary.  The.** re
b7e0: 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74  turn value might
b7f0: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
b800: 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  d if an error oc
b810: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  curs..**.** The 
b820: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 6d 75 73  global mutex mus
b830: 74 20 68 65 6c 64 20 77 68 65 6e 20 63 61 6c 6c  t held when call
b840: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
b850: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
b860: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
b870: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
b880: 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64  tic int findInod
b890: 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c  eInfo(.  unixFil
b8a0: 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
b8b0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20          /* Unix 
b8c0: 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64  file with file d
b8d0: 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20  esc used in the 
b8e0: 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  key */.  unixIno
b8f0: 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65  deInfo **ppInode
b900: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
b910: 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  n the unixInodeI
b920: 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20  nfo object here 
b930: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d         /* System
b960: 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64   call return cod
b970: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  e */.  int fd;  
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b990: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
b9a0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
b9b0: 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75   pFile */.  stru
b9c0: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
b9d0: 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  leId;      /* Lo
b9e0: 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65  okup key for the
b9f0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
ba00: 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  /.  struct stat 
ba10: 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20  statbuf;        
ba20: 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20     /* Low-level 
ba30: 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
ba40: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
ba50: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b  nfo *pInode = 0;
ba60: 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74       /* Candidat
ba70: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
ba80: 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73  object */..  ass
ba90: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
baa0: 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65  ld() );..  /* Ge
bab0: 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f  t low-level info
bac0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
bad0: 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63  e file that we c
bae0: 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  an used to.  ** 
baf0: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20  create a unique 
bb00: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c  name for the fil
bb10: 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70  e..  */.  fd = p
bb20: 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20  File->h;.  rc = 
bb30: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
bb40: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
bb50: 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c  =0 ){.    storeL
bb60: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
bb70: 65 72 72 6e 6f 29 3b 0a 23 69 66 20 64 65 66 69  errno);.#if defi
bb80: 6e 65 64 28 45 4f 56 45 52 46 4c 4f 57 29 20 26  ned(EOVERFLOW) &
bb90: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
bba0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 29 0a 20 20  _DISABLE_LFS).  
bbb0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73    if( pFile->las
bbc0: 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f  tErrno==EOVERFLO
bbd0: 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  W ) return SQLIT
bbe0: 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a  E_NOLFS;.#endif.
bbf0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bc00: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69  E_IOERR;.  }..#i
bc10: 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20  fdef __APPLE__. 
bc20: 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61   /* On OS X on a
bc30: 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  n msdos filesyst
bc40: 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  em, the inode nu
bc50: 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64  mber is reported
bc60: 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  .  ** incorrectl
bc70: 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20  y for zero-size 
bc80: 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b  files.  See tick
bc90: 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f  et #3260.  To wo
bca0: 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74  rk.  ** around t
bcb0: 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20  his problem (we 
bcc0: 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75  consider it a bu
bcd0: 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53  g in OS X, not S
bce0: 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61  QLite).  ** we a
bcf0: 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74  lways increase t
bd00: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20  he file size to 
bd10: 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73  1 by writing a s
bd20: 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20  ingle byte.  ** 
bd30: 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69  prior to accessi
bd40: 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  ng the inode num
bd50: 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79  ber.  The one by
bd60: 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20  te written is.  
bd70: 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20  ** an ASCII 'S' 
bd80: 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20  character which 
bd90: 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20  also happens to 
bda0: 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  be the first byt
bdb0: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65  e.  ** in the he
bdc0: 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51  ader of every SQ
bdd0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
bde0: 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20  In this way, if 
bdf0: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20  there.  ** is a 
be00: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73  race condition s
be10: 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72  uch that another
be20: 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65   thread has alre
be30: 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20  ady populated.  
be40: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ** the first pag
be50: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
be60: 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20  e, no damage is 
be70: 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  done..  */.  if(
be80: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
be90: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66  ==0 && (pFile->f
bea0: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
beb0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
bec0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20  )!=0 ){.    do{ 
bed0: 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c  rc = osWrite(fd,
bee0: 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65   "S", 1); }while
bef0: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
bf00: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66  =EINTR );.    if
bf10: 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc!=1 ){.     
bf20: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
bf30: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
bf40: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bf50: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
bf60: 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74      rc = osFstat
bf70: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
bf80: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
bf90: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
bfa0: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
bfb0: 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  no);.      retur
bfc0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
bfd0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
bfe0: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65  ..  memset(&file
bff0: 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69  Id, 0, sizeof(fi
c000: 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64  leId));.  fileId
c010: 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73  .dev = statbuf.s
c020: 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58  t_dev;.#if OS_VX
c030: 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70  WORKS.  fileId.p
c040: 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b  Id = pFile->pId;
c050: 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e  .#else.  fileId.
c060: 69 6e 6f 20 3d 20 28 75 36 34 29 73 74 61 74 62  ino = (u64)statb
c070: 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69  uf.st_ino;.#endi
c080: 66 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  f.  assert( unix
c090: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
c0a0: 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
c0b0: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  ist;.  while( pI
c0c0: 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26  node && memcmp(&
c0d0: 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d  fileId, &pInode-
c0e0: 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  >fileId, sizeof(
c0f0: 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20  fileId)) ){.    
c100: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
c110: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
c120: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
c130: 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69     pInode = sqli
c140: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
c150: 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b  zeof(*pInode) );
c160: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d  .    if( pInode=
c170: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
c180: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
c190: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
c1a0: 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30  memset(pInode, 0
c1b0: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  , sizeof(*pInode
c1c0: 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ));.    memcpy(&
c1d0: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
c1e0: 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  &fileId, sizeof(
c1f0: 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 69 66  fileId));.    if
c200: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
c210: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
c220: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   ){.      pInode
c230: 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 73  ->pLockMutex = s
c240: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
c250: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
c260: 46 41 53 54 29 3b 0a 20 20 20 20 20 20 69 66 28  FAST);.      if(
c270: 20 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75   pInode->pLockMu
c280: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
c290: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
c2a0: 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  Inode);.        
c2b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c2c0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
c2d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 6f  }.    }.    pIno
c2e0: 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  de->nRef = 1;.  
c2f0: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
c300: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 20  texHeld() );.   
c310: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d   pInode->pNext =
c320: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
c330: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20  pInode->pPrev = 
c340: 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65  0;.    if( inode
c350: 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74  List ) inodeList
c360: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
c370: 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20  ;.    inodeList 
c380: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73  = pInode;.  }els
c390: 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e{.    pInode->n
c3a0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Ref++;.  }.  *pp
c3b0: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a  Inode = pInode;.
c3c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c3d0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
c3e0: 75 72 6e 20 54 52 55 45 20 69 66 20 70 46 69 6c  urn TRUE if pFil
c3f0: 65 20 68 61 73 20 62 65 65 6e 20 72 65 6e 61 6d  e has been renam
c400: 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 20 73  ed or unlinked s
c410: 69 6e 63 65 20 69 74 20 77 61 73 20 66 69 72 73  ince it was firs
c420: 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74 61  t opened..*/.sta
c430: 74 69 63 20 69 6e 74 20 66 69 6c 65 48 61 73 4d  tic int fileHasM
c440: 6f 76 65 64 28 75 6e 69 78 46 69 6c 65 20 2a 70  oved(unixFile *p
c450: 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53 5f 56 58  File){.#if OS_VX
c460: 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 70  WORKS.  return p
c470: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20  File->pInode!=0 
c480: 26 26 20 70 46 69 6c 65 2d 3e 70 49 64 21 3d 70  && pFile->pId!=p
c490: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69  File->pInode->fi
c4a0: 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c 73 65 0a  leId.pId;.#else.
c4b0: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
c4c0: 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c  f;.  return pFil
c4d0: 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 0a  e->pInode!=0 &&.
c4e0: 20 20 20 20 20 20 28 6f 73 53 74 61 74 28 70 46        (osStat(pF
c4f0: 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75 66  ile->zPath, &buf
c500: 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c  )!=0 .         |
c510: 7c 20 28 75 36 34 29 62 75 66 2e 73 74 5f 69 6e  | (u64)buf.st_in
c520: 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  o!=pFile->pInode
c530: 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b 0a 23  ->fileId.ino);.#
c540: 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
c550: 43 68 65 63 6b 20 61 20 75 6e 69 78 46 69 6c 65  Check a unixFile
c560: 20 74 68 61 74 20 69 73 20 61 20 64 61 74 61 62   that is a datab
c570: 61 73 65 2e 20 20 56 65 72 69 66 79 20 74 68 65  ase.  Verify the
c580: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
c590: 2a 20 28 31 29 20 54 68 65 72 65 20 69 73 20 65  * (1) There is e
c5a0: 78 61 63 74 6c 79 20 6f 6e 65 20 68 61 72 64 20  xactly one hard 
c5b0: 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  link on the file
c5c0: 0a 2a 2a 20 28 32 29 20 54 68 65 20 66 69 6c 65  .** (2) The file
c5d0: 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f 6c   is not a symbol
c5e0: 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29 20 54  ic link.** (3) T
c5f0: 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  he file has not 
c600: 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20  been renamed or 
c610: 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20 49  unlinked.**.** I
c620: 73 73 75 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67  ssue sqlite3_log
c630: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
c640: 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73 20 69 66  ...) messages if
c650: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 6e 6f 74   anything is not
c660: 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
c670: 63 20 76 6f 69 64 20 76 65 72 69 66 79 44 62 46  c void verifyDbF
c680: 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
c690: 69 6c 65 29 7b 0a 20 20 73 74 72 75 63 74 20 73  ile){.  struct s
c6a0: 74 61 74 20 62 75 66 3b 0a 20 20 69 6e 74 20 72  tat buf;.  int r
c6b0: 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 73 65 20 76  c;..  /* These v
c6c0: 65 72 69 66 69 63 61 74 69 6f 6e 73 20 6f 63 63  erifications occ
c6d0: 75 72 73 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  urs for the main
c6e0: 20 64 61 74 61 62 61 73 65 20 6f 6e 6c 79 20 2a   database only *
c6f0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63  /.  if( pFile->c
c700: 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
c710: 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 20 72 65 74  ILE_NOLOCK ) ret
c720: 75 72 6e 3b 0a 0a 20 20 72 63 20 3d 20 6f 73 46  urn;..  rc = osF
c730: 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
c740: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
c750: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c760: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
c770: 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73 74  ING, "cannot fst
c780: 61 74 20 64 62 20 66 69 6c 65 20 25 73 22 2c 20  at db file %s", 
c790: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
c7a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
c7b0: 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e   if( buf.st_nlin
c7c0: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  k==0 ){.    sqli
c7d0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
c7e0: 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75 6e  ARNING, "file un
c7f0: 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70 65  linked while ope
c800: 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  n: %s", pFile->z
c810: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
c820: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66  n;.  }.  if( buf
c830: 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20  .st_nlink>1 ){. 
c840: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
c850: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22  QLITE_WARNING, "
c860: 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74  multiple links t
c870: 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69  o file: %s", pFi
c880: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
c890: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
c8a0: 28 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70  ( fileHasMoved(p
c8b0: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  File) ){.    sql
c8c0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
c8d0: 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72  WARNING, "file r
c8e0: 65 6e 61 6d 65 64 20 77 68 69 6c 65 20 6f 70 65  enamed while ope
c8f0: 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  n: %s", pFile->z
c900: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
c910: 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n;.  }.}.../*.**
c920: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
c930: 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
c940: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
c950: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
c960: 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
c970: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
c980: 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
c990: 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
c9a0: 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
c9b0: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
c9c0: 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
c9d0: 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
c9e0: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
c9f0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
ca00: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
ca10: 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
ca20: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
ca30: 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
ca40: 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
ca50: 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73  int unixCheckRes
ca60: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
ca70: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
ca80: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
ca90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
caa0: 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
cab0: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
cac0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
cad0: 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
cae0: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
caf0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
cb00: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
cb10: 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  K; );..  assert(
cb20: 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65   pFile );.  asse
cb30: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
cb40: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
cb50: 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  K );.  sqlite3_m
cb60: 75 74 65 78 5f 65 6e 74 65 72 28 70 46 69 6c 65  utex_enter(pFile
cb70: 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  ->pInode->pLockM
cb80: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  utex);..  /* Che
cb90: 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
cba0: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
cbb0: 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
cbc0: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
cbd0: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
cbe0: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
cbf0: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
cc00: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
cc10: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
cc20: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
cc30: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
cc40: 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50  .#ifndef __DJGPP
cc50: 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  __.  if( !reserv
cc60: 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49  ed && !pFile->pI
cc70: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
cc80: 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ck ){.    struct
cc90: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
cca0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
ccb0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
ccc0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
ccd0: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
cce0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
ccf0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
cd00: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
cd10: 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  if( osFcntl(pFil
cd20: 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  e->h, F_GETLK, &
cd30: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72  lock) ){.      r
cd40: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
cd50: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
cd60: 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c  CK;.      storeL
cd70: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
cd80: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 20 65 6c  errno);.    } el
cd90: 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79  se if( lock.l_ty
cda0: 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe!=F_UNLCK ){. 
cdb0: 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
cdc0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  1;.    }.  }.#en
cdd0: 64 69 66 0a 20 20 0a 20 20 73 71 6c 69 74 65 33  dif.  .  sqlite3
cde0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 46 69  _mutex_leave(pFi
cdf0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  le->pInode->pLoc
ce00: 6b 4d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  kMutex);.  OSTRA
ce10: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
ce20: 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78  K %d %d %d (unix
ce30: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
ce40: 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
ce50: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
ce60: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
ce70: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
ce80: 74 20 61 20 70 6f 73 69 78 2d 61 64 76 69 73 6f  t a posix-adviso
ce90: 72 79 2d 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ry-lock..**.** T
cea0: 68 65 72 65 20 61 72 65 20 74 77 6f 20 76 65 72  here are two ver
ceb0: 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 72 6f  sions of this ro
cec0: 75 74 69 6e 65 2e 20 20 49 66 20 63 6f 6d 70 69  utine.  If compi
ced0: 6c 65 64 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49  led with.** SQLI
cee0: 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f  TE_ENABLE_SETLK_
cef0: 54 49 4d 45 4f 55 54 20 74 68 65 6e 20 74 68 65  TIMEOUT then the
cf00: 20 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6e 20   routine has an 
cf10: 65 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 0a  extra parameter.
cf20: 2a 2a 20 77 68 69 63 68 20 69 73 20 61 20 70 6f  ** which is a po
cf30: 69 6e 74 65 72 20 74 6f 20 61 20 75 6e 69 78 46  inter to a unixF
cf40: 69 6c 65 2e 20 20 49 66 20 74 68 65 20 75 6e 69  ile.  If the uni
cf50: 78 46 69 6c 65 2d 3e 69 42 75 73 79 54 69 6d 65  xFile->iBusyTime
cf60: 6f 75 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  out.** value is 
cf70: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
cf80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
cf90: 6c 6c 69 73 65 63 6f 6e 64 73 20 74 6f 20 77 61  lliseconds to wa
cfa0: 69 74 20 62 65 66 6f 72 65 0a 2a 2a 20 66 61 69  it before.** fai
cfb0: 6c 69 6e 67 20 74 68 65 20 6c 6f 63 6b 2e 20 20  ling the lock.  
cfc0: 54 68 65 20 69 42 75 73 79 54 69 6d 65 6f 75 74  The iBusyTimeout
cfd0: 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73   value is always
cfe0: 20 72 65 73 65 74 20 62 61 63 6b 20 74 6f 0a 2a   reset back to.*
cff0: 2a 20 7a 65 72 6f 20 6f 6e 20 65 61 63 68 20 63  * zero on each c
d000: 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  all..**.** If SQ
d010: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c  LITE_ENABLE_SETL
d020: 4b 5f 54 49 4d 45 4f 55 54 20 69 73 20 6e 6f 74  K_TIMEOUT is not
d030: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 64   defined, then d
d040: 6f 20 61 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67  o a non-blocking
d050: 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 73  .** attempt to s
d060: 65 74 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  et the lock..*/.
d070: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
d080: 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45  NABLE_SETLK_TIME
d090: 4f 55 54 0a 23 20 64 65 66 69 6e 65 20 6f 73 53  OUT.# define osS
d0a0: 65 74 50 6f 73 69 78 41 64 76 69 73 6f 72 79 4c  etPosixAdvisoryL
d0b0: 6f 63 6b 28 68 2c 78 2c 74 29 20 6f 73 46 63 6e  ock(h,x,t) osFcn
d0c0: 74 6c 28 68 2c 46 5f 53 45 54 4c 4b 2c 78 29 0a  tl(h,F_SETLK,x).
d0d0: 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74  #else.static int
d0e0: 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69 73   osSetPosixAdvis
d0f0: 6f 72 79 4c 6f 63 6b 28 0a 20 20 69 6e 74 20 68  oryLock(.  int h
d100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d110: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
d120: 63 72 69 70 74 6f 72 20 6f 6e 20 77 68 69 63 68  criptor on which
d130: 20 74 6f 20 74 61 6b 65 20 74 68 65 20 6c 6f 63   to take the loc
d140: 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c  k */.  struct fl
d150: 6f 63 6b 20 2a 70 4c 6f 63 6b 2c 20 20 2f 2a 20  ock *pLock,  /* 
d160: 54 68 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20  The description 
d170: 6f 66 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  of the lock */. 
d180: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
d190: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74         /* Struct
d1a0: 75 72 65 20 68 6f 6c 64 69 6e 67 20 74 69 6d 65  ure holding time
d1b0: 6f 75 74 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a  out value */.){.
d1c0: 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 46 63 6e    int rc = osFcn
d1d0: 74 6c 28 68 2c 46 5f 53 45 54 4c 4b 2c 70 4c 6f  tl(h,F_SETLK,pLo
d1e0: 63 6b 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  ck);.  while( rc
d1f0: 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 69 42 75  <0 && pFile->iBu
d200: 73 79 54 69 6d 65 6f 75 74 3e 30 20 29 7b 0a 20  syTimeout>0 ){. 
d210: 20 20 20 2f 2a 20 4f 6e 20 73 79 73 74 65 6d 73     /* On systems
d220: 20 74 68 61 74 20 73 75 70 70 6f 72 74 20 73 6f   that support so
d230: 6d 65 20 6b 69 6e 64 20 6f 66 20 62 6c 6f 63 6b  me kind of block
d240: 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 20 77 69  ing file lock wi
d250: 74 68 20 61 20 74 69 6d 65 6f 75 74 2c 0a 20 20  th a timeout,.  
d260: 20 20 2a 2a 20 6d 61 6b 65 20 61 70 70 72 6f 70    ** make approp
d270: 72 69 61 74 65 20 63 68 61 6e 67 65 73 20 68 65  riate changes he
d280: 72 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 61  re to invoke tha
d290: 74 20 62 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 20  t blocking file 
d2a0: 6c 6f 63 6b 2e 20 20 4f 6e 0a 20 20 20 20 2a 2a  lock.  On.    **
d2b0: 20 67 65 6e 65 72 69 63 20 70 6f 73 69 78 2c 20   generic posix, 
d2c0: 68 6f 77 65 76 65 72 2c 20 74 68 65 72 65 20 69  however, there i
d2d0: 73 20 6e 6f 20 73 75 63 68 20 41 50 49 2e 20 20  s no such API.  
d2e0: 53 6f 20 77 65 20 73 69 6d 70 6c 79 20 74 72 79  So we simply try
d2f0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   the.    ** lock
d300: 20 6f 6e 63 65 20 65 76 65 72 79 20 6d 69 6c 6c   once every mill
d310: 69 73 65 63 6f 6e 64 20 75 6e 74 69 6c 20 65 69  isecond until ei
d320: 74 68 65 72 20 74 68 65 20 74 69 6d 65 6f 75 74  ther the timeout
d330: 20 65 78 70 69 72 65 73 2c 20 6f 72 20 75 6e 74   expires, or unt
d340: 69 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  il.    ** the lo
d350: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 2e 20  ck is obtained. 
d360: 2a 2f 0a 20 20 20 20 75 73 6c 65 65 70 28 31 30  */.    usleep(10
d370: 30 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73  00);.    rc = os
d380: 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c 4b 2c  Fcntl(h,F_SETLK,
d390: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 70 46 69 6c  pLock);.    pFil
d3a0: 65 2d 3e 69 42 75 73 79 54 69 6d 65 6f 75 74 2d  e->iBusyTimeout-
d3b0: 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  -;.  }.  return 
d3c0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
d3d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
d3e0: 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 2a 2f 0a 0a  TLK_TIMEOUT */..
d3f0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
d400: 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c  o set a system-l
d410: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
d420: 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b  pFile.  The lock
d430: 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65   is .** describe
d440: 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a  d by pLock..**.*
d450: 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77  * If the pFile w
d460: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77  as opened read/w
d470: 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65  rite from unix-e
d480: 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e  xcl, then the on
d490: 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20  ly lock.** ever 
d4a0: 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65  obtained is an e
d4b0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61  xclusive lock, a
d4c0: 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  nd it is obtaine
d4d0: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a  d exactly once.*
d4e0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  * the first time
d4f0: 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74   any lock is att
d500: 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62  empted.  All sub
d510: 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c  sequent system l
d520: 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  ocking.** operat
d530: 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f  ions become no-o
d540: 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65  ps.  Locking ope
d550: 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61  rations still ha
d560: 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c  ppen internally,
d570: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
d580: 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73  coordinate acces
d590: 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61  s between separa
d5a0: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
d5b0: 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69  ections.** withi
d5c0: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  n this process, 
d5d0: 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20  but all of that 
d5e0: 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65  is handled in me
d5f0: 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mory and the.** 
d600: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
d610: 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63   does not partic
d620: 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ipate..**.** Thi
d630: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d640: 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20  pass-through to 
d650: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69  fcntl(F_SETLK) i
d660: 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67  f pFile is using
d670: 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65  .** any VFS othe
d680: 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63  r than "unix-exc
d690: 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69  l" or if pFile i
d6a0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69  s opened on "uni
d6b0: 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69  x-excl".** and i
d6c0: 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a  s read-only..**.
d6d0: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
d6e0: 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20  ned if the call 
d6f0: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
d700: 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66  sfully, or -1 if
d710: 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63   a call.** to fc
d720: 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20  ntl() fails. In 
d730: 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f  this case, errno
d740: 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69   is set appropri
d750: 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28  ately (by fcntl(
d760: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
d770: 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75  t unixFileLock(u
d780: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
d790: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c  struct flock *pL
d7a0: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ock){.  int rc;.
d7b0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
d7c0: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
d7d0: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
d7e0: 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a  t( pInode!=0 );.
d7f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d800: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 49 6e  3_mutex_held(pIn
d810: 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29  ode->pLockMutex)
d820: 20 29 3b 0a 20 20 69 66 28 20 28 70 46 69 6c 65   );.  if( (pFile
d830: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 28 55  ->ctrlFlags & (U
d840: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 7c 55 4e 49  NIXFILE_EXCL|UNI
d850: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 29 3d 3d  XFILE_RDONLY))==
d860: 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 29 7b  UNIXFILE_EXCL ){
d870: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
d880: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
d890: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
d8a0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
d8b0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
d8c0: 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  e->nLock==0 );. 
d8d0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
d8e0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
d8f0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
d900: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
d910: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
d920: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
d930: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  ;.      lock.l_t
d940: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
d950: 20 20 20 20 20 72 63 20 3d 20 6f 73 53 65 74 50       rc = osSetP
d960: 6f 73 69 78 41 64 76 69 73 6f 72 79 4c 6f 63 6b  osixAdvisoryLock
d970: 28 70 46 69 6c 65 2d 3e 68 2c 20 26 6c 6f 63 6b  (pFile->h, &lock
d980: 2c 20 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , pFile);.      
d990: 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72  if( rc<0 ) retur
d9a0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f  n rc;.      pIno
d9b0: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
d9c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f   = 1;.      pIno
d9d0: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
d9e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
d9f0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
da00: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  lse{.    rc = os
da10: 53 65 74 50 6f 73 69 78 41 64 76 69 73 6f 72 79  SetPosixAdvisory
da20: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 70  Lock(pFile->h, p
da30: 4c 6f 63 6b 2c 20 70 46 69 6c 65 29 3b 0a 20 20  Lock, pFile);.  
da40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
da50: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
da60: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
da70: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
da80: 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
da90: 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
daa0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
dab0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
dac0: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
dad0: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
dae0: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
daf0: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
db00: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
db10: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
db20: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
db30: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
db40: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
db50: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
db60: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
db70: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
db80: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
db90: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
dba0: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
dbb0: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
dbc0: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
dbd0: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
dbe0: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
dbf0: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
dc00: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
dc10: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
dc20: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
dc30: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
dc40: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
dc50: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
dc60: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
dc70: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
dc80: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
dc90: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
dca0: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
dcb0: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
dcc0: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
dcd0: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
dce0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
dcf0: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
dd00: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
dd10: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
dd20: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
dd30: 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
dd40: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
dd50: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
dd60: 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
dd70: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
dd80: 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65   unixLock(sqlite
dd90: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
dda0: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a  eFileLock){.  /*
ddb0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
ddc0: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70  escribes the imp
ddd0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
dde0: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73  he various locks
ddf0: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74   and.  ** lock t
de00: 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65  ransitions in te
de10: 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58  rms of the POSIX
de20: 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64   advisory shared
de30: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20   and exclusive. 
de40: 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69   ** lock primiti
de50: 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64  ves (called read
de60: 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65  -locks and write
de70: 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f  -locks below, to
de80: 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66   avoid.  ** conf
de90: 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74  usion with SQLit
dea0: 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54  e lock names). T
deb0: 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72  he algorithms ar
dec0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20  e complicated.  
ded0: 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f  ** slightly in o
dee0: 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61  rder to be compa
def0: 74 69 62 6c 65 20 77 69 74 68 20 57 69 6e 64 6f  tible with Windo
df00: 77 73 39 35 20 73 79 73 74 65 6d 73 20 73 69 6d  ws95 systems sim
df10: 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a  ultaneously.  **
df20: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
df30: 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
df40: 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74 20  e, in case that 
df50: 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64  is ever required
df60: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62  ..  **.  ** Symb
df70: 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f  ols defined in o
df80: 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68  s.h indentify th
df90: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
dfa0: 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72 76   and the 'reserv
dfb0: 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65  ed.  ** byte', e
dfc0: 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73  ach single bytes
dfd0: 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f   at well known o
dfe0: 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20  ffsets, and the 
dff0: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
e000: 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67  * range', a rang
e010: 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20 61  e of 510 bytes a
e020: 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f  t a well known o
e030: 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ffset..  **.  **
e040: 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41   To obtain a SHA
e050: 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64  RED lock, a read
e060: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
e070: 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  d on the 'pendin
e080: 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49  g.  ** byte'.  I
e090: 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73  f this is succes
e0a0: 73 66 75 6c 2c 20 27 73 68 61 72 65 64 20 62 79  sful, 'shared by
e0b0: 74 65 20 72 61 6e 67 65 27 20 69 73 20 72 65 61  te range' is rea
e0c0: 64 2d 6c 6f 63 6b 65 64 0a 20 20 2a 2a 20 61 6e  d-locked.  ** an
e0d0: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
e0e0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
e0f0: 20 72 65 6c 65 61 73 65 64 2e 20 20 28 4c 65 67   released.  (Leg
e100: 61 63 79 20 6e 6f 74 65 3a 20 20 57 68 65 6e 0a  acy note:  When.
e110: 20 20 2a 2a 20 53 51 4c 69 74 65 20 77 61 73 20    ** SQLite was 
e120: 66 69 72 73 74 20 64 65 76 65 6c 6f 70 65 64 2c  first developed,
e130: 20 57 69 6e 64 6f 77 73 39 35 20 73 79 73 74 65   Windows95 syste
e140: 6d 73 20 77 65 72 65 20 73 74 69 6c 6c 20 76 65  ms were still ve
e150: 72 79 20 63 6f 6d 6d 6f 6e 2c 0a 20 20 2a 2a 20  ry common,.  ** 
e160: 61 6e 64 20 57 69 64 6e 6f 77 73 39 35 20 6c 61  and Widnows95 la
e170: 63 6b 73 20 61 20 73 68 61 72 65 64 2d 6c 6f 63  cks a shared-loc
e180: 6b 20 63 61 70 61 62 69 6c 69 74 79 2e 20 20 53  k capability.  S
e190: 6f 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35 2c 20  o on Windows95, 
e1a0: 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20 72 61  a.  ** single ra
e1b0: 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 20  ndomly selected 
e1c0: 62 79 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61  by from the 'sha
e1d0: 72 65 64 20 62 79 74 65 20 72 61 6e 67 65 27 20  red byte range' 
e1e0: 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2a 20  is locked..  ** 
e1f0: 57 69 6e 64 6f 77 73 39 35 20 69 73 20 6e 6f 77  Windows95 is now
e200: 20 70 72 65 74 74 79 20 6d 75 63 68 20 65 78 74   pretty much ext
e210: 69 6e 63 74 2c 20 62 75 74 20 74 68 69 73 20 77  inct, but this w
e220: 6f 72 6b 2d 61 72 6f 75 6e 64 20 66 6f 72 20 74  ork-around for t
e230: 68 65 0a 20 20 2a 2a 20 6c 61 63 6b 20 6f 66 20  he.  ** lack of 
e240: 73 68 61 72 65 64 2d 6c 6f 63 6b 73 20 6f 6e 20  shared-locks on 
e250: 57 69 6e 64 6f 77 73 39 35 20 6c 69 76 65 73 20  Windows95 lives 
e260: 6f 6e 2c 20 66 6f 72 20 62 61 63 6b 77 61 72 64  on, for backward
e270: 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 69  s.  ** compatibi
e280: 6c 69 74 79 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a  lity.).  **.  **
e290: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
e2a0: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53  nly obtain a RES
e2b0: 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72  ERVED lock after
e2c0: 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44   it has a SHARED
e2d0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45   lock..  ** A RE
e2e0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69  SERVED lock is i
e2f0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72  mplemented by gr
e300: 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  abbing a write-l
e310: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
e320: 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e  'reserved byte'.
e330: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72   .  **.  ** A pr
e340: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
e350: 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20  btain a PENDING 
e360: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
e370: 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a  s obtained a.  *
e380: 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41  * SHARED lock. A
e390: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
e3a0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
e3b0: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
e3c0: 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  e-lock.  ** on t
e3d0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
e3e0: 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  '. This ensures 
e3f0: 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52  that no new SHAR
e400: 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a  ED locks can be.
e410: 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62    ** obtained, b
e420: 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52  ut existing SHAR
e430: 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c  ED locks are all
e440: 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e  owed to persist.
e450: 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20   A process.  ** 
e460: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
e470: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
e480: 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77  ED lock on the w
e490: 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20  ay to a PENDING 
e4a0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20  lock..  ** This 
e4b0: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
e4c0: 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68   by the algorith
e4d0: 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  m for rolling ba
e4e0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
e4f0: 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63  e.  ** after a c
e500: 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rash..  **.  ** 
e510: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  An EXCLUSIVE loc
e520: 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65  k, obtained afte
e530: 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  r a PENDING lock
e540: 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a   is held, is.  *
e550: 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  * implemented by
e560: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
e570: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65  te-lock on the e
e580: 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79  ntire 'shared by
e590: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20  te.  ** range'. 
e5a0: 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20  Since all other 
e5b0: 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20  locks require a 
e5c0: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65  read-lock on one
e5d0: 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20   of the bytes.  
e5e0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72  ** within this r
e5f0: 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72  ange, this ensur
e600: 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
e610: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20   locks are held 
e620: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
e630: 62 61 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 6e  base. .  */.  in
e640: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e650: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
e660: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
e670: 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
e680: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
e690: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
e6a0: 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  k;.  int tErrno 
e6b0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
e6c0: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
e6d0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
e6e0: 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
e6f0: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
e700: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
e710: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
e720: 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
e730: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
e740: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a  eLock),.      az
e750: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
e760: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
e770: 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  k), pFile->pInod
e780: 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
e790: 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b    osGetpid(0)));
e7a0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
e7b0: 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
e7c0: 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
e7d0: 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
e7e0: 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
e7f0: 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
e800: 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
e810: 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
e820: 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
e830: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
e840: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
e850: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
e860: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
e870: 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock>=eFileLock 
e880: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
e890: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
e8a0: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
e8b0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
e8c0: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
e8d0: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
e8e0: 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72  leLock)));.    r
e8f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e900: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
e910: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
e920: 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
e930: 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20  rect..  **  (1) 
e940: 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
e950: 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
e960: 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
e970: 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
e980: 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
e990: 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
e9a0: 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
e9b0: 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
e9c0: 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
e9d0: 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
e9e0: 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
e9f0: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
ea00: 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
ea10: 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
ea20: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
ea30: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
ea40: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
ea50: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
ea60: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
ea70: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
ea80: 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
ea90: 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
eaa0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
eab0: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
eac0: 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
ead0: 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
eae0: 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
eaf0: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
eb00: 20 20 2a 2f 0a 20 20 70 49 6e 6f 64 65 20 3d 20    */.  pInode = 
eb10: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
eb20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
eb30: 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f  nter(pInode->pLo
eb40: 63 6b 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ckMutex);..  /* 
eb50: 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
eb60: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
eb70: 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
eb80: 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
eb90: 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
eba0: 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
ebb0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
ebc0: 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
ebd0: 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
ebe0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
ebf0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
ec00: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  & .          (pI
ec10: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
ec20: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
ec30: 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
ec40: 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
ec50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
ec60: 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  SY;.    goto end
ec70: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
ec80: 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
ec90: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
eca0: 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
ecb0: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
ecc0: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
ecd0: 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
ece0: 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
ecf0: 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
ed00: 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
ed10: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
ed20: 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
ed30: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
ed40: 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
ed50: 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
ed60: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
ed70: 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
ed80: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
ed90: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
eda0: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
edb0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
edc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
edd0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
ede0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
edf0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
ee00: 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
ee10: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
ee20: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
ee30: 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
ee40: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
ee50: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  ++;.    goto end
ee60: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  _lock;.  }...  /
ee70: 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
ee80: 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
ee90: 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
eea0: 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
eeb0: 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
eec0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
eed0: 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
eee0: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
eef0: 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
ef00: 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
ef10: 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    */.  lock.l_le
ef20: 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c  n = 1L;.  lock.l
ef30: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
ef40: 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c  ET;.  if( eFileL
ef50: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ef60: 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
ef70: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
ef80: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
ef90: 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
efa0: 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
efb0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28   lock.l_type = (
efc0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
efd0: 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
efe0: 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
eff0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
f000: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66  ING_BYTE;.    if
f010: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
f020: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
f030: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
f040: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
f050: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
f060: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
f070: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
f080: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
f090: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
f0a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
f0b0: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
f0c0: 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
f0d0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
f0e0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
f0f0: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
f100: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
f110: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
f120: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
f130: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
f140: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
f150: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
f160: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
f170: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
f180: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
f190: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
f1a0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
f1b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f1c0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
f1d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
f1e0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
f1f0: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20   );..    /* Now 
f200: 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  get the read-loc
f210: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
f220: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
f230: 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  IRST;.    lock.l
f240: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
f250: 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  ZE;.    if( unix
f260: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
f270: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
f280: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
f290: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f2a0: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
f2b0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
f2c0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
f2d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
f2e0: 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
f2f0: 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
f300: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
f310: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
f320: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
f330: 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b  n = 1L;.    lock
f340: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
f350: 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  K;.    if( unixF
f360: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
f370: 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c  lock) && rc==SQL
f380: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f390: 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61  /* This could ha
f3a0: 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77  ppen with a netw
f3b0: 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20  ork mount */.   
f3c0: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
f3d0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  o;.      rc = SQ
f3e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
f3f0: 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  K; .    }..    i
f400: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  f( rc ){.      i
f410: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
f420: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  SY ){.        st
f430: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
f440: 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
f450: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
f460: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65  end_lock;.    }e
f470: 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
f480: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
f490: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
f4a0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
f4b0: 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
f4c0: 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  nShared = 1;.   
f4d0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
f4e0: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
f4f0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f  IVE_LOCK && pIno
f500: 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b  de->nShared>1 ){
f510: 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
f520: 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
f530: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
f540: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
f550: 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61  n this.    ** sa
f560: 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
f570: 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
f580: 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
f590: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
f5a0: 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
f5b0: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
f5c0: 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
f5d0: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
f5e0: 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
f5f0: 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
f600: 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
f610: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
f620: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
f630: 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
f640: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
f650: 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
f660: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63  eLock );.    loc
f670: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
f680: 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  CK;..    assert(
f690: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
f6a0: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  RVED_LOCK || eFi
f6b0: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
f6c0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66  E_LOCK );.    if
f6d0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ( eFileLock==RES
f6e0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
f6f0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f700: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
f710: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
f720: 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c  en = 1L;.    }el
f730: 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  se{.      lock.l
f740: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
f750: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
f760: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
f770: 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _SIZE;.    }..  
f780: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f790: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f7a0: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
f7b0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
f7c0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
f7d0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
f7e0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
f7f0: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
f800: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f810: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
f820: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
f830: 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
f840: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f850: 0a 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .  ..#ifdef SQLI
f860: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65  TE_DEBUG.  /* Se
f870: 74 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63  t up the transac
f880: 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61  tion-counter cha
f890: 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61  nge checking fla
f8a0: 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61  gs when.  ** tra
f8b0: 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
f8c0: 61 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45  a SHARED to a RE
f8d0: 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68  SERVED lock.  Th
f8e0: 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72  e change.  ** fr
f8f0: 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  om SHARED to RES
f900: 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20  ERVED marks the 
f910: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e  beginning of a n
f920: 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65  ormal.  ** write
f930: 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20   operation (not 
f940: 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f  a hot journal ro
f950: 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20  llback)..  */.  
f960: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f970: 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65  K.   && pFile->e
f980: 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
f990: 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c  _LOCK.   && eFil
f9a0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
f9b0: 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46  LOCK.  ){.    pF
f9c0: 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
f9d0: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  ng = 0;.    pFil
f9e0: 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b  e->dbUpdate = 0;
f9f0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
fa00: 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20  rmalWrite = 1;. 
fa10: 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66   }.#endif...  if
fa20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
fa30: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
fa40: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
fa50: 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ock;.    pInode-
fa60: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
fa70: 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20  leLock;.  }else 
fa80: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
fa90: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
faa0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
fab0: 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
fac0: 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
fad0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
fae0: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
faf0: 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c  .end_lock:.  sql
fb00: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
fb10: 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
fb20: 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
fb30: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
fb40: 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %s (unix)\n", pF
fb50: 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
fb60: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
fb70: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
fb80: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
fb90: 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
fba0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
fbb0: 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
fbc0: 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
fbd0: 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
fbe0: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
fbf0: 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
fc00: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
fc10: 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
fc20: 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
fc30: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
fc40: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
fc50: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
fc60: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20  UnixUnusedFd *p 
fc70: 3d 20 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c  = pFile->pPreall
fc80: 6f 63 61 74 65 64 55 6e 75 73 65 64 3b 0a 20 20  ocatedUnused;.  
fc90: 61 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c 65  assert( unixFile
fca0: 4d 75 74 65 78 48 65 6c 64 28 70 46 69 6c 65 29  MutexHeld(pFile)
fcb0: 20 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d   );.  p->pNext =
fcc0: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
fcd0: 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  ;.  pInode->pUnu
fce0: 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65  sed = p;.  pFile
fcf0: 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c  ->h = -1;.  pFil
fd00: 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  e->pPreallocated
fd10: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
fd20: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
fd30: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
fd40: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
fd50: 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
fd60: 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
fd70: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
fd80: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
fd90: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
fda0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
fdb0: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
fdc0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
fdd0: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
fde0: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
fdf0: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
fe00: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
fe10: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a  s a no-op..** .*
fe20: 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e  * If handleNFSUn
fe30: 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68  lock is true, th
fe40: 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e  en on downgradin
fe50: 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c  g an EXCLUSIVE_L
fe60: 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a  OCK to SHARED.**
fe70: 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65 20   the byte range 
fe80: 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
fe90: 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65 20  2 parts and the 
fea0: 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75 6e  first part is un
feb0: 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73  locked then.** s
fec0: 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63  et to a read loc
fed0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65  k, then the othe
fee0: 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79  r part is simply
fef0: 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73   unlocked.  This
ff00: 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e   works .** aroun
ff10: 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e  d a bug in BSD N
ff20: 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73  FS lockd (also s
ff30: 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30  een on MacOSX 10
ff40: 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20  .3+) that fails 
ff50: 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  to .** remove th
ff60: 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
ff70: 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20  a region when a 
ff80: 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74  read lock is set
ff90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ffa0: 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69  posixUnlock(sqli
ffb0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
ffc0: 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74  t eFileLock, int
ffd0: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
ffe0: 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
fff0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
10000 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
10010 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
10020 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
10030 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ck;.  int rc = S
10040 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
10050 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
10060 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
10070 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
10080 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  d,%d) pid=%d (un
10090 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
100a0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
100b0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
100c0 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
100d0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
100e0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
100f0 68 61 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47  hared,.      osG
10100 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61  etpid(0)));..  a
10110 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
10120 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
10130 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
10140 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
10150 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
10160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10170 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
10180 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 71 6c 69  ->pInode;.  sqli
10190 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
101a0 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
101b0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ex);.  assert( p
101c0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
101d0 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
101e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
101f0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
10200 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
10210 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
10220 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23  >eFileLock );..#
10230 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
10240 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
10250 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
10260 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
10270 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
10280 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
10290 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
102a0 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
102b0 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
102c0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
102d0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
102e0 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
102f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10300 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
10310 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
10320 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
10330 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
10340 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
10350 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
10360 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
10370 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
10380 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
10390 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
103a0 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
103b0 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
103c0 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
103d0 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
103e0 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
103f0 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
10400 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
10410 20 20 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65      */.    pFile
10420 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
10430 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
10440 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   /* downgrading 
10450 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
10460 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73   on NFS involves
10470 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72   clearing the wr
10480 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  ite lock.    ** 
10490 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68  before establish
104a0 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b  ing the readlock
104b0 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61   - to avoid a ra
104c0 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20  ce condition we 
104d0 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a  downgrade.    **
104e0 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62   the lock in 2 b
104f0 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70  locks, so that p
10500 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
10510 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64   will be covered
10520 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72   by a .    ** wr
10530 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74  ite lock until t
10540 68 65 20 72 65 73 74 20 69 73 20 63 6f 76 65 72  he rest is cover
10550 65 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63  ed by a read loc
10560 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20  k:.    **  1:   
10570 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20  [WWWWW].    **  
10580 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20  2:   [....W].   
10590 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57   **  3:   [RRRRW
105a0 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b  ].    **  4:   [
105b0 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20  RRRR.].    */.  
105c0 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
105d0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
105e0 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41  #if !defined(__A
105f0 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49  PPLE__) || !SQLI
10600 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
10610 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76  G_STYLE.      (v
10620 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  oid)handleNFSUnl
10630 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ock;.      asser
10640 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  t( handleNFSUnlo
10650 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ck==0 );.#endif.
10660 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
10670 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
10680 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
10690 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20  STYLE.      if( 
106a0 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
106b0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  ){.        int t
106c0 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
106d0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
106e0 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63  de from system c
106f0 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  all errors */.  
10700 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53        off_t divS
10710 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  ize = SHARED_SIZ
10720 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a  E - 1;.        .
10730 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
10740 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
10750 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
10760 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
10770 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
10780 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
10790 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
107a0 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
107b0 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
107c0 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
107d0 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
107e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
107f0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
10800 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
10810 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
10820 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72  ;.          stor
10830 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
10840 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
10850 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
10860 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
10870 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
10880 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
10890 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
108a0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
108b0 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
108c0 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
108d0 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
108e0 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
108f0 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
10900 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
10910 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
10920 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
10930 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
10940 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
10950 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10960 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
10970 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
10980 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
10990 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
109a0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
109b0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
109c0 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
109d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
109e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
109f0 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
10a00 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
10a10 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
10a20 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
10a30 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
10a40 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
10a50 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
10a60 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65  ED_FIRST+divSize
10a70 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
10a80 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
10a90 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ZE-divSize;.    
10aa0 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
10ab0 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
10ac0 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
10ad0 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
10ae0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
10af0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
10b00 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
10b10 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
10b20 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
10b30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
10b40 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
10b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
10b60 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  lse.#endif /* de
10b70 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
10b80 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
10b90 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
10ba0 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
10bb0 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
10bc0 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
10bd0 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
10be0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
10bf0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
10c00 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
10c10 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
10c20 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
10c30 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  E;.        if( u
10c40 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
10c50 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
10c60 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
10c70 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f  ory, the call to
10c80 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20   unixFileLock() 
10c90 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61  cannot fail beca
10ca0 75 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20  use another.    
10cb0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
10cc0 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69   is holding an i
10cd0 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b  ncompatible lock
10ce0 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68  . If it does, th
10cf0 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
10d00 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
10d10 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  the other proces
10d20 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
10d30 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20  ng the locking. 
10d40 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74           ** prot
10d50 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61  ocol. If this ha
10d60 70 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51  ppens, return SQ
10d70 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
10d80 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20  K. Returning.   
10d90 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
10da0 5f 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66  _BUSY would conf
10db0 75 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61  use the upper la
10dc0 79 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65  yer (in practice
10dd0 20 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20   it causes .    
10de0 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65        ** an asse
10df0 72 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20  rt to fail). */ 
10e00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
10e10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
10e20 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73  OCK;.          s
10e30 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
10e40 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
10e50 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
10e60 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
10e70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10e80 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
10e90 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c  = F_UNLCK;.    l
10ea0 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
10eb0 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
10ec0 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
10ed0 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
10ee0 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20  ck.l_len = 2L;  
10ef0 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f  assert( PENDING_
10f00 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44  BYTE+1==RESERVED
10f10 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28  _BYTE );.    if(
10f20 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
10f30 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  ile, &lock)==0 )
10f40 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
10f50 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
10f60 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
10f70 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
10f80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
10f90 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c  CK;.      storeL
10fa0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
10fb0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 67 6f  errno);.      go
10fc0 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
10fd0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65     }.  }.  if( e
10fe0 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
10ff0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72  K ){.    /* Decr
11000 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
11010 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
11020 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
11030 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
11040 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
11050 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
11060 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
11070 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
11080 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
11090 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  k..    */.    pI
110a0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
110b0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
110c0 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
110d0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
110e0 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
110f0 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
11100 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
11110 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
11120 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c   lock.l_len = 0L
11130 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  ;.      if( unix
11140 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
11150 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
11160 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
11170 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
11180 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11190 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
111a0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
111b0 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
111c0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
111d0 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  rrno);.        p
111e0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
111f0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
11200 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
11210 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
11220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
11230 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
11240 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63  the count of loc
11250 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  ks against this 
11260 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e  same file.  When
11270 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e   the.    ** coun
11280 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20  t reaches zero, 
11290 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20  close any other 
112a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
112b0 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20   whose close.   
112c0 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64   ** was deferred
112d0 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73   because of outs
112e0 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20  tanding locks.. 
112f0 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65     */.    pInode
11300 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61  ->nLock--;.    a
11310 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
11320 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69  Lock>=0 );.    i
11330 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  f( pInode->nLock
11340 3d 3d 30 20 29 20 63 6c 6f 73 65 50 65 6e 64 69  ==0 ) closePendi
11350 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
11360 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20  }..end_unlock:. 
11370 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
11380 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f  eave(pInode->pLo
11390 63 6b 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ckMutex);.  if( 
113a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
113b0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
113c0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
113d0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
113e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
113f0 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
11400 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
11410 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
11420 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
11430 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
11440 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
11450 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
11460 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
11470 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
11480 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
11490 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
114a0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
114b0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
114c0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
114d0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
114e0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
114f0 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69   unixUnlock(sqli
11500 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
11510 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69  t eFileLock){.#i
11520 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
11530 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73 73 65 72  P_SIZE>0.  asser
11540 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
11550 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75  ARED_LOCK || ((u
11560 6e 69 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e  nixFile *)id)->n
11570 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23  FetchOut==0 );.#
11580 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
11590 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
115a0 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a  FileLock, 0);.}.
115b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
115c0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74  MMAP_SIZE>0.stat
115d0 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
115e0 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
115f0 2c 20 69 36 34 20 6e 42 79 74 65 29 3b 0a 73 74  , i64 nByte);.st
11600 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e  atic void unixUn
11610 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  mapfile(unixFile
11620 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a   *pFd);.#endif..
11630 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
11640 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
11650 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
11660 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
11670 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
11680 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
11690 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
116a0 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
116b0 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
116c0 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
116d0 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
116e0 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
116f0 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
11700 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
11710 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
11720 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
11730 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
11740 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
11750 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
11760 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
11770 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
11780 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
11790 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
117a0 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
117b0 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
117c0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
117d0 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
117e0 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
117f0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11800 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23  (unixFile*)id;.#
11810 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
11820 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78  AP_SIZE>0.  unix
11830 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
11840 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
11850 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
11860 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
11870 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
11880 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70  __LINE__);.    p
11890 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
118a0 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  }.#if OS_VXWORKS
118b0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
118c0 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69  d ){.    if( pFi
118d0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
118e0 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
118f0 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
11900 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43  k(pFile->pId->zC
11910 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
11920 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73     }.    vxworks
11930 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46  ReleaseFileId(pF
11940 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70  ile->pId);.    p
11950 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
11960 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
11970 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41   SQLITE_UNLINK_A
11980 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66 28  FTER_CLOSE.  if(
11990 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
119a0 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  s & UNIXFILE_DEL
119b0 45 54 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c  ETE ){.    osUnl
119c0 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ink(pFile->zPath
119d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
119e0 72 65 65 28 2a 28 63 68 61 72 2a 2a 29 26 70 46  ree(*(char**)&pF
119f0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
11a00 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20   pFile->zPath = 
11a10 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
11a20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
11a30 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
11a40 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  ->h));.  OpenCou
11a50 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
11a60 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
11a70 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
11a80 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  sed);.  memset(p
11a90 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
11aa0 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65  unixFile));.  re
11ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11ac0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
11ad0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
11ae0 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
11af0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
11b00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11b10 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
11b20 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
11b30 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e  xFile *)id;.  un
11b40 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
11b50 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
11b60 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ode;..  assert( 
11b70 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 76  pInode!=0 );.  v
11b80 65 72 69 66 79 44 62 46 69 6c 65 28 70 46 69 6c  erifyDbFile(pFil
11b90 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b  e);.  unixUnlock
11ba0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
11bb0 20 61 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c   assert( unixFil
11bc0 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 46  eMutexNotheld(pF
11bd0 69 6c 65 29 20 29 3b 0a 20 20 75 6e 69 78 45 6e  ile) );.  unixEn
11be0 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
11bf0 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64  * unixFile.pInod
11c00 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  e is always vali
11c10 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73  d here. Otherwis
11c20 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  e, a different c
11c30 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  lose.  ** routin
11c40 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c  e (e.g. nolockCl
11c50 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20  ose()) would be 
11c60 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a  called instead..
11c70 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
11c80 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
11c90 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e  ock>0 || pFile->
11ca0 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
11cb0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  Lock==0 );.  sql
11cc0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
11cd0 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
11ce0 74 65 78 29 3b 0a 20 20 69 66 28 20 70 49 6e 6f  tex);.  if( pIno
11cf0 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
11d00 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
11d10 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
11d20 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
11d30 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
11d40 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79  le just.    ** y
11d50 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
11d60 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
11d70 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
11d80 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
11d90 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
11da0 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  r to pInode->pUn
11db0 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77  used list.  It w
11dc0 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
11dd0 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20  ally closed .   
11de0 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73   ** when the las
11df0 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
11e00 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65  d..    */.    se
11e10 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
11e20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11e30 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 49 6e  _mutex_leave(pIn
11e40 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29  ode->pLockMutex)
11e50 3b 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65  ;.  releaseInode
11e60 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72  Info(pFile);.  r
11e70 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
11e80 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
11e90 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
11ea0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
11eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
11ec0 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69  f the posix advi
11ed0 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  sory lock implem
11ee0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
11ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
11f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
11f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
11fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70  ********** No-op
11fc0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
11fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
11ff0 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73  * Of the various
12000 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
12010 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62  ntations availab
12020 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66  le, this is by f
12030 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65  ar the.** simple
12040 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20  st:  locking is 
12050 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74  ignored.  No att
12060 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
12070 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
12080 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65  e.** file for re
12090 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
120a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63  ..**.** This loc
120b0 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70  king mode is app
120c0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65  ropriate for use
120d0 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61   on read-only da
120e0 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20  tabases.** (ex: 
120f0 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61  databases that a
12100 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43  re burned into C
12110 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70  D-ROM, for examp
12120 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20  le.)  It can.** 
12130 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20  also be used if 
12140 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
12150 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74  employs some ext
12160 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20  ernal mechanism 
12170 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69  to.** prevent si
12180 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73  multaneous acces
12190 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61  s of the same da
121a0 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72  tabase by two or
121b0 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73   more.** databas
121c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20  e connections.  
121d0 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73  But there is a s
121e0 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64  erious risk of d
121f0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75  atabase.** corru
12200 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f  ption if this lo
12210 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  cking mode is us
12220 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73  ed in situations
12230 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a   where multiple.
12240 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
12250 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65  ections are acce
12260 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
12270 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
12280 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65  the same.** time
12290 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   and one or more
122a0 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
122b0 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e  tions are writin
122c0 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  g..*/..static in
122d0 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  t nolockCheckRes
122e0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
122f0 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
12300 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
12310 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
12320 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a  ER(NotUsed);.  *
12330 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72  pResOut = 0;.  r
12340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12350 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .}.static int no
12360 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
12370 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
12380 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
12390 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
123a0 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
123b0 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
123c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
123d0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
123e0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
123f0 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
12400 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
12410 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
12420 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
12430 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12440 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12450 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  Close the file..
12460 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
12470 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
12480 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 23 69  3_file *id) {.#i
12490 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 41 52  fdef SQLITE_SHAR
124a0 45 44 5f 4d 41 50 50 49 4e 47 0a 20 20 75 6e 69  ED_MAPPING.  uni
124b0 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e  xFile *pFd = (un
124c0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66  ixFile*)id;.  if
124d0 28 20 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 7b  ( pFd->pInode ){
124e0 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
124f0 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61  tex();.    relea
12500 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 64 29  seInodeInfo(pFd)
12510 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
12520 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
12530 69 66 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73  if.  return clos
12540 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
12550 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
12560 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
12570 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70  e no-op lock imp
12580 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
12590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125a0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
125b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125f0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
12600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12640 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
12660 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b  in dot-file Lock
12670 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
12680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12690 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74  **.**.** The dot
126a0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  file locking imp
126b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
126c0 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   the existence o
126d0 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a  f separate lock.
126e0 2a 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79  ** files (really
126f0 20 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f   a directory) to
12700 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20   control access 
12710 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
12720 20 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20    This works.** 
12730 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76  on just about ev
12740 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69  ery filesystem i
12750 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20  maginable.  But 
12760 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75  there are seriou
12770 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a  s downsides:.**.
12780 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65  **    (1)  There
12790 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72   is zero concurr
127a0 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ency.  A single 
127b0 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c  reader blocks al
127c0 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20  l other.**      
127d0 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66     connections f
127e0 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77  rom reading or w
127f0 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
12800 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ase..**.**    (2
12810 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f  )  An applicatio
12820 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  n crash or power
12830 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20   loss can leave 
12840 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73  stale lock files
12850 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74  .**         sitt
12860 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20  ing around that 
12870 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72  need to be clear
12880 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a  ed manually..**.
12890 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  ** Nevertheless,
128a0 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e   a dotlock is an
128b0 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   appropriate loc
128c0 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73  king mode for us
128d0 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72  e if no.** other
128e0 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
128f0 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  y is available..
12900 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f  **.** Dotfile lo
12910 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63  cking works by c
12920 72 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72  reating a subdir
12930 65 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61  ectory in the sa
12940 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a  me directory as.
12950 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
12960 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d  and with the sam
12970 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20  e name but with 
12980 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73  a ".lock" extens
12990 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68  ion added..** Th
129a0 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61  e existence of a
129b0 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20   lock directory 
129c0 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55  implies an EXCLU
129d0 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20  SIVE lock.  All 
129e0 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79  other.** lock ty
129f0 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53  pes (SHARED, RES
12a00 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20  ERVED, PENDING) 
12a10 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  are mapped into 
12a20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f  EXCLUSIVE..*/../
12a30 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75  *.** The file su
12a40 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68  ffix added to th
12a50 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65  e data base file
12a60 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  name in order to
12a70 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c   create the.** l
12a80 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a  ock directory..*
12a90 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43  /.#define DOTLOC
12aa0 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22  K_SUFFIX ".lock"
12ab0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12ac0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
12ad0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
12ae0 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
12af0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
12b00 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
12b10 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
12b20 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
12b30 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
12b40 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
12b50 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
12b60 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
12b70 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
12b80 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
12b90 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
12ba0 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
12bb0 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
12bc0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
12bd0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a  ck checking..**.
12be0 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f  ** In dotfile lo
12bf0 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20  cking, either a 
12c00 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69  lock exists or i
12c10 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20  t does not.  So 
12c20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  in this.** varia
12c30 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73  tion of CheckRes
12c40 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52  ervedLock(), *pR
12c50 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
12c60 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b  true if any lock
12c70 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  .** is held on t
12c80 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73  he file and fals
12c90 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  e if the file is
12ca0 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74   unlocked..*/.st
12cb0 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
12cc0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
12cd0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12ce0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
12cf0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
12d00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
12d10 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
12d20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
12d30 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
12d40 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
12d50 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
12d60 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
12d70 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
12d80 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
12d90 65 20 29 3b 0a 20 20 72 65 73 65 72 76 65 64 20  e );.  reserved 
12da0 3d 20 6f 73 41 63 63 65 73 73 28 28 63 6f 6e 73  = osAccess((cons
12db0 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  t char*)pFile->l
12dc0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 30  ockingContext, 0
12dd0 29 3d 3d 30 3b 0a 20 20 4f 53 54 52 41 43 45 28  )==0;.  OSTRACE(
12de0 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
12df0 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b  d %d %d (dotlock
12e00 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12e10 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
12e20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
12e30 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
12e40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
12e50 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
12e60 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
12e70 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
12e80 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
12e90 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
12ea0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
12eb0 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
12ec0 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
12ed0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
12ee0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
12ef0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
12f00 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
12f10 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
12f20 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
12f30 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
12f40 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
12f50 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
12f60 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
12f70 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
12f80 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
12f90 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
12fa0 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
12fb0 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
12fc0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
12fd0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
12fe0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
12ff0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
13000 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
13010 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
13020 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
13030 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
13040 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
13050 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
13060 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
13070 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
13080 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
13090 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
130a0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
130b0 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
130c0 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
130d0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
130e0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
130f0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
13100 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
13110 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
13120 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
13130 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
13140 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
13150 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
13160 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69   level..**.** Wi
13170 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  th dotfile locki
13180 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e  ng, we really on
13190 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65  ly support state
131a0 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e   (4): EXCLUSIVE.
131b0 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b  .** But we track
131c0 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69   the other locki
131d0 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e  ng levels intern
131e0 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ally..*/.static 
131f0 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28  int dotlockLock(
13200 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13210 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
13220 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
13230 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13240 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c  *)id;.  char *zL
13250 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
13260 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
13270 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72  Context;.  int r
13280 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
13290 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65  .  /* If we have
132a0 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20   any lock, then 
132b0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c  the lock file al
132c0 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41  ready exists.  A
132d0 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  ll we have.  ** 
132e0 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20  to do is adjust 
132f0 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  our internal rec
13300 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ord of the lock 
13310 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  level..  */.  if
13320 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
13330 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ck > NO_LOCK ){.
13340 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13350 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
13360 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  ;.    /* Always 
13370 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73  update the times
13380 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20  tamp on the old 
13390 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48  file */.#ifdef H
133a0 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74  AVE_UTIME.    ut
133b0 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e  ime(zLockFile, N
133c0 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ULL);.#else.    
133d0 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65  utimes(zLockFile
133e0 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
133f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13400 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
13410 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
13420 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63  ive lock */.  rc
13430 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b   = osMkdir(zLock
13440 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69  File, 0777);.  i
13450 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f  f( rc<0 ){.    /
13460 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * failed to open
13470 2f 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b  /create the lock
13480 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20   directory */.  
13490 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
134a0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45  rrno;.    if( EE
134b0 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29  XIST == tErrno )
134c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
134d0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20  ITE_BUSY;.    } 
134e0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20  else {.      rc 
134f0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
13500 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
13510 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
13520 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
13530 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
13540 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  Y ){.        sto
13550 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
13560 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
13570 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
13580 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20  turn rc;.  } .  
13590 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
135a0 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
135b0 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
135c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
135d0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
135e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
135f0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
13600 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
13610 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
13620 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
13630 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
13640 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
13650 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
13660 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
13670 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
13680 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
13690 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
136a0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
136b0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
136c0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
136d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
136e0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68   no-op..**.** Wh
136f0 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  en the locking l
13700 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f  evel reaches NO_
13710 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65  LOCK, delete the
13720 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73   lock file..*/.s
13730 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
13740 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
13750 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
13760 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
13770 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
13780 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
13790 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
137a0 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
137b0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
137c0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
137d0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
137e0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
137f0 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
13800 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29  pid=%d (dotlock)
13810 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
13820 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
13830 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
13840 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28  eLock, osGetpid(
13850 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0)));.  assert( 
13860 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
13870 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
13880 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
13890 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
138a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
138b0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
138c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
138d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64  ;.  }..  /* To d
138e0 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72  owngrade to shar
138f0 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74  ed, simply updat
13900 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e  e our internal n
13910 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  otion of the.  *
13920 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e  * lock state.  N
13930 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77  o need to mess w
13940 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  ith the file on 
13950 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  disk..  */.  if(
13960 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
13970 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  ED_LOCK ){.    p
13980 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13990 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
139a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
139b0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
139c0 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b   To fully unlock
139d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64   the database, d
139e0 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
139f0 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ile */.  assert(
13a00 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
13a10 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73  OCK );.  rc = os
13a20 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29  Rmdir(zLockFile)
13a30 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a  ;.  if( rc<0 ){.
13a40 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
13a50 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
13a60 74 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29  tErrno==ENOENT )
13a70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
13a80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
13a90 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
13aa0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
13ab0 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  K;.      storeLa
13ac0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
13ad0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
13ae0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
13af0 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
13b00 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
13b10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13b20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
13b30 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65  se a file.  Make
13b40 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68   sure the lock h
13b50 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  as been released
13b60 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e   before closing.
13b70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
13b80 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  otlockClose(sqli
13b90 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
13ba0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13bb0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13bc0 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  d;.  assert( id!
13bd0 3d 30 20 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55  =0 );.  dotlockU
13be0 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
13bf0 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  K);.  sqlite3_fr
13c00 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
13c10 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 65 74  gContext);.  ret
13c20 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
13c30 65 28 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  e(id);.}./******
13c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
13c50 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65   of the dot-file
13c60 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
13c70 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
13c80 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
13c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cd0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
13ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
13d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d40 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b  **** Begin flock
13d50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
13d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
13d80 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20  Use the flock() 
13d90 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64  system call to d
13da0 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  o file locking..
13db0 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f  **.** flock() lo
13dc0 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
13dd0 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  t-file locking i
13de0 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f  n that the vario
13df0 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e  us.** fine-grain
13e00 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20   locking levels 
13e10 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c  supported by SQL
13e20 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65  ite are collapse
13e30 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  d into.** a sing
13e40 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  le exclusive loc
13e50 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
13e60 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  ds, SHARED, RESE
13e70 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e  RVED, and.** PEN
13e80 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74  DING locks are t
13e90 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73  he same thing as
13ea0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
13eb0 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73  ck.  SQLite.** s
13ec0 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20  till works when 
13ed0 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74  you do this, but
13ee0 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20   concurrency is 
13ef0 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a  reduced since.**
13f00 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70   only a single p
13f10 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65  rocess can be re
13f20 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
13f30 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a  se at a time..**
13f40 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65  .** Omit this se
13f50 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ction if SQLITE_
13f60 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
13f70 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f  TYLE is turned o
13f80 66 66 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ff.*/.#if SQLITE
13f90 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
13fa0 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  STYLE../*.** Ret
13fb0 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73  ry flock() calls
13fc0 20 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20   that fail with 
13fd0 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20  EINTR.*/.#ifdef 
13fe0 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74  EINTR.static int
13ff0 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e   robust_flock(in
14000 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  t fd, int op){. 
14010 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72   int rc;.  do{ r
14020 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29  c = flock(fd,op)
14030 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
14040 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
14050 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14060 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
14070 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62  robust_flock(a,b
14080 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e  ) flock(a,b).#en
14090 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  dif.     ../*.**
140a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
140b0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
140c0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
140d0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
140e0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
140f0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
14100 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
14110 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
14120 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
14130 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
14140 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
14150 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
14160 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
14170 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
14180 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
14190 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
141a0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
141b0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
141c0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
141d0 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  int flockCheckRe
141e0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
141f0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14200 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
14210 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14220 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
14230 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
14240 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14250 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
14260 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
14270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
14280 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
14290 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
142a0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
142b0 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
142c0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
142d0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
142e0 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
142f0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
14300 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
14310 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
14320 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
14330 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
14340 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
14350 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
14360 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
14370 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74  ed ){.    /* att
14380 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  empt to get the 
14390 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
143a0 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
143b0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
143c0 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
143d0 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b  .    if( !lrc ){
143e0 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68  .      /* got th
143f0 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  e lock, unlock i
14400 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  t */.      lrc =
14410 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
14420 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
14430 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63  ;.      if ( lrc
14440 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74   ) {.        int
14450 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
14460 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f  .        /* unlo
14470 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  ck failed with a
14480 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
14490 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f     lrc = SQLITE_
144a0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20  IOERR_UNLOCK; . 
144b0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
144c0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
144d0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  rno);.        rc
144e0 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = lrc;.      }.
144f0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
14500 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
14510 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73  errno;.      res
14520 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
14530 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
14540 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72   might have it r
14550 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20  eserved */.     
14560 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72   lrc = sqliteErr
14570 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
14580 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
14590 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20  IOERR_LOCK); .  
145a0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
145b0 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
145c0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
145d0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
145e0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
145f0 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
14600 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
14610 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
14620 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63  K %d %d %d (floc
14630 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
14640 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
14650 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
14660 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
14670 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
14680 72 63 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51  rc & 0xff) == SQ
14690 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
146a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
146b0 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31  ;.    reserved=1
146c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
146d0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
146e0 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
146f0 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  */.  *pResOut = 
14700 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
14710 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14720 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
14730 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
14740 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
14750 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
14760 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
14770 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
14780 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
14790 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
147a0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
147b0 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
147c0 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
147d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
147e0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
147f0 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
14800 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
14810 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
14820 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
14830 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
14840 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
14850 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
14860 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
14870 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
14880 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
14890 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
148a0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
148b0 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
148c0 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
148d0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
148e0 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
148f0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
14900 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
14910 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
14920 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
14930 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
14940 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
14950 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
14960 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
14970 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
14980 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
14990 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
149a0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
149b0 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
149c0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
149d0 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20  ** flock() only 
149e0 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45  really support E
149f0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20  XCLUSIVE locks. 
14a00 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d   We track interm
14a10 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73  ediate.** lock s
14a20 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c  tates in the sql
14a30 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
14a40 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63  ure, but all loc
14a50 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20  ks SHARED or.** 
14a60 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79  above are really
14a70 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
14a80 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c   and exclude all
14a90 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
14aa0 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20   from.** access 
14ab0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
14ac0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
14ad0 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
14ae0 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
14af0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
14b00 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
14b10 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
14b20 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
14b30 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28  c int flockLock(
14b40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14b50 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
14b60 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
14b70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
14b80 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
14b90 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  ixFile*)id;..  a
14ba0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
14bb0 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
14bc0 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
14bd0 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
14be0 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
14bf0 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
14c00 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
14c10 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
14c20 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e  e->eFileLock > N
14c30 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
14c40 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
14c50 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
14c60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14c70 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
14c80 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
14c90 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20  lock */.  .  if 
14ca0 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46  (robust_flock(pF
14cb0 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20  ile->h, LOCK_EX 
14cc0 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20  | LOCK_NB)) {.  
14cd0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
14ce0 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64  rrno;.    /* did
14cf0 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65  n't get, must be
14d00 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20   busy */.    rc 
14d10 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
14d20 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
14d30 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
14d40 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
14d50 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
14d60 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  ) ){.      store
14d70 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
14d80 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a   tErrno);.    }.
14d90 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f    } else {.    /
14da0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
14db0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
14dc0 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c  n ok */.    pFil
14dd0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
14de0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  FileLock;.  }.  
14df0 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
14e00 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63    %d %s %s (floc
14e10 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
14e20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
14e30 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20  eLock), .       
14e40 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
14e50 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
14e60 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51  ed"));.#ifdef SQ
14e70 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
14e80 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
14e90 69 66 28 20 28 72 63 20 26 20 30 78 66 66 29 20  if( (rc & 0xff) 
14ea0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
14eb0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
14ec0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e  TE_BUSY;.  }.#en
14ed0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
14ee0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
14ef0 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75  ERRORS */.  retu
14f00 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
14f10 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
14f20 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
14f30 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
14f40 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
14f50 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
14f60 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
14f70 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
14f80 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
14f90 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
14fa0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
14fb0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
14fc0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
14fd0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
14fe0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
14ff0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
15000 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
15010 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b   int flockUnlock
15020 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
15030 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
15040 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
15050 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
15060 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65  e*)id;.  .  asse
15070 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
15080 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
15090 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
150a0 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d=%d (flock)\n",
150b0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
150c0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
150d0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
150e0 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29  k, osGetpid(0)))
150f0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
15100 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
15110 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
15120 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
15130 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
15140 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
15150 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
15160 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15170 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
15180 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
15190 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
151a0 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
151b0 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46  sive */.  if (eF
151c0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
151d0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
151e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
151f0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
15200 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15210 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
15220 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20  really, unlock. 
15230 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f  */.  if( robust_
15240 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
15250 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64  LOCK_UN) ){.#ifd
15260 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
15270 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
15280 52 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  RS.    return SQ
15290 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20  LITE_OK;.#endif 
152a0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
152b0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
152c0 52 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  RS */.    return
152d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
152e0 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LOCK;.  }else{. 
152f0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
15300 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
15310 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15320 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
15330 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
15340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
15350 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
15360 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 61  _file *id) {.  a
15370 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
15380 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64    flockUnlock(id
15390 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65  , NO_LOCK);.  re
153a0 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69  turn closeUnixFi
153b0 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69  le(id);.}..#endi
153c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
153d0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
153e0 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a   && !OS_VXWORK *
153f0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
15400 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
15410 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d  he flock lock im
15420 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
15430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15440 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
15450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15490 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
154a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154e0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
154f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
15500 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f  in Named Semapho
15510 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  re Locking *****
15520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15530 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20  ***.**.** Named 
15540 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
15550 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  g is only suppor
15560 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ted on VxWorks..
15570 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
15580 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
15590 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f  dot-lock and flo
155a0 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65  ck in that it re
155b0 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70  ally only.** sup
155c0 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20  ports EXCLUSIVE 
155d0 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61  locking.  Only a
155e0 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
155f0 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  can read or writ
15600 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
15610 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65  e file at a time
15620 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
15630 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72  potential concur
15640 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61  rency, but.** ma
15650 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70  kes the lock imp
15660 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68  lementation much
15670 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20   easier..*/.#if 
15680 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
15690 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
156a0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
156b0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
156c0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
156d0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
156e0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
156f0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
15700 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
15710 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
15720 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
15730 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
15740 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
15750 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
15760 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
15770 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
15780 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
15790 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
157a0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
157b0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
157c0 20 69 6e 74 20 73 65 6d 58 43 68 65 63 6b 52 65   int semXCheckRe
157d0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
157e0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
157f0 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
15800 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15810 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
15820 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
15830 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
15840 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
15850 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
15860 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15870 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
15880 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
15890 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
158a0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
158b0 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
158c0 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
158d0 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
158e0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
158f0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
15900 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
15910 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
15920 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
15930 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
15940 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
15950 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
15960 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53  ){.    sem_t *pS
15970 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
15980 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69  de->pSem;..    i
15990 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
159a0 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
159b0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
159c0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
159d0 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f  EAGAIN != tErrno
159e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
159f0 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
15a00 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
15a10 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
15a20 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
15a30 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72  K);.        stor
15a40 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
15a50 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
15a60 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
15a70 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
15a80 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
15a90 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
15aa0 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
15ab0 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
15ac0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
15ad0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
15ae0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
15af0 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75  .      /* we cou
15b00 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65  ld have it if we
15b10 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20   want it */.    
15b20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29    sem_post(pSem)
15b30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
15b40 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
15b50 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73  LOCK %d %d %d (s
15b60 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
15b70 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
15b80 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
15b90 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
15ba0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15bb0 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
15bc0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
15bd0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
15be0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
15bf0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
15c00 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
15c10 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
15c20 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
15c30 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
15c40 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
15c50 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
15c60 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
15c70 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
15c80 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
15c90 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
15ca0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
15cb0 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
15cc0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
15cd0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
15ce0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
15cf0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
15d00 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
15d10 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
15d20 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
15d30 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
15d40 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
15d50 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
15d60 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
15d70 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
15d80 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
15d90 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
15da0 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
15db0 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
15dc0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
15dd0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
15de0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
15df0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
15e00 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
15e10 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
15e20 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
15e30 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
15e40 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
15e50 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
15e60 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
15e70 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  ks only really s
15e80 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
15e90 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
15ea0 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
15eb0 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
15ec0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
15ed0 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
15ee0 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
15ef0 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
15f00 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
15f10 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
15f20 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
15f30 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
15f40 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
15f50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
15f60 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
15f70 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
15f80 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
15f90 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
15fa0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
15fb0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
15fc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
15fd0 6d 58 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  mXLock(sqlite3_f
15fe0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
15ff0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
16000 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
16010 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
16020 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
16030 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
16040 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
16050 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66  ITE_OK;..  /* if
16060 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
16070 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
16080 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
16090 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
160a0 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
160b0 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
160c0 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
160d0 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
160e0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
160f0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
16100 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ck;.    rc = SQL
16110 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
16120 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
16130 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20   }.  .  /* lock 
16140 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75  semaphore now bu
16150 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20  t bail out when 
16160 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20  already locked. 
16170 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79  */.  if( sem_try
16180 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
16190 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
161a0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
161b0 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
161c0 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c   }..  /* got it,
161d0 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
161e0 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
161f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16200 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a  k = eFileLock;..
16210 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20   sem_end_lock:. 
16220 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16230 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
16240 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
16250 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16260 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
16270 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
16280 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
16290 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
162a0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
162b0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
162c0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
162d0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
162e0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
162f0 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
16300 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
16310 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
16320 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
16330 61 74 69 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c  atic int semXUnl
16340 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
16350 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
16360 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
16370 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
16380 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f  File*)id;.  sem_
16390 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
163a0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a  >pInode->pSem;..
163b0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
163c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  );.  assert( pSe
163d0 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  m );.  OSTRACE((
163e0 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
163f0 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65  as %d pid=%d (se
16400 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
16410 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
16420 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
16430 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69  ileLock, osGetpi
16440 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74  d(0)));.  assert
16450 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
16460 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
16470 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
16480 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
16490 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
164a0 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
164b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
164c0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
164d0 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
164e0 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
164f0 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
16500 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
16510 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
16520 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
16530 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
16540 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
16550 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16560 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
16570 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c  * no, really unl
16580 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73  ock. */.  if ( s
16590 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d  em_post(pSem)==-
165a0 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
165b0 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  , tErrno = errno
165c0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
165d0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
165e0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
165f0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
16600 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
16610 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
16620 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
16630 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
16640 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  no);.    }.    r
16650 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
16660 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16670 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  k = NO_LOCK;.  r
16680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16690 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
166a0 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
166b0 74 69 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73  tic int semXClos
166c0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
166d0 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
166e0 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
166f0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
16700 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 58 55  e*)id;.    semXU
16710 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
16720 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  K);.    assert( 
16730 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 61 73 73  pFile );.    ass
16740 65 72 74 28 20 75 6e 69 78 46 69 6c 65 4d 75 74  ert( unixFileMut
16750 65 78 4e 6f 74 68 65 6c 64 28 70 46 69 6c 65 29  exNotheld(pFile)
16760 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   );.    unixEnte
16770 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65  rMutex();.    re
16780 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
16790 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c  File);.    unixL
167a0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
167b0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
167c0 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
167d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
167e0 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
167f0 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d  RKS */./*.** Nam
16800 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
16810 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
16820 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b  ilable on VxWork
16830 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
16840 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
16850 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
16860 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
16870 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
16880 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
16890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
168a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
168b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
168c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
168d0 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
168e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
168f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16920 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
16930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16940 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f  *** Begin AFP Lo
16950 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
16960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16970 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46  *******.**.** AF
16980 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46  P is the Apple F
16990 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20  iling Protocol. 
169a0 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72   AFP is a networ
169b0 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75  k filesystem fou
169c0 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d  nd.** on Apple M
169d0 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65  acintosh compute
169e0 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e  rs - both OS9 an
169f0 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  d OSX..**.** Thi
16a00 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65  rd-party impleme
16a10 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20  ntations of AFP 
16a20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  are available.  
16a30 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65  But this code he
16a40 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73  re.** only works
16a50 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66   on OSX..*/..#if
16a60 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
16a70 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
16a80 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
16a90 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70  LE./*.** The afp
16aa0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73  LockingContext s
16ab0 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
16ac0 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73  s all afp lock s
16ad0 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f  pecific state.*/
16ae0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16af0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
16b00 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
16b10 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c  ext;.struct afpL
16b20 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
16b30 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a    int reserved;.
16b40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62    const char *db
16b50 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
16b60 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
16b70 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b   open file */.};
16b80 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  ..struct ByteRan
16b90 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e  geLockPB2.{.  un
16ba0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
16bb0 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
16bc0 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  /* offset to fir
16bd0 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20  st byte to lock 
16be0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
16bf0 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20  ng long length; 
16c00 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66         /* nbr of
16c10 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
16c20 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
16c30 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53  g long retRangeS
16c40 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20  tart; /* nbr of 
16c50 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20  1st byte locked 
16c60 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f  if successful */
16c70 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
16c80 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20   unLockFlag;    
16c90 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f       /* 1 = unlo
16ca0 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a  ck, 0 = lock */.
16cb0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
16cc0 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20  startEndFlag;   
16cd0 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20      /* 1=rel to 
16ce0 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72  end of fork, 0=r
16cf0 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20  el to start */. 
16d00 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
16d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20     /* file desc 
16d30 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f  to assoc this lo
16d40 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23  ck with */.};..#
16d50 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65  define afpfsByte
16d60 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20  RangeLock2FSCTL 
16d70 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27         _IOWR('z'
16d80 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
16d90 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a  eRangeLockPB2)..
16da0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
16db0 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74  utility for sett
16dc0 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20  ing or clearing 
16dd0 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b  a bit-range lock
16de0 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69   on an.** AFP fi
16df0 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a  lesystem..** .**
16e00 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
16e10 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51  K on success, SQ
16e20 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69  LITE_BUSY on fai
16e30 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
16e40 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a  int afpSetLock(.
16e50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
16e60 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
16e70 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
16e80 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  file to be locke
16e90 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f  d or unlocked */
16ea0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
16eb0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
16ec0 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
16ed0 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74  escriptor on pat
16ee0 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  h */.  unsigned 
16ef0 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
16f00 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  ,     /* First b
16f10 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
16f20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
16f30 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c  ong long length,
16f40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16f50 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
16f60 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b  */.  int setLock
16f70 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
16f80 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
16f90 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20  et lock.  False 
16fa0 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f  to clear lock */
16fb0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74  .){.  struct Byt
16fc0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62  eRangeLockPB2 pb
16fd0 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a  ;.  int err;.  .
16fe0 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20    pb.unLockFlag 
16ff0 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20  = setLockFlag ? 
17000 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72  0 : 1;.  pb.star
17010 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20  tEndFlag = 0;.  
17020 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73  pb.offset = offs
17030 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20  et;.  pb.length 
17040 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e  = length; .  pb.
17050 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
17060 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46   .  OSTRACE(("AF
17070 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f  PSETLOCK [%s] fo
17080 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20  r %d%s in range 
17090 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20  %llx:%llx\n", . 
170a0 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f     (setLockFlag?
170b0 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69  "ON":"OFF"), pFi
170c0 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d  le->h, (pb.fd==-
170d0 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a  1?"[testval-1]":
170e0 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c  ""),.    offset,
170f0 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72   length));.  err
17100 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61   = fsctl(path, a
17110 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
17120 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29  k2FSCTL, &pb, 0)
17130 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31  ;.  if ( err==-1
17140 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b   ) {.    int rc;
17150 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
17160 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54  = errno;.    OST
17170 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
17180 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74  K failed to fsct
17190 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e  l() '%s' %d %s\n
171a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
171b0 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74  path, tErrno, st
171c0 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29  rerror(tErrno)))
171d0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
171e0 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
171f0 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20  ERRORS.    rc = 
17200 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c  SQLITE_BUSY;.#el
17210 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  se.    rc = sqli
17220 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
17230 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20  Error(tErrno,.  
17240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17250 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20    setLockFlag ? 
17260 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
17270 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  K : SQLITE_IOERR
17280 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66  _UNLOCK);.#endif
17290 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
172a0 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
172b0 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f  S */.    if( IS_
172c0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
172d0 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
172e0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
172f0 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
17300 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
17310 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
17320 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
17340 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
17350 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
17360 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
17370 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
17380 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
17390 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
173a0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
173b0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
173c0 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
173d0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
173e0 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
173f0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
17400 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
17410 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
17420 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
17430 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
17440 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
17450 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
17460 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
17470 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
17480 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
17490 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
174a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
174b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
174c0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
174d0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
174e0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
174f0 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
17500 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20  ext *context;.  
17510 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
17520 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
17530 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
17540 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
17550 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
17560 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20   );.  context = 
17570 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
17580 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
17590 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
175a0 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  f( context->rese
175b0 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65  rved ){.    *pRe
175c0 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65  sOut = 1;.    re
175d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
175e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
175f0 74 65 78 5f 65 6e 74 65 72 28 70 46 69 6c 65 2d  tex_enter(pFile-
17600 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  >pInode->pLockMu
17610 74 65 78 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b  tex);.  /* Check
17620 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
17630 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
17640 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
17650 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
17660 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
17670 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
17680 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
17690 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
176a0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
176b0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
176c0 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a  s holds it..   *
176d0 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
176e0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b  d ){.    /* lock
176f0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79   the RESERVED by
17700 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  te */.    int lr
17710 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
17720 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17730 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
17740 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20  BYTE, 1,1);  .  
17750 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
17760 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  =lrc ){.      /*
17770 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64   if we succeeded
17780 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72   in taking the r
17790 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e  eserved lock, un
177a0 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f  lock it to resto
177b0 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  re.      ** the 
177c0 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a  original state *
177d0 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66  /.      lrc = af
177e0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
177f0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17800 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
17810 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73  1, 0);.    } els
17820 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  e {.      /* if 
17830 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  we failed to get
17840 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73   the lock then s
17850 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74  omeone else must
17860 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20   have it */.    
17870 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
17880 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
17890 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
178a0 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63   ){.      rc=lrc
178b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
178c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
178d0 65 61 76 65 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  eave(pFile->pIno
178e0 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b  de->pLockMutex);
178f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
17900 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
17910 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
17920 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
17930 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65  ved));.  .  *pRe
17940 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
17950 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17960 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
17970 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
17980 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
17990 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
179a0 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
179b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
179c0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
179d0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
179e0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
179f0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
17a00 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
17a10 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
17a20 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
17a30 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
17a40 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
17a50 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
17a60 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
17a70 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
17a80 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
17a90 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
17aa0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
17ab0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
17ac0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
17ad0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
17ae0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
17af0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
17b00 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
17b10 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
17b20 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
17b30 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
17b40 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
17b50 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
17b60 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
17b70 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
17b80 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
17b90 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
17ba0 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
17bb0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
17bc0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
17bd0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
17be0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
17bf0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
17c00 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
17c10 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
17c20 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
17c30 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
17c40 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
17c50 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
17c60 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
17c70 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
17c80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17c90 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  afpLock(sqlite3_
17ca0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
17cb0 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  ileLock){.  int 
17cc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17cd0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
17ce0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
17cf0 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
17d00 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
17d10 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66  le->pInode;.  af
17d20 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
17d30 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
17d40 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
17d50 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
17d60 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
17d70 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
17d80 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
17d90 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
17da0 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  s,%d) pid=%d (af
17db0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
17dc0 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
17dd0 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
17de0 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
17df0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
17e00 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
17e10 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65  leLock(pInode->e
17e20 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64  FileLock), pInod
17e30 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47  e->nShared , osG
17e40 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f  etpid(0)));..  /
17e50 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
17e60 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
17e70 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
17e80 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
17e90 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
17ea0 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
17eb0 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66  Don't use the af
17ec0 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  p_end_lock: exit
17ed0 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
17ee0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
17ef0 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
17f00 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
17f10 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
17f20 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
17f30 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
17f40 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
17f50 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
17f60 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
17f70 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
17f80 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
17f90 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
17fa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17fb0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
17fc0 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
17fd0 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
17fe0 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  t.  **  (1) We n
17ff0 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
18000 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
18010 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
18020 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
18030 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
18040 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
18050 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
18060 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
18070 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
18080 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
18090 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
180a0 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
180b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
180c0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
180d0 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  =NO_LOCK || eFil
180e0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
180f0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
18100 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49  eFileLock!=PENDI
18110 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
18120 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
18130 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
18140 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18150 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
18160 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
18170 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
18180 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
18190 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
181a0 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
181b0 2a 2f 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  */.  pInode = pF
181c0 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73  ile->pInode;.  s
181d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
181e0 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  er(pInode->pLock
181f0 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  Mutex);..  /* If
18200 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
18210 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
18220 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
18230 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
18240 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
18250 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
18260 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
18270 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
18280 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
18290 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
182a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
182b0 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  .       (pInode-
182c0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
182d0 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
182e0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
182f0 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20  K)).     ){.    
18300 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
18310 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
18320 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
18330 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
18340 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
18350 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
18360 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
18370 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
18380 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
18390 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
183a0 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
183b0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
183c0 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
183d0 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
183e0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
183f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
18400 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
18410 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
18420 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
18430 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
18440 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
18450 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
18460 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18470 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18480 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
18490 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
184a0 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
184b0 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
184c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
184d0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
184e0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
184f0 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
18500 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
18510 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
18520 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
18530 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
18540 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
18550 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
18560 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
18570 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
18580 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
18590 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
185a0 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
185b0 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
185c0 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
185d0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
185e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
185f0 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
18600 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
18610 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
18620 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
18630 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  K).  ){.    int 
18640 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c  failed;.    fail
18650 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
18660 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18670 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
18680 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20  BYTE, 1, 1);.   
18690 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
186a0 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
186b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
186c0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
186d0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
186e0 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
186f0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
18700 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
18710 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
18720 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
18730 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
18740 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
18750 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
18760 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
18770 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63  K ){.    int lrc
18780 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72  1, lrc2, lrc1Err
18790 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67  no = 0;.    long
187a0 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a   lk, mask;.    .
187b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
187c0 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
187d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
187e0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
187f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20  =0 );.        . 
18800 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f     mask = (sizeo
18810 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41  f(long)==8) ? LA
18820 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78  RGEST_INT64 : 0x
18830 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a  7fffffff;.    /*
18840 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
18850 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f  d-lock SHARED_LO
18860 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74  CK */.    /* not
18870 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69  e that the quali
18880 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  ty of the random
18890 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74  ness doesn't mat
188a0 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f  ter that much */
188b0 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d  .    lk = random
188c0 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d  (); .    pInode-
188d0 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c  >sharedByte = (l
188e0 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45  k & mask)%(SHARE
188f0 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20  D_SIZE - 1);.   
18900 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f   lrc1 = afpSetLo
18910 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
18920 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
18930 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
18940 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
18950 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  dByte, 1, 1);.  
18960 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
18970 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20  ROR(lrc1) ){.   
18980 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70     lrc1Errno = p
18990 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
189a0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72  .    }.    /* Dr
189b0 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
189c0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
189d0 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53  .    lrc2 = afpS
189e0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
189f0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
18a00 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
18a10 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  0);.    .    if(
18a20 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
18a30 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73  rc1) ) {.      s
18a40 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
18a50 69 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b  ile, lrc1Errno);
18a60 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
18a70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
18a80 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
18a90 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
18aa0 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
18ab0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
18ac0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
18ad0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
18ae0 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
18af0 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
18b00 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
18b10 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
18b20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
18b30 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
18b40 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
18b50 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
18b60 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18b70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
18b80 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
18b90 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
18ba0 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
18bb0 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
18bc0 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
18bd0 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
18be0 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
18bf0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
18c00 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
18c10 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
18c20 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
18c30 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
18c40 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
18c50 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
18c60 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
18c70 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
18c80 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
18c90 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
18ca0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
18cb0 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
18cc0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
18cd0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
18ce0 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
18cf0 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
18d00 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
18d10 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
18d20 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65  ock );.    if (e
18d30 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45  FileLock >= RESE
18d40 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
18d50 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
18d60 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
18d70 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
18d80 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
18d90 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
18da0 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
18db0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
18dc0 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
18dd0 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
18de0 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65        if( !faile
18df0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  d ){.        con
18e00 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
18e10 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
18e20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
18e30 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d  d && eFileLock =
18e40 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
18e50 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
18e60 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
18e70 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
18e80 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
18e90 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
18ea0 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
18eb0 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
18ec0 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
18ed0 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
18ee0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
18ef0 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
18f00 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
18f10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
18f20 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
18f30 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
18f40 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
18f50 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d           pInode-
18f80 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
18f90 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
18fa0 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c  nt failed2 = SQL
18fb0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
18fc0 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
18fd0 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
18fe0 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
18ff0 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
19000 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
19010 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
19020 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
19030 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
19040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19050 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
19060 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
19070 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69  ( failed && (fai
19080 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  led2 = afpSetLoc
19090 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
190a0 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
190d0 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
190e0 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20  yte, 1, 1)) ){. 
190f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27           /* Can'
19100 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  t reestablish th
19110 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20  e shared lock.  
19120 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61  Sqlite can't dea
19130 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20  l, this is.     
19140 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63       ** a critic
19150 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20  al I/O error.   
19160 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
19170 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65      rc = ((faile
19180 64 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c  d & 0xff) == SQL
19190 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69  ITE_IOERR) ? fai
191a0 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20  led2 : .        
191b0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
191c0 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
191d0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
191e0 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  _lock;.        }
191f0 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20   .      }else{. 
19200 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c         rc = fail
19210 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed; .      }.   
19220 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65   }.    if( faile
19230 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
19240 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
19250 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
19260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19270 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
19280 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
19290 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
192a0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
192b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
192c0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
192d0 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
192e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
192f0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
19300 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
19310 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
19320 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f  OCK;.  }.  .afp_
19330 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69  end_lock:.  sqli
19340 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
19350 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
19360 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
19370 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
19380 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  s (afp)\n", pFil
19390 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
193a0 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
193b0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
193c0 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
193d0 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75  ailed"));.  retu
193e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
193f0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
19400 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
19410 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
19420 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
19430 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
19440 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
19450 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
19460 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
19470 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
19480 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
19490 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
194a0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
194b0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
194c0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
194d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
194e0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
194f0 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71  int afpUnlock(sq
19500 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
19510 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
19520 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19530 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
19540 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
19550 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
19560 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
19570 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
19580 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
19590 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
195a0 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
195b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
195c0 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20   int skipShared 
195d0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
195e0 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20  TE_TEST.  int h 
195f0 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64  = pFile->h;.#end
19600 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  if..  assert( pF
19610 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
19620 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
19630 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
19640 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  id=%d (afp)\n", 
19650 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
19660 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
19670 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
19680 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
19690 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
196a0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
196b0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  ed,.           o
196c0 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20  sGetpid(0)));.. 
196d0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
196e0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
196f0 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
19700 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
19710 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
19720 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19730 7d 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  }.  pInode = pFi
19740 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 71  le->pInode;.  sq
19750 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
19760 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  r(pInode->pLockM
19770 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
19780 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
19790 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
197a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
197b0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
197c0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
197d0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
197e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
197f0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
19800 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
19810 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19820 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
19830 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
19840 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23  enign(0);.    .#
19850 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
19860 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
19870 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
19880 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
19890 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
198a0 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
198b0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
198c0 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
198d0 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
198e0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
198f0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
19900 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
19910 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19920 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
19930 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
19940 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
19950 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
19960 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
19970 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
19980 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
19990 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
199a0 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
199b0 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
199c0 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
199d0 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
199e0 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
199f0 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
19a00 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
19a10 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
19a20 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
19a30 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
19a40 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
19a50 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
19a60 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
19a70 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20  dbUpdate==0.    
19a80 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
19a90 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
19aa0 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  1 );.    pFile->
19ab0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
19ac0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  0;.#endif.    . 
19ad0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46     if( pFile->eF
19ae0 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
19af0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
19b00 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
19b10 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
19b20 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
19b30 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49  FIRST, SHARED_SI
19b40 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ZE, 0);.      if
19b50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19b60 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
19b70 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
19b80 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
19b90 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f   ){.        /* o
19ba0 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68  nly re-establish
19bb0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
19bc0 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
19bd0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61  .        int sha
19be0 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
19bf0 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
19c00 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
19c10 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
19c20 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
19c30 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
19c40 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
19c50 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  , 1);.      } el
19c60 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69  se {.        ski
19c70 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  pShared = 1;.   
19c80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
19c90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19ca0 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
19cb0 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
19cc0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
19cd0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
19ce0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
19cf0 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
19d00 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a  , 1, 0);.    } .
19d10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19d20 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
19d30 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52  eFileLock>=RESER
19d40 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74  VED_LOCK && cont
19d50 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
19d60 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
19d70 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
19d80 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
19d90 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
19da0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   0);.      if( !
19db0 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63  rc ){ .        c
19dc0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
19dd0 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20   = 0; .      }. 
19de0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
19df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
19e00 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
19e10 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
19e20 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20  >nShared>1)){.  
19e30 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
19e40 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
19e50 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  OCK;.    }.  }. 
19e60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19e70 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d  OK && eFileLock=
19e80 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  =NO_LOCK ){..   
19e90 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
19ea0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
19eb0 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
19ec0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
19ed0 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
19ee0 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
19ef0 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
19f00 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
19f10 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
19f20 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
19f30 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  /.    unsigned l
19f40 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c  ong long sharedL
19f50 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
19f60 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
19f70 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70  haredByte;.    p
19f80 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
19f90 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
19fa0 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
19fb0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
19fc0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
19fd0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
19fe0 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
19ff0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1a000 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1a010 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
1a020 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
1a030 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
1a040 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1a050 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
1a060 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
1a070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1a080 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
1a090 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
1a0a0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
1a0b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
1a0c0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
1a0d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a0e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a0f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1a100 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
1a110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1a120 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
1a130 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
1a140 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 20 63  de->nLock==0 ) c
1a150 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
1a160 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
1a170 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .  .  sqlite3_mu
1a180 74 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65  tex_leave(pInode
1a190 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20  ->pLockMutex);. 
1a1a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a1b0 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
1a1c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
1a1d0 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65  leLock;.  }.  re
1a1e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a1f0 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26  * Close a file &
1a200 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65   cleanup AFP spe
1a210 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f  cific locking co
1a220 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63  ntext .*/.static
1a230 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71   int afpClose(sq
1a240 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
1a250 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1a260 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
1a270 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1a280 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73  xFile*)id;.  ass
1a290 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
1a2a0 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
1a2b0 5f 4c 4f 43 4b 29 3b 0a 20 20 61 73 73 65 72 74  _LOCK);.  assert
1a2c0 28 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e  ( unixFileMutexN
1a2d0 6f 74 68 65 6c 64 28 70 46 69 6c 65 29 20 29 3b  otheld(pFile) );
1a2e0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1a2f0 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x();.  if( pFile
1a300 2d 3e 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20  ->pInode ){.    
1a310 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
1a320 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
1a330 49 6e 6f 64 65 3b 0a 20 20 20 20 73 71 6c 69 74  Inode;.    sqlit
1a340 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1a350 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
1a360 78 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  x);.    if( pIno
1a370 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
1a380 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1a390 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
1a3a0 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
1a3b0 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
1a3c0 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
1a3d0 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
1a3e0 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
1a3f0 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
1a400 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
1a410 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
1a420 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
1a430 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
1a440 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
1a450 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
1a460 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
1a470 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
1a480 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
1a490 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46       setPendingF
1a4a0 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  d(pFile);.    }.
1a4b0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1a4c0 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e  x_leave(pInode->
1a4d0 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 7d  pLockMutex);.  }
1a4e0 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  .  releaseInodeI
1a4f0 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 73 71  nfo(pFile);.  sq
1a500 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
1a510 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
1a520 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  );.  rc = closeU
1a530 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75  nixFile(id);.  u
1a540 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1a550 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a560 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
1a570 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1a580 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1a590 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
1a5a0 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
1a5b0 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20  bove is the AFP 
1a5c0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
1a5d0 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
1a5e0 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
1a5f0 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
1a600 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
1a610 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
1a620 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
1a630 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
1a640 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27  le.  If you don'
1a650 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20  t compile for a 
1a660 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75  mac, then the "u
1a670 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20  nix-afp".** VFS 
1a680 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
1a690 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
1a6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
1a6b0 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  f the AFP lock i
1a6c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
1a6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a6e0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1a6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a730 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
1a740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a780 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
1a790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a7a0 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b  * Begin NFS Lock
1a7b0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
1a7c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a7d0 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  ****/..#if defin
1a7e0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1a7f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1a800 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
1a810 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f   ** Lower the lo
1a820 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
1a830 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
1a840 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
1a850 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a  k.  eFileLock. *
1a860 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
1a870 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
1a880 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a  ED_LOCK.. **. **
1a890 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
1a8a0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
1a8b0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
1a8c0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
1a8d0 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75  low. ** the requ
1a8e0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
1a8f0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
1a900 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a  e is a no-op.. *
1a910 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73  /.static int nfs
1a920 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
1a930 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
1a940 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72  leLock){.  retur
1a950 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
1a960 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b  , eFileLock, 1);
1a970 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
1a980 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1a990 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1a9a0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1a9b0 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
1a9c0 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e  e above is the N
1a9d0 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
1a9e0 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
1a9f0 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
1aa00 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
1aa10 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
1aa20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
1aa30 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
1aa40 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
1aa50 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a  lable.  .**.****
1aa60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa70 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53  * End of the NFS
1aa80 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
1aa90 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
1aaa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 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 2f 0a 0a 2f 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 2a 2a 2a 2a 2a 2a  ****************
1ab30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
1ab50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
1ab60 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  n-locking sqlite
1ab70 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
1ab80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
1aba0 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69  ** The next divi
1abb0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d  sion contains im
1abc0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
1abd0 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66  r all methods of
1abe0 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
1abf0 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68  _file object oth
1ac00 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b  er than the lock
1ac10 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68  ing methods.  Th
1ac20 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74  e locking.** met
1ac30 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65  hods were define
1ac40 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61  d in divisions a
1ac50 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e  bove (one lockin
1ac60 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20  g method per.** 
1ac70 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73  division).  Thos
1ac80 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61  e methods that a
1ac90 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  re common to all
1aca0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a   locking modes.*
1acb0 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67  * are gather tog
1acc0 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20  ether into this 
1acd0 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a  division..*/../*
1ace0 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
1acf0 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73  offset passed as
1ad00 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1ad10 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20  ment, then read 
1ad20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  cnt .** bytes in
1ad30 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20  to pBuf. Return 
1ad40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1ad50 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
1ad60 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66  d..**.** NB:  If
1ad70 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f   you define USE_
1ad80 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45  PREAD or USE_PRE
1ad90 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69  AD64, then it mi
1ada0 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e  ght also.** be n
1adb0 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69  ecessary to defi
1adc0 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
1add0 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69   to be 500.  Thi
1ade0 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a  s varies from.**
1adf0 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61   one system to a
1ae00 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53  nother.  Since S
1ae10 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64  QLite does not d
1ae20 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a  efine USE_PREAD.
1ae30 2a 2a 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20 62  ** in any form b
1ae40 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69  y default, we wi
1ae50 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
1ae60 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
1ae70 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74  SOURCE..** See t
1ae80 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64  ickets #2741 and
1ae90 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f   #2681..**.** To
1aea0 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
1aeb0 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
1aec0 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64  on a failed read
1aed0 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
1aee0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
1aef0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1af00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1af10 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46  eekAndRead(unixF
1af20 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
1af30 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76  _int64 offset, v
1af40 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
1af50 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
1af60 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b    int prior = 0;
1af70 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
1af80 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
1af90 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
1afa0 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
1afb0 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  set;.#endif.  TI
1afc0 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73  MER_START;.  ass
1afd0 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30  ert( cnt==(cnt&0
1afe0 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73  x1ffff) );.  ass
1aff0 65 72 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b 0a  ert( id->h>2 );.
1b000 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65    do{.#if define
1b010 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20  d(USE_PREAD).   
1b020 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69   got = osPread(i
1b030 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
1b040 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69   offset);.    Si
1b050 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
1b060 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66  ot = -1 );.#elif
1b070 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
1b080 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20  AD64).    got = 
1b090 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c  osPread64(id->h,
1b0a0 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
1b0b0 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  et);.    Simulat
1b0c0 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
1b0d0 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  -1 );.#else.    
1b0e0 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
1b0f0 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
1b100 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
1b110 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1b120 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 2d 31 20   newOffset = -1 
1b130 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  );.    if( newOf
1b140 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  fset<0 ){.      
1b150 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28  storeLastErrno((
1b160 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72  unixFile*)id, er
1b170 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rno);.      retu
1b180 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
1b190 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64   got = osRead(id
1b1a0 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b  ->h, pBuf, cnt);
1b1b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1b1c0 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b  got==cnt ) break
1b1d0 3b 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20  ;.    if( got<0 
1b1e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  ){.      if( err
1b1f0 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74  no==EINTR ){ got
1b200 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20   = 1; continue; 
1b210 7d 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20  }.      prior = 
1b220 30 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  0;.      storeLa
1b230 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c  stErrno((unixFil
1b240 65 2a 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b 0a  e*)id,  errno);.
1b250 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b260 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30   }else if( got>0
1b270 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d   ){.      cnt -=
1b280 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73   got;.      offs
1b290 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20  et += got;.     
1b2a0 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20   prior += got;. 
1b2b0 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69       pBuf = (voi
1b2c0 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a  d*)(got + (char*
1b2d0 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20  )pBuf);.    }.  
1b2e0 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b  }while( got>0 );
1b2f0 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
1b300 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 20  OSTRACE(("READ  
1b310 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
1b320 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20   %llu\n",.      
1b330 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74        id->h, got
1b340 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70  +prior, offset-p
1b350 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50  rior, TIMER_ELAP
1b360 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  SED));.  return 
1b370 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a  got+prior;.}../*
1b380 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
1b390 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
1b3a0 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
1b3b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
1b3c0 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
1b3d0 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
1b3e0 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
1b3f0 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
1b400 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
1b410 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1b420 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
1b430 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69  file *id, .  voi
1b440 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
1b450 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
1b460 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20  nt64 offset.){. 
1b470 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1b480 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
1b490 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  d;.  int got;.  
1b4a0 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
1b4b0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
1b4c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
1b4d0 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
1b4e0 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
1b4f0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
1b500 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
1b510 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
1b520 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
1b530 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
1b540 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
1b550 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
1b560 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
1b570 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
1b580 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61  File->pPrealloca
1b590 74 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  tedUnused==0.   
1b5a0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
1b5b0 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
1b5c0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1b5d0 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
1b5e0 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
1b5f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1b600 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
1b610 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
1b620 63 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20  ch of this read 
1b630 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
1b640 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
1b650 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
1b660 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
1b670 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
1b680 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
1b690 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
1b6a0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
1b6b0 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
1b6c0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1b6d0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
1b6e0 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
1b6f0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1b700 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b  )[offset], amt);
1b710 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1b720 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1b730 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
1b740 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  opy = pFile->mma
1b750 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  pSize - offset;.
1b760 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
1b770 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
1b780 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1b790 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b  offset], nCopy);
1b7a0 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
1b7b0 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
1b7c0 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
1b7d0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
1b7e0 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
1b7f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1b800 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
1b810 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73  Read(pFile, offs
1b820 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
1b830 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
1b840 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1b850 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
1b860 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
1b870 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
1b880 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
1b890 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1b8a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
1b8b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1b8c0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
1b8d0 69 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e 6f  ile, 0);   /* no
1b8e0 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
1b8f0 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   */.    /* Unrea
1b900 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
1b910 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
1b920 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
1b930 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
1b940 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20  )pBuf)[got], 0, 
1b950 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65  amt-got);.    re
1b960 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1b970 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
1b980 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
1b990 70 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66  pt to seek the f
1b9a0 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
1b9b0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
1b9c0 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a  st argument to.*
1b9d0 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65  * absolute offse
1b9e0 74 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74  t iOff, then att
1b9f0 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42  empt to write nB
1ba00 75 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  uf bytes of data
1ba10 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f   from.** pBuf to
1ba20 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72   it. If an error
1ba30 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
1ba40 2d 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72  -1 and set *piEr
1ba50 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rno. Otherwise, 
1ba60 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61  .** return the a
1ba70 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ctual number of 
1ba80 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 28 77  bytes written (w
1ba90 68 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73  hich may be less
1baa0 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a   than.** nBuf)..
1bab0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1bac0 65 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20  ekAndWriteFd(.  
1bad0 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20  int fd,         
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baf0 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
1bb00 6f 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  or to write to *
1bb10 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20  /.  i64 iOff,   
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb30 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73      /* File offs
1bb40 65 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74  et to begin writ
1bb50 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73  ing at */.  cons
1bb60 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20  t void *pBuf,   
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1bb80 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68  opy data from th
1bb90 69 73 20 62 75 66 66 65 72 20 74 6f 20 74 68 65  is buffer to the
1bba0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
1bbb0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
1bbc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1bbd0 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 42 75  ze of buffer pBu
1bbe0 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  f in bytes */.  
1bbf0 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20  int *piErrno    
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc10 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75  /* OUT: Error nu
1bc20 6d 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63  mber if error oc
1bc30 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  curs */.){.  int
1bc40 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc60 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1bc70 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  y system call */
1bc80 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66  ..  assert( nBuf
1bc90 3d 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66 29  ==(nBuf&0x1ffff)
1bca0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64   );.  assert( fd
1bcb0 3e 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >2 );.  assert( 
1bcc0 70 69 45 72 72 6e 6f 21 3d 30 20 29 3b 0a 20 20  piErrno!=0 );.  
1bcd0 6e 42 75 66 20 26 3d 20 30 78 31 66 66 66 66 3b  nBuf &= 0x1ffff;
1bce0 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
1bcf0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
1bd00 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 72 63  _PREAD).  do{ rc
1bd10 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65   = (int)osPwrite
1bd20 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c  (fd, pBuf, nBuf,
1bd30 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28 20   iOff); }while( 
1bd40 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
1bd50 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65  INTR );.#elif de
1bd60 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
1bd70 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69  4).  do{ rc = (i
1bd80 6e 74 29 6f 73 50 77 72 69 74 65 36 34 28 66 64  nt)osPwrite64(fd
1bd90 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f  , pBuf, nBuf, iO
1bda0 66 66 29 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30  ff);}while( rc<0
1bdb0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
1bdc0 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20  );.#else.  do{. 
1bdd0 20 20 20 69 36 34 20 69 53 65 65 6b 20 3d 20 6c     i64 iSeek = l
1bde0 73 65 65 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53  seek(fd, iOff, S
1bdf0 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
1be00 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 69  mulateIOError( i
1be10 53 65 65 6b 20 3d 20 2d 31 20 29 3b 0a 20 20 20  Seek = -1 );.   
1be20 20 69 66 28 20 69 53 65 65 6b 3c 30 20 29 7b 0a   if( iSeek<0 ){.
1be30 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1be40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1be50 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 57 72 69  }.    rc = osWri
1be60 74 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75  te(fd, pBuf, nBu
1be70 66 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  f);.  }while( rc
1be80 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
1be90 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  TR );.#endif..  
1bea0 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54  TIMER_END;.  OST
1beb0 52 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25  RACE(("WRITE   %
1bec0 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c  -3d %5d %7lld %l
1bed0 6c 75 5c 6e 22 2c 20 66 64 2c 20 72 63 2c 20 69  lu\n", fd, rc, i
1bee0 4f 66 66 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  Off, TIMER_ELAPS
1bef0 45 44 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3c  ED));..  if( rc<
1bf00 30 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65  0 ) *piErrno = e
1bf10 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72  rrno;.  return r
1bf20 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  c;.}.../*.** See
1bf30 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
1bf40 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68  in id->offset th
1bf50 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65  en read cnt byte
1bf60 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20  s into pBuf..** 
1bf70 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1bf80 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
1bf90 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74  lly read.  Updat
1bfa0 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a  e the offset..**
1bfb0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
1bfc0 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
1bfd0 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
1bfe0 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74  d write the last
1bff0 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
1c000 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
1c010 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
1c020 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69  c int seekAndWri
1c030 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  te(unixFile *id,
1c040 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e   i64 offset, con
1c050 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  st void *pBuf, i
1c060 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72  nt cnt){.  retur
1c070 6e 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64  n seekAndWriteFd
1c080 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
1c090 70 42 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e  pBuf, cnt, &id->
1c0a0 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a  lastErrno);.}...
1c0b0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
1c0c0 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
1c0d0 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
1c0e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1c0f0 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
1c100 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
1c110 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
1c120 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1c130 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69  nixWrite(.  sqli
1c140 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
1c150 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
1c160 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
1c170 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1c180 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78  ffset .){.  unix
1c190 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1c1a0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
1c1b0 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20  nt wrote = 0;.  
1c1c0 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
1c1d0 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
1c1e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1c1f0 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
1c200 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
1c210 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  , master-journal
1c220 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69   or temp.  ** fi
1c230 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69  le), the bytes i
1c240 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  n the locking ra
1c250 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  nge should never
1c260 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
1c270 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ten. */.#if 0.  
1c280 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
1c290 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
1c2a0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
1c2b0 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
1c2c0 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
1c2d0 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
1c2e0 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
1c2f0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1c300 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1c310 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1c320 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
1c330 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
1c340 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
1c350 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61   to.  ** doing a
1c360 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1c370 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
1c380 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
1c390 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20  her than a.  ** 
1c3a0 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1c3b0 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72  file) then recor
1c3c0 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
1c3d0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
1c3e0 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  * has changed.  
1c3f0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
1c400 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f  on counter is mo
1c410 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74  dified, record t
1c420 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f  hat.  ** fact to
1c430 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  o..  */.  if( pF
1c440 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1c450 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  te ){.    pFile-
1c460 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20  >dbUpdate = 1;  
1c470 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1c480 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
1c490 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66  d */.    if( off
1c4a0 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65  set<=24 && offse
1c4b0 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20  t+amt>=27 ){.   
1c4c0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
1c4d0 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d   char oldCntr[4]
1c4e0 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1c4f0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1c500 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65  ;.      rc = see
1c510 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
1c520 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b  24, oldCntr, 4);
1c530 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1c540 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1c550 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34  .      if( rc!=4
1c560 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e   || memcmp(oldCn
1c570 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75  tr, &((char*)pBu
1c580 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34  f)[24-offset], 4
1c590 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1c5a0 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1c5b0 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68  Chng = 1;  /* Th
1c5c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1c5d0 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65  unter has change
1c5e0 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  d */.      }.   
1c5f0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
1c600 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1c610 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45  E_MMAP_READWRITE
1c620 29 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) && SQLITE_MAX_
1c630 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
1c640 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
1c650 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ch of this write
1c660 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
1c670 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
1c680 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
1c690 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
1c6a0 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
1c6b0 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
1c6c0 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
1c6d0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
1c6e0 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
1c6f0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1c700 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1c710 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
1c720 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
1c730 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29  set], pBuf, amt)
1c740 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1c750 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1c760 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
1c770 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  Copy = pFile->mm
1c780 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  apSize - offset;
1c790 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
1c7a0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
1c7b0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
1c7c0 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29  t], pBuf, nCopy)
1c7d0 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
1c7e0 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
1c7f0 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
1c800 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
1c810 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
1c820 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1c830 0a 20 0a 20 20 77 68 69 6c 65 28 20 28 77 72 6f  . .  while( (wro
1c840 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1c850 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  e(pFile, offset,
1c860 20 70 42 75 66 2c 20 61 6d 74 29 29 3c 61 6d 74   pBuf, amt))<amt
1c870 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20   && wrote>0 ){. 
1c880 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
1c890 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77  .    offset += w
1c8a0 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d  rote;.    pBuf =
1c8b0 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
1c8c0 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69  wrote];.  }.  Si
1c8d0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20  mulateIOError(( 
1c8e0 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d  wrote=(-1), amt=
1c8f0 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  1 ));.  Simulate
1c900 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20  DiskfullError(( 
1c910 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29  wrote=0, amt=1 )
1c920 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 77 72  );..  if( amt>wr
1c930 6f 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 77  ote ){.    if( w
1c940 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d  rote<0 && pFile-
1c950 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53  >lastErrno!=ENOS
1c960 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c  PC ){.      /* l
1c970 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
1c980 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
1c990 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c9a0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1c9b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c9c0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1c9d0 28 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e  (pFile, 0); /* n
1c9e0 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
1c9f0 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
1ca00 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
1ca10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1ca20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1ca30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1ca40 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
1ca50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
1ca60 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
1ca70 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
1ca80 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
1ca90 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
1caa0 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
1cab0 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65  occurring at the
1cac0 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
1cad0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
1cae0 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
1caf0 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
1cb00 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
1cb10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f  dif../*.** We do
1cb20 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65   not trust syste
1cb30 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ms to provide a 
1cb40 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e  working fdatasyn
1cb50 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a  c().  Some do..*
1cb60 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20  * Others do no. 
1cb70 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20   To be safe, we 
1cb80 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20  will stick with 
1cb90 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c  the (slightly sl
1cba0 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29  ower).** fsync()
1cbb0 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68  . If you know th
1cbc0 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64  at your system d
1cbd0 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74  oes support fdat
1cbe0 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c  async() correctl
1cbf0 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c  y,.** then simpl
1cc00 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d  y compile with -
1cc10 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61  Dfdatasync=fdata
1cc20 73 79 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46  sync or -DHAVE_F
1cc30 44 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20  DATASYNC.*/.#if 
1cc40 21 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79  !defined(fdatasy
1cc50 6e 63 29 20 26 26 20 21 48 41 56 45 5f 46 44 41  nc) && !HAVE_FDA
1cc60 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  TASYNC.# define 
1cc70 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
1cc80 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1cc90 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1cca0 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
1ccb0 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1ccc0 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
1ccd0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
1cce0 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
1ccf0 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
1cd00 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
1cd10 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
1cd20 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
1cd30 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
1cd40 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
1cd50 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
1cd60 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
1cd70 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
1cd80 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
1cd90 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
1cda0 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65  he fsync() syste
1cdb0 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  m call does not 
1cdc0 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73  work as advertis
1cdd0 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e  ed on many.** un
1cde0 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65  ix systems.  The
1cdf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65   following proce
1ce00 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d  dure is an attem
1ce10 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74  pt to make.** it
1ce20 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a   work better..**
1ce30 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e  .** The SQLITE_N
1ce40 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73  O_SYNC macro dis
1ce50 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28  ables all fsync(
1ce60 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  )s.  This is use
1ce70 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69  ful.** for testi
1ce80 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  ng when we want 
1ce90 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74  to run through t
1cea0 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75  he test suite qu
1ceb0 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72  ickly..** You ar
1cec0 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73  e strongly advis
1ced0 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c  ed *not* to depl
1cee0 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  oy with SQLITE_N
1cef0 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65  O_SYNC.** enable
1cf00 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63  d, however, sinc
1cf10 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  e with SQLITE_NO
1cf20 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61  _SYNC enabled, a
1cf30 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72  n OS crash.** or
1cf40 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
1cf50 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75  ill likely corru
1cf60 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  pt the database 
1cf70 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  file..**.** SQLi
1cf80 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61  te sets the data
1cf90 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65  Only flag if the
1cfa0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1cfb0 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  e is unchanged..
1cfc0 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69  ** The idea behi
1cfd0 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74  nd dataOnly is t
1cfe0 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e  hat it should on
1cff0 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c  ly write the fil
1d000 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20  e content.** to 
1d010 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e  disk, not the in
1d020 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65  ode.  We only se
1d030 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68  t dataOnly if th
1d040 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a  e file size is .
1d050 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e  ** unchanged sin
1d060 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ce the file size
1d070 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
1d080 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c  inode.  However,
1d090 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65   .** Ted Ts'o te
1d0a0 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74  lls us that fdat
1d0b0 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73  async() will als
1d0c0 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64  o write the inod
1d0d0 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e if the.** file
1d0e0 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65   size has change
1d0f0 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  d.  The only rea
1d100 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  l difference bet
1d110 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29  ween fdatasync()
1d120 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c  .** and fsync(),
1d130 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69   Ted tells us, i
1d140 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1d150 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73  () will not flus
1d160 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69  h the.** inode i
1d170 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f  f the mtime or o
1d180 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e  wner or other in
1d190 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68  ode attributes h
1d1a0 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  ave changed..** 
1d1b0 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  We only care abo
1d1c0 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ut the file size
1d1d0 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20  , not the other 
1d1e0 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c  file attributes,
1d1f0 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73   so.** as far as
1d200 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65   SQLite is conce
1d210 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79  rned, an fdatasy
1d220 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61  nc() is always a
1d230 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20  dequate..** So, 
1d240 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64  we always use fd
1d250 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20  atasync() if it 
1d260 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
1d270 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74  gardless of.** t
1d280 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1d290 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a  dataOnly flag..*
1d2a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c  /.static int ful
1d2b0 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20  l_fsync(int fd, 
1d2c0 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e  int fullSync, in
1d2d0 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69  t dataOnly){.  i
1d2e0 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
1d2f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65   following "ifde
1d300 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c  f/elif/else/" bl
1d310 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65  ock has the same
1d320 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20   structure as.  
1d330 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77  ** the one below
1d340 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74  . It is replicat
1d350 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74  ed here solely t
1d360 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69  o avoid clutteri
1d370 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ng .  ** up the 
1d380 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74  real code with t
1d390 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  he UNUSED_PARAME
1d3a0 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  TER() macros..  
1d3b0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1d3c0 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45  _NO_SYNC.  UNUSE
1d3d0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
1d3e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1d3f0 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1d400 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d410 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
1d420 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1d430 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
1d440 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1d450 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
1d460 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1d470 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1d480 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1d490 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
1d4a0 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
1d4b0 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77   of times that w
1d4c0 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73  e do a normal fs
1d4d0 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20  ync() and .  ** 
1d4e0 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20  FULLSYNC.  This 
1d4f0 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
1d500 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79  esting to verify
1d510 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65   that this proce
1d520 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63  dure.  ** gets c
1d530 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63  alled with the c
1d540 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73  orrect arguments
1d550 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1d560 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
1d570 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74  fullSync ) sqlit
1d580 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1d590 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t++;.  sqlite3_s
1d5a0 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
1d5b0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
1d5c0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
1d5d0 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
1d5e0 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
1d5f0 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
1d600 2d 6f 70 2e 20 20 42 75 74 20 67 6f 20 61 68 65  -op.  But go ahe
1d610 61 64 20 61 6e 64 20 63 61 6c 6c 20 66 73 74 61  ad and call fsta
1d620 74 28 29 20 74 6f 20 76 61 6c 69 64 61 74 65 20  t() to validate 
1d630 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65  the file.  ** de
1d640 73 63 72 69 70 74 6f 72 20 61 73 20 77 65 20 6e  scriptor as we n
1d650 65 65 64 20 61 20 6d 65 74 68 6f 64 20 74 6f 20  eed a method to 
1d660 70 72 6f 76 6f 6b 65 20 61 20 66 61 69 6c 75 72  provoke a failur
1d670 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 63 6f  e during.  ** co
1d680 76 65 72 61 74 65 20 74 65 73 74 69 6e 67 2e 0a  verate testing..
1d690 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1d6a0 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 7b 0a 20  TE_NO_SYNC.  {. 
1d6b0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
1d6c0 75 66 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  uf;.    rc = osF
1d6d0 73 74 61 74 28 66 64 2c 20 26 62 75 66 29 3b 0a  stat(fd, &buf);.
1d6e0 20 20 7d 0a 23 65 6c 69 66 20 48 41 56 45 5f 46    }.#elif HAVE_F
1d6f0 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66  ULLFSYNC.  if( f
1d700 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
1d710 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  c = osFcntl(fd, 
1d720 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b  F_FULLFSYNC, 0);
1d730 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1d740 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49   = 1;.  }.  /* I
1d750 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20  f the FULLFSYNC 
1d760 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63  failed, fall bac
1d770 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20  k to attempting 
1d780 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a  an fsync()..  **
1d790 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65   It shouldn't be
1d7a0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75   possible for fu
1d7b0 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20  llfsync to fail 
1d7c0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20  on the local .  
1d7d0 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28  ** file system (
1d7e0 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c  on OSX), so fail
1d7f0 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ure indicates th
1d800 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a  at FULLFSYNC.  *
1d810 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65  * isn't supporte
1d820 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20  d for this file 
1d830 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65  system. So, atte
1d840 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20  mpt an fsync .  
1d850 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29  ** and (for now)
1d860 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72   ignore the over
1d870 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66  head of a superf
1d880 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c  luous fcntl call
1d890 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65  .  .  ** It'd be
1d8a0 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63   better to detec
1d8b0 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70  t fullfsync supp
1d8c0 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f  ort once and avo
1d8d0 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e  id .  ** the fcn
1d8e0 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69  tl call every ti
1d8f0 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65  me sync is calle
1d900 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
1d910 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
1d920 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  );..#elif define
1d930 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f  d(__APPLE__).  /
1d940 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e  * fdatasync() on
1d950 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65   HFS+ doesn't ye
1d960 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65  t flush the file
1d970 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e   size if it chan
1d980 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  ged correctly.  
1d990 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20  ** so currently 
1d9a0 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68  we default to th
1d9b0 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64  e macro that red
1d9c0 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63  efines fdatasync
1d9d0 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20   to fsync.  */. 
1d9e0 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1d9f0 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66  .#else .  rc = f
1da00 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69  datasync(fd);.#i
1da10 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
1da20 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72  f( rc==-1 && err
1da30 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20  no==ENOTSUP ){. 
1da40 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64     rc = fsync(fd
1da50 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
1da60 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23   OS_VXWORKS */.#
1da70 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
1da80 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c  QLITE_NO_SYNC el
1da90 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1daa0 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56  C */..  if( OS_V
1dab0 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d  XWORKS && rc!= -
1dac0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  1 ){.    rc = 0;
1dad0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1dae0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1daf0 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
1db00 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  r to the directo
1db10 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69  ry containing fi
1db20 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  le zFilename..**
1db30 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1db40 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74  *pFd is set to t
1db50 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64  he opened file d
1db60 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a  escriptor and.**
1db70 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1db80 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
1db90 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68  ror occurs, eith
1dba0 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  er SQLITE_NOMEM.
1dbb0 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e  ** or SQLITE_CAN
1dbc0 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65  TOPEN is returne
1dbd0 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65  d and *pFd is se
1dbe0 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65  t to an undefine
1dbf0 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  d.** value..**.*
1dc00 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
1dc10 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1dc20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79  is used for only
1dc30 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a   one thing - to.
1dc40 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72  ** fsync() a dir
1dc50 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73  ectory to make s
1dc60 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  ure file creatio
1dc70 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65  n and deletion e
1dc80 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75  vents.** are flu
1dc90 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53  shed to disk.  S
1dca0 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e  uch fsyncs are n
1dcb0 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77  ot needed on new
1dcc0 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67  er.** journaling
1dcd0 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75   filesystems, bu
1dce0 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f  t are required o
1dcf0 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74  n older filesyst
1dd00 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
1dd10 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f  routine can be o
1dd20 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20  verridden using 
1dd30 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20  the xSetSysCall 
1dd40 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68  interface..** Th
1dd50 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65  e ability to ove
1dd60 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69  rride this routi
1dd70 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20  ne was added in 
1dd80 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a  support of the.*
1dd90 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  * chromium sandb
1dda0 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64  ox.  Opening a d
1ddb0 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65  irectory is a se
1ddc0 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20  curity risk (we 
1ddd0 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20  are.** told) so 
1dde0 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69  making it overri
1ddf0 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68  deable allows th
1de00 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  e chromium sandb
1de10 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65  ox to.** replace
1de20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1de30 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  th a harmless no
1de40 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68  -op.  To make th
1de50 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20  is routine.** a 
1de60 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69  no-op, replace i
1de70 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68  t with a stub th
1de80 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  at returns SQLIT
1de90 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a  E_OK but leaves.
1dea0 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61  ** *pFd set to a
1deb0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1dec0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1ded0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1dee0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  , the caller is 
1def0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1df00 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  closing.** the f
1df10 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1df20 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28  pFd using close(
1df30 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1df40 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
1df50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1df60 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b  name, int *pFd){
1df70 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
1df80 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72   fd = -1;.  char
1df90 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
1dfa0 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71  THNAME+1];..  sq
1dfb0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1dfc0 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69  AX_PATHNAME, zDi
1dfd0 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69  rname, "%s", zFi
1dfe0 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  lename);.  for(i
1dff0 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  i=(int)strlen(zD
1e000 69 72 6e 61 6d 65 29 3b 20 69 69 3e 30 20 26 26  irname); ii>0 &&
1e010 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27   zDirname[ii]!='
1e020 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28  /'; ii--);.  if(
1e030 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69   ii>0 ){.    zDi
1e040 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27  rname[ii] = '\0'
1e050 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1e060 66 28 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 21 3d  f( zDirname[0]!=
1e070 27 2f 27 20 29 20 7a 44 69 72 6e 61 6d 65 5b 30  '/' ) zDirname[0
1e080 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7a 44 69  ] = '.';.    zDi
1e090 72 6e 61 6d 65 5b 31 5d 20 3d 20 30 3b 0a 20 20  rname[1] = 0;.  
1e0a0 7d 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f  }.  fd = robust_
1e0b0 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f  open(zDirname, O
1e0c0 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59  _RDONLY|O_BINARY
1e0d0 2c 20 30 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d  , 0);.  if( fd>=
1e0e0 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
1e0f0 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20  (("OPENDIR %-3d 
1e100 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e  %s\n", fd, zDirn
1e110 61 6d 65 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 46  ame));.  }.  *pF
1e120 64 20 3d 20 66 64 3b 0a 20 20 69 66 28 20 66 64  d = fd;.  if( fd
1e130 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >=0 ) return SQL
1e140 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e  ITE_OK;.  return
1e150 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1e160 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
1e170 50 54 2c 20 22 6f 70 65 6e 44 69 72 65 63 74 6f  PT, "openDirecto
1e180 72 79 22 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a  ry", zDirname);.
1e190 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
1e1a0 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
1e1b0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
1e1c0 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
1e1d0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1e1e0 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74  If dataOnly==0 t
1e1f0 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c  hen both the fil
1e200 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73  e itself and its
1e210 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a   metadata (file.
1e220 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20  ** size, access 
1e230 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73  time, etc) are s
1e240 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f  ynced.  If dataO
1e250 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79  nly!=0 then only
1e260 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74   the.** file dat
1e270 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  a is synced..**.
1e280 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
1e290 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
1e2a0 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
1e2b0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
1e2c0 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
1e2d0 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
1e2e0 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
1e2f0 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
1e300 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
1e310 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
1e320 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
1e330 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
1e340 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
1e350 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
1e360 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1e370 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
1e380 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
1e390 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
1e3a0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
1e3b0 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
1e3c0 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
1e3d0 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
1e3e0 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
1e3f0 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
1e400 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
1e410 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
1e420 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1e430 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
1e440 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
1e450 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
1e460 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1e470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e480 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33  unixSync(sqlite3
1e490 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
1e4a0 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
1e4b0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1e4c0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1e4d0 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74  id;..  int isDat
1e4e0 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53  aOnly = (flags&S
1e4f0 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
1e500 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75  NLY);.  int isFu
1e510 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26  llsync = (flags&
1e520 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1e530 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43  NC_FULL;..  /* C
1e540 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
1e550 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
1e560 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
1e570 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
1e580 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
1e590 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
1e5a0 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
1e5b0 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
1e5c0 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
1e5d0 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
1e5e0 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
1e5f0 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
1e600 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
1e610 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
1e620 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
1e630 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
1e640 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
1e650 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
1e660 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1e670 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
1e680 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
1e690 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1e6a0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
1e6b0 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c  SYNC    %-3d\n",
1e6c0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
1e6d0 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70  c = full_fsync(p
1e6e0 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73  File->h, isFulls
1e6f0 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29  ync, isDataOnly)
1e700 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1e710 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1e720 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f  f( rc ){.    sto
1e730 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1e740 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  e, errno);.    r
1e750 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1e760 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1e770 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79  FSYNC, "full_fsy
1e780 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  nc", pFile->zPat
1e790 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  h);.  }..  /* Al
1e7a0 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69 72  so fsync the dir
1e7b0 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
1e7c0 67 20 74 68 65 20 66 69 6c 65 20 69 66 20 74 68  g the file if th
1e7d0 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20  e DIRSYNC flag. 
1e7e0 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69   ** is set.  Thi
1e7f0 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20  s is a one-time 
1e800 6f 63 63 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e  occurrence.  Man
1e810 79 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70  y systems (examp
1e820 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61  les: AIX).  ** a
1e830 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79  re unable to fsy
1e840 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  nc a directory, 
1e850 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73  so ignore errors
1e860 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20   on the fsync.. 
1e870 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
1e880 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
1e890 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b  XFILE_DIRSYNC ){
1e8a0 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a  .    int dirfd;.
1e8b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 49      OSTRACE(("DI
1e8c0 52 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66  RSYNC %s (have_f
1e8d0 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c  ullfsync=%d full
1e8e0 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69  sync=%d)\n", pFi
1e8f0 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20  le->zPath,.     
1e900 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c         HAVE_FULL
1e910 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e  FSYNC, isFullsyn
1e920 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73  c));.    rc = os
1e930 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46  OpenDirectory(pF
1e940 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72  ile->zPath, &dir
1e950 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  fd);.    if( rc=
1e960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e970 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64      full_fsync(d
1e980 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  irfd, 0, 0);.   
1e990 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
1e9a0 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f  pFile, dirfd, __
1e9b0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c  LINE__);.    }el
1e9c0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1e9d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
1e9e0 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72  TOPEN );.      r
1e9f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ea00 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
1ea10 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e  ctrlFlags &= ~UN
1ea20 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a  IXFILE_DIRSYNC;.
1ea30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1ea40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
1ea50 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
1ea60 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
1ea70 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
1ea80 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73  t unixTruncate(s
1ea90 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1eaa0 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75   i64 nByte){.  u
1eab0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1eac0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
1ead0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
1eae0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1eaf0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1eb00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1eb10 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b  OERR_TRUNCATE );
1eb20 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
1eb30 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
1eb40 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
1eb50 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72  or this file, tr
1eb60 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
1eb70 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
1eb80 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69  consists of an i
1eb90 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
1eba0 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68   chunks (i.e. th
1ebb0 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69  e.  ** actual fi
1ebc0 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  le size after th
1ebd0 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20  e operation may 
1ebe0 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
1ebf0 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a  he requested.  *
1ec00 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20  * size)..  */.  
1ec10 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1ec20 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74  nk>0 ){.    nByt
1ec30 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46  e = ((nByte + pF
1ec40 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31  ile->szChunk - 1
1ec50 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  )/pFile->szChunk
1ec60 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
1ec70 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  nk;.  }..  rc = 
1ec80 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1ec90 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65  (pFile->h, nByte
1eca0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1ecb0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
1ecc0 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
1ecd0 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1ece0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1ecf0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1ed00 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1ed10 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
1ed20 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
1ed30 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
1ed40 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1ed50 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
1ed60 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
1ed70 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
1ed80 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  .    ** doing a 
1ed90 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1eda0 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
1edb0 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
1edc0 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a  er than a.    **
1edd0 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
1ede0 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72   file) and we tr
1edf0 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
1ee00 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a  to zero length,.
1ee10 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65      ** that effe
1ee20 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20  ctively updates 
1ee30 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1ee40 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
1ee50 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68  happen.    ** wh
1ee60 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64  en restoring a d
1ee70 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
1ee80 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f  e backup API fro
1ee90 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a  m a zero-length.
1eea0 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20      ** source.. 
1eeb0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46     */.    if( pF
1eec0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1eed0 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29  te && nByte==0 )
1eee0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74  {.      pFile->t
1eef0 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1ef00 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1ef10 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1ef20 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 2f  MAP_SIZE>0.    /
1ef30 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
1ef40 73 20 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64  s just truncated
1ef50 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c   to a size small
1ef60 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
1ef70 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70  ently.    ** map
1ef80 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75  ped region, redu
1ef90 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ce the effective
1efa0 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73   mapping size as
1efb0 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69   well. SQLite wi
1efc0 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65  ll.    ** use re
1efd0 61 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29  ad() and write()
1efe0 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20   to access data 
1eff0 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e  beyond this poin
1f000 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20  t from now on.  
1f010 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1f020 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61  nByte<pFile->mma
1f030 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  pSize ){.      p
1f040 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
1f050 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23 65   nByte;.    }.#e
1f060 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e  ndif..    return
1f070 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1f080 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
1f090 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
1f0a0 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
1f0b0 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
1f0c0 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a   int unixFileSiz
1f0d0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1f0e0 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  id, i64 *pSize){
1f0f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72  .  int rc;.  str
1f100 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
1f110 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
1f120 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75  rc = osFstat(((u
1f130 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
1f140 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61   &buf);.  Simula
1f150 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1f160 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
1f170 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
1f180 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29  rrno((unixFile*)
1f190 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  id, errno);.    
1f1a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1f1b0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20  ERR_FSTAT;.  }. 
1f1c0 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74   *pSize = buf.st
1f1d0 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65  _size;..  /* Whe
1f1e0 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f  n opening a zero
1f1f0 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20  -size database, 
1f200 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  the findInodeInf
1f210 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20  o() procedure.  
1f220 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67  ** writes a sing
1f230 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61  le byte into tha
1f240 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  t file in order 
1f250 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
1f260 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65   bug.  ** in the
1f270 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65   OS-X msdos file
1f280 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65  system.  In orde
1f290 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c  r to avoid probl
1f2a0 65 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20  ems with upper. 
1f2b0 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e   ** layers, we n
1f2c0 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  eed to report th
1f2d0 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20  is file size as 
1f2e0 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68  zero even though
1f2f0 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c   it is.  ** real
1f300 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23  ly 1.   Ticket #
1f310 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  3260..  */.  if(
1f320 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53   *pSize==1 ) *pS
1f330 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74  ize = 0;...  ret
1f340 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f350 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
1f360 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1f370 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1f380 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61  PPLE__)./*.** Ha
1f390 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d  ndler for proxy-
1f3a0 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e  locking file-con
1f3b0 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66  trol verbs.  Def
1f3c0 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68  ined below in th
1f3d0 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f  e.** proxying lo
1f3e0 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a  cking division..
1f3f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
1f400 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
1f410 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
1f420 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a  ,void*);.#endif.
1f430 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
1f440 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1f450 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51  to handle the SQ
1f460 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1f470 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f  HINT .** file-co
1f480 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e  ntrol operation.
1f490 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61    Enlarge the da
1f4a0 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73  tabase to nBytes
1f4b0 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75   in size.** (rou
1f4c0 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e  nded up to the n
1f4d0 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e  ext chunk-size).
1f4e0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1f4f0 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  e is already.** 
1f500 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72  nBytes or larger
1f510 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1f520 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1f530 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69  atic int fcntlSi
1f540 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20  zeHint(unixFile 
1f550 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74  *pFile, i64 nByt
1f560 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  e){.  if( pFile-
1f570 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  >szChunk>0 ){.  
1f580 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20    i64 nSize;    
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5a0 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c 65  /* Required file
1f5b0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72   size */.    str
1f5c0 75 63 74 20 73 74 61 74 20 62 75 66 3b 20 20 20  uct stat buf;   
1f5d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
1f5e0 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72  ed to hold retur
1f5f0 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61  n values of fsta
1f600 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69  t() */.   .    i
1f610 66 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65  f( osFstat(pFile
1f620 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20  ->h, &buf) ){.  
1f630 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f640 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1f650 20 20 20 7d 0a 0a 20 20 20 20 6e 53 69 7a 65 20     }..    nSize 
1f660 3d 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d  = ((nByte+pFile-
1f670 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46  >szChunk-1) / pF
1f680 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
1f690 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
1f6a0 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69      if( nSize>(i
1f6b0 36 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29  64)buf.st_size )
1f6c0 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  {..#if defined(H
1f6d0 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1f6e0 41 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53  ATE) && HAVE_POS
1f6f0 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20  IX_FALLOCATE.   
1f700 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62     /* The code b
1f710 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67  elow is handling
1f720 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1f730 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65  e of osFallocate
1f740 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  () .      ** cor
1f750 72 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61  rectly. posix_fa
1f760 6c 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66  llocate() is def
1f770 69 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73  ined to "returns
1f780 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73   zero on success
1f790 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61  , .      ** or a
1f7a0 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f  n error number o
1f7b0 6e 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65  n  failure". See
1f7c0 20 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72   the manpage for
1f7d0 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
1f7e0 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20     int err;.    
1f7f0 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72    do{.        er
1f800 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28  r = osFallocate(
1f810 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74  pFile->h, buf.st
1f820 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66  _size, nSize-buf
1f830 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20  .st_size);.     
1f840 20 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49   }while( err==EI
1f850 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28  NTR );.      if(
1f860 20 65 72 72 20 26 26 20 65 72 72 21 3d 45 49 4e   err && err!=EIN
1f870 56 41 4c 20 29 20 72 65 74 75 72 6e 20 53 51 4c  VAL ) return SQL
1f880 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1f890 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20  .#else.      /* 
1f8a0 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e  If the OS does n
1f8b0 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61  ot have posix_fa
1f8c0 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20  llocate(), fake 
1f8d0 69 74 2e 20 57 72 69 74 65 20 61 20 0a 20 20 20  it. Write a .   
1f8e0 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
1f8f0 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79  e to the last by
1f900 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b  te in each block
1f910 20 74 68 61 74 20 66 61 6c 6c 73 20 65 6e 74 69   that falls enti
1f920 72 65 6c 79 0a 20 20 20 20 20 20 2a 2a 20 77 69  rely.      ** wi
1f930 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65  thin the extende
1f940 64 20 72 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20  d region. Then, 
1f950 69 66 20 72 65 71 75 69 72 65 64 2c 20 61 20 73  if required, a s
1f960 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 20 20 20  ingle byte.     
1f970 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 28 6e   ** at offset (n
1f980 53 69 7a 65 2d 31 29 2c 20 74 6f 20 73 65 74 20  Size-1), to set 
1f990 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f9a0 66 69 6c 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a  file correctly..
1f9b0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
1f9c0 20 61 20 73 69 6d 69 6c 61 72 20 74 65 63 68 6e   a similar techn
1f9d0 69 71 75 65 20 74 6f 20 74 68 61 74 20 75 73 65  ique to that use
1f9e0 64 20 62 79 20 67 6c 69 62 63 20 6f 6e 20 73 79  d by glibc on sy
1f9f0 73 74 65 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74  stems.      ** t
1fa00 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  hat do not have 
1fa10 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65  a real fallocate
1fa20 28 29 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a  () call..      *
1fa30 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b  /.      int nBlk
1fa40 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a   = buf.st_blksiz
1fa50 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74  e;  /* File-syst
1fa60 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f  em block size */
1fa70 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74  .      int nWrit
1fa80 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1fa90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1faa0 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79  bytes written by
1fab0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f   seekAndWrite */
1fac0 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74  .      i64 iWrit
1fad0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1fae0 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65     /* Next offse
1faf0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  t to write to */
1fb00 0a 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d  ..      iWrite =
1fb10 20 28 62 75 66 2e 73 74 5f 73 69 7a 65 2f 6e 42   (buf.st_size/nB
1fb20 6c 6b 29 2a 6e 42 6c 6b 20 2b 20 6e 42 6c 6b 20  lk)*nBlk + nBlk 
1fb30 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
1fb40 74 28 20 69 57 72 69 74 65 3e 3d 62 75 66 2e 73  t( iWrite>=buf.s
1fb50 74 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  t_size );.      
1fb60 61 73 73 65 72 74 28 20 28 28 69 57 72 69 74 65  assert( ((iWrite
1fb70 2b 31 29 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a  +1)%nBlk)==0 );.
1fb80 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f        for(/*no-o
1fb90 70 2a 2f 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a  p*/; iWrite<nSiz
1fba0 65 2b 6e 42 6c 6b 2d 31 3b 20 69 57 72 69 74 65  e+nBlk-1; iWrite
1fbb0 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  +=nBlk ){.      
1fbc0 20 20 69 66 28 20 69 57 72 69 74 65 3e 3d 6e 53    if( iWrite>=nS
1fbd0 69 7a 65 20 29 20 69 57 72 69 74 65 20 3d 20 6e  ize ) iWrite = n
1fbe0 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 20 20  Size - 1;.      
1fbf0 20 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41    nWrite = seekA
1fc00 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69  ndWrite(pFile, i
1fc10 57 72 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20  Write, "", 1);. 
1fc20 20 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74         if( nWrit
1fc30 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  e!=1 ) return SQ
1fc40 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
1fc50 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1fc60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20  .    }.  }..#if 
1fc70 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1fc80 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69  SIZE>0.  if( pFi
1fc90 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  le->mmapSizeMax>
1fca0 30 20 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65  0 && nByte>pFile
1fcb0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1fcc0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66    int rc;.    if
1fcd0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1fce0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  <=0 ){.      if(
1fcf0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
1fd00 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  e(pFile->h, nByt
1fd10 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  e) ){.        st
1fd20 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
1fd30 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
1fd40 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1fd50 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1fd60 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1fd70 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1fd80 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  e->zPath);.     
1fd90 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63   }.    }..    rc
1fda0 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
1fdb0 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  File, nByte);.  
1fdc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1fdd0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
1fde0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1fdf0 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  /*.** If *pArg i
1fe00 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61  s initially nega
1fe10 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69  tive then this i
1fe20 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20  s a query.  Set 
1fe30 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72  *pArg to.** 1 or
1fe40 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   0 depending on 
1fe50 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62  whether or not b
1fe60 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65  it mask of pFile
1fe70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73  ->ctrlFlags is s
1fe80 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41  et..**.** If *pA
1fe90 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68  rg is 0 or 1, th
1fea0 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20  en clear or set 
1feb0 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20  the mask bit of 
1fec0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1fed0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1fee0 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69   unixModeBit(uni
1fef0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e  xFile *pFile, un
1ff00 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b  signed char mask
1ff10 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20  , int *pArg){.  
1ff20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20  if( *pArg<0 ){. 
1ff30 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c     *pArg = (pFil
1ff40 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d  e->ctrlFlags & m
1ff50 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ask)!=0;.  }else
1ff60 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20   if( (*pArg)==0 
1ff70 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
1ff80 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b  rlFlags &= ~mask
1ff90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1ffa0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1ffb0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a  |= mask;.  }.}..
1ffc0 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
1ffd0 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
1ffe0 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
1fff0 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
20000 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a  har *zBuf);../*.
20010 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** Information a
20020 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e  nd control of an
20030 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
20040 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
20050 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
20060 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
20070 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
20080 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69  *pArg){.  unixFi
20090 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
200a0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69  xFile*)id;.  swi
200b0 74 63 68 28 20 6f 70 20 29 7b 0a 23 69 66 20 64  tch( op ){.#if d
200c0 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
200d0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
200e0 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
200f0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20  _ATOMIC_WRITE). 
20100 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
20110 43 4e 54 4c 5f 42 45 47 49 4e 5f 41 54 4f 4d 49  CNTL_BEGIN_ATOMI
20120 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  C_WRITE: {.     
20130 20 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74   int rc = osIoct
20140 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53  l(pFile->h, F2FS
20150 5f 49 4f 43 5f 53 54 41 52 54 5f 41 54 4f 4d 49  _IOC_START_ATOMI
20160 43 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20  C_WRITE);.      
20170 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49  return rc ? SQLI
20180 54 45 5f 49 4f 45 52 52 5f 42 45 47 49 4e 5f 41  TE_IOERR_BEGIN_A
20190 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f  TOMIC : SQLITE_O
201a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
201b0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
201c0 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49  OMMIT_ATOMIC_WRI
201d0 54 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  TE: {.      int 
201e0 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69  rc = osIoctl(pFi
201f0 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f  le->h, F2FS_IOC_
20200 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52  COMMIT_ATOMIC_WR
20210 49 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ITE);.      retu
20220 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 49  rn rc ? SQLITE_I
20230 4f 45 52 52 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d  OERR_COMMIT_ATOM
20240 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  IC : SQLITE_OK;.
20250 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
20260 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 4f 4c 4c  QLITE_FCNTL_ROLL
20270 42 41 43 4b 5f 41 54 4f 4d 49 43 5f 57 52 49 54  BACK_ATOMIC_WRIT
20280 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  E: {.      int r
20290 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c  c = osIoctl(pFil
202a0 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 41  e->h, F2FS_IOC_A
202b0 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52  BORT_VOLATILE_WR
202c0 49 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ITE);.      retu
202d0 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 49  rn rc ? SQLITE_I
202e0 4f 45 52 52 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54  OERR_ROLLBACK_AT
202f0 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  OMIC : SQLITE_OK
20300 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
20310 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20 26 26 20 53  * __linux__ && S
20320 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54  QLITE_ENABLE_BAT
20330 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  CH_ATOMIC_WRITE 
20340 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  */..    case SQL
20350 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
20360 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  ATE: {.      *(i
20370 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
20380 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  ->eFileLock;.   
20390 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
203a0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
203b0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
203c0 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
203d0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
203e0 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
203f0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
20400 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
20410 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
20420 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  TE_FCNTL_CHUNK_S
20430 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69  IZE: {.      pFi
20440 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28  le->szChunk = *(
20450 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  int *)pArg;.    
20460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20470 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
20480 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
20490 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
204a0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
204b0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
204c0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
204d0 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48   rc = fcntlSizeH
204e0 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34  int(pFile, *(i64
204f0 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20   *)pArg);.      
20500 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
20510 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
20520 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
20530 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
20540 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
20550 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  AL: {.      unix
20560 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55  ModeBit(pFile, U
20570 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  NIXFILE_PERSIST_
20580 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  WAL, (int*)pArg)
20590 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
205a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
205b0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
205c0 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
205d0 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20  OVERWRITE: {.   
205e0 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70     unixModeBit(p
205f0 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50  File, UNIXFILE_P
20600 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
20610 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
20620 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
20630 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20640 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b  FCNTL_VFSNAME: {
20650 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29  .      *(char**)
20660 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pArg = sqlite3_m
20670 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69  printf("%s", pFi
20680 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29  le->pVfs->zName)
20690 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
206a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
206b0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
206c0 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41  FCNTL_TEMPFILENA
206d0 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  ME: {.      char
206e0 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74   *zTFile = sqlit
206f0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 70 46 69  e3_malloc64( pFi
20700 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
20710 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66  name );.      if
20720 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20  ( zTFile ){.    
20730 20 20 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e      unixGetTempn
20740 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d  ame(pFile->pVfs-
20750 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46  >mxPathname, zTF
20760 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28  ile);.        *(
20770 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54  char**)pArg = zT
20780 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  File;.      }.  
20790 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
207a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
207b0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
207c0 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20  L_HAS_MOVED: {. 
207d0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
207e0 20 3d 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28   = fileHasMoved(
207f0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65  pFile);.      re
20800 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20810 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
20820 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b  ITE_ENABLE_SETLK
20830 5f 54 49 4d 45 4f 55 54 0a 20 20 20 20 63 61 73  _TIMEOUT.    cas
20840 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
20850 4f 43 4b 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20  OCK_TIMEOUT: {. 
20860 20 20 20 20 20 70 46 69 6c 65 2d 3e 69 42 75 73       pFile->iBus
20870 79 54 69 6d 65 6f 75 74 20 3d 20 2a 28 69 6e 74  yTimeout = *(int
20880 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65  *)pArg;.      re
20890 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
208a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
208b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
208c0 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65  _SIZE>0.    case
208d0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
208e0 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
208f0 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20   i64 newLimit = 
20900 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  *(i64*)pArg;.   
20910 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
20920 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28  TE_OK;.      if(
20930 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65   newLimit>sqlite
20940 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
20950 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Mmap ){.        
20960 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  newLimit = sqlit
20970 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
20980 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 0a  xMmap;.      }..
20990 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c        /* The val
209a0 75 65 20 6f 66 20 6e 65 77 4c 69 6d 69 74 20 6d  ue of newLimit m
209b0 61 79 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  ay be eventually
209c0 20 63 61 73 74 20 74 6f 20 28 73 69 7a 65 5f 74   cast to (size_t
209d0 29 20 61 6e 64 20 70 61 73 73 65 64 0a 20 20 20  ) and passed.   
209e0 20 20 20 2a 2a 20 74 6f 20 6d 6d 61 70 28 29 2e     ** to mmap().
209f0 20 52 65 73 74 72 69 63 74 20 69 74 73 20 76 61   Restrict its va
20a00 6c 75 65 20 74 6f 20 32 47 42 20 69 66 20 28 73  lue to 2GB if (s
20a10 69 7a 65 5f 74 29 20 69 73 20 6e 6f 74 20 61 74  ize_t) is not at
20a20 20 6c 65 61 73 74 20 61 0a 20 20 20 20 20 20 2a   least a.      *
20a30 2a 20 36 34 2d 62 69 74 20 74 79 70 65 2e 20 2a  * 64-bit type. *
20a40 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c  /.      if( newL
20a50 69 6d 69 74 3e 30 20 26 26 20 73 69 7a 65 6f 66  imit>0 && sizeof
20a60 28 73 69 7a 65 5f 74 29 3c 38 20 29 7b 0a 20 20  (size_t)<8 ){.  
20a70 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d        newLimit =
20a80 20 28 6e 65 77 4c 69 6d 69 74 20 26 20 30 78 37   (newLimit & 0x7
20a90 46 46 46 46 46 46 46 29 3b 0a 20 20 20 20 20 20  FFFFFFF);.      
20aa0 7d 0a 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29  }..      *(i64*)
20ab0 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  pArg = pFile->mm
20ac0 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20  apSizeMax;.     
20ad0 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30   if( newLimit>=0
20ae0 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46   && newLimit!=pF
20af0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
20b00 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63   && pFile->nFetc
20b10 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  hOut==0 ){.     
20b20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
20b30 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74  zeMax = newLimit
20b40 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
20b50 53 48 41 52 45 44 5f 4d 41 50 50 49 4e 47 0a 20  SHARED_MAPPING. 
20b60 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
20b70 2d 3e 70 49 6e 6f 64 65 3d 3d 30 20 29 0a 23 65  ->pInode==0 ).#e
20b80 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28  ndif.        if(
20b90 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
20ba0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
20bb0 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
20bc0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
20bd0 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65  rc = unixMapfile
20be0 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20  (pFile, -1);.   
20bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
20c00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20c10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
20c20 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
20c30 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
20c40 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74  r calls this met
20c50 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  hod to signal th
20c60 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20  at it has done. 
20c70 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
20c80 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
20c90 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66  tabase is theref
20ca0 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  ore unchanged an
20cb0 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63  d.    ** it henc
20cc0 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  e it is OK for t
20cd0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
20ce0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f  hange counter to
20cf0 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61   be.    ** uncha
20d00 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nged..    */.   
20d10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
20d20 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a  TL_DB_UNCHANGED:
20d30 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46   {.      ((unixF
20d40 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61  ile*)id)->dbUpda
20d50 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  te = 0;.      re
20d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20d70 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
20d80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
20d90 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
20da0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
20db0 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  _).    case SQLI
20dc0 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43  TE_FCNTL_SET_LOC
20dd0 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20  KPROXYFILE:.    
20de0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
20df0 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_GET_LOCKPROXYF
20e00 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ILE: {.      ret
20e10 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  urn proxyFileCon
20e20 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29  trol(id,op,pArg)
20e30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
20e40 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
20e50 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
20e60 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
20e70 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  __) */.  }.  ret
20e80 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
20e90 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  UND;.}../*.** If
20ea0 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65   pFd->sectorSize
20eb0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65   is non-zero whe
20ec0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
20ed0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
20ee0 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68   a.** no-op. Oth
20ef0 65 72 77 69 73 65 2c 20 74 68 65 20 76 61 6c 75  erwise, the valu
20f00 65 73 20 6f 66 20 70 46 64 2d 3e 73 65 63 74 6f  es of pFd->secto
20f10 72 53 69 7a 65 20 61 6e 64 20 0a 2a 2a 20 70 46  rSize and .** pF
20f20 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  d->deviceCharact
20f30 65 72 69 73 74 69 63 73 20 61 72 65 20 73 65 74  eristics are set
20f40 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
20f50 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a  e file-system .*
20f60 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
20f70 73 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  s. .**.** There 
20f80 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
20f90 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
20fa0 6e 2e 20 4f 6e 65 20 66 6f 72 20 51 4e 58 20 61  n. One for QNX a
20fb0 6e 64 20 6f 6e 65 20 66 6f 72 20 61 6c 6c 0a 2a  nd one for all.*
20fc0 2a 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2e  * other systems.
20fd0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e  .*/.#ifndef __QN
20fe0 58 4e 54 4f 5f 5f 0a 73 74 61 74 69 63 20 76 6f  XNTO__.static vo
20ff0 69 64 20 73 65 74 44 65 76 69 63 65 43 68 61 72  id setDeviceChar
21000 61 63 74 65 72 69 73 74 69 63 73 28 75 6e 69 78  acteristics(unix
21010 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73  File *pFd){.  as
21020 73 65 72 74 28 20 70 46 64 2d 3e 64 65 76 69 63  sert( pFd->devic
21030 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
21040 3d 3d 30 20 7c 7c 20 70 46 64 2d 3e 73 65 63 74  ==0 || pFd->sect
21050 6f 72 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 69  orSize!=0 );.  i
21060 66 28 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69  f( pFd->sectorSi
21070 7a 65 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66  ze==0 ){.#if def
21080 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20  ined(__linux__) 
21090 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
210a0 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41  E_ENABLE_BATCH_A
210b0 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 20  TOMIC_WRITE).   
210c0 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 75 33   int res;.    u3
210d0 32 20 66 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  2 f = 0;..    /*
210e0 20 43 68 65 63 6b 20 66 6f 72 20 73 75 70 70 6f   Check for suppo
210f0 72 74 20 66 6f 72 20 46 32 46 53 20 61 74 6f 6d  rt for F2FS atom
21100 69 63 20 62 61 74 63 68 20 77 72 69 74 65 73 2e  ic batch writes.
21110 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 6f 73   */.    res = os
21120 49 6f 63 74 6c 28 70 46 64 2d 3e 68 2c 20 46 32  Ioctl(pFd->h, F2
21130 46 53 5f 49 4f 43 5f 47 45 54 5f 46 45 41 54 55  FS_IOC_GET_FEATU
21140 52 45 53 2c 20 26 66 29 3b 0a 20 20 20 20 69 66  RES, &f);.    if
21150 28 20 72 65 73 3d 3d 30 20 26 26 20 28 66 20 26  ( res==0 && (f &
21160 20 46 32 46 53 5f 46 45 41 54 55 52 45 5f 41 54   F2FS_FEATURE_AT
21170 4f 4d 49 43 5f 57 52 49 54 45 29 20 29 7b 0a 20  OMIC_WRITE) ){. 
21180 20 20 20 20 20 70 46 64 2d 3e 64 65 76 69 63 65       pFd->device
21190 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
211a0 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42  = SQLITE_IOCAP_B
211b0 41 54 43 48 5f 41 54 4f 4d 49 43 3b 0a 20 20 20  ATCH_ATOMIC;.   
211c0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c   }.#endif /* __l
211d0 69 6e 75 78 5f 5f 20 26 26 20 53 51 4c 49 54 45  inux__ && SQLITE
211e0 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
211f0 4f 4d 49 43 5f 57 52 49 54 45 20 2a 2f 0a 0a 20  OMIC_WRITE */.. 
21200 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 50 4f     /* Set the PO
21210 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
21220 45 20 66 6c 61 67 20 69 66 20 72 65 71 75 65 73  E flag if reques
21230 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ted. */.    if( 
21240 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  pFd->ctrlFlags &
21250 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 29   UNIXFILE_PSOW )
21260 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 64 65 76  {.      pFd->dev
21270 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
21280 63 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43  cs |= SQLITE_IOC
21290 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
212a0 52 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 0a 20  RWRITE;.    }.. 
212b0 20 20 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69     pFd->sectorSi
212c0 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
212d0 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
212e0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 69 6e  .  }.}.#else.#in
212f0 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f  clude <sys/dcmd_
21300 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  blk.h>.#include 
21310 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a  <sys/statvfs.h>.
21320 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 44  static void setD
21330 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
21340 74 69 63 73 28 75 6e 69 78 46 69 6c 65 20 2a 70  tics(unixFile *p
21350 46 69 6c 65 29 7b 0a 20 20 69 66 28 20 70 46 69  File){.  if( pFi
21360 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
21370 3d 20 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  = 0 ){.    struc
21380 74 20 73 74 61 74 76 66 73 20 66 73 49 6e 66 6f  t statvfs fsInfo
21390 3b 0a 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a  ;.       .    /*
213a0 20 53 65 74 20 64 65 66 61 75 6c 74 73 20 66 6f   Set defaults fo
213b0 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20  r non-supported 
213c0 66 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20  filesystems */. 
213d0 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
213e0 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Size = SQLITE_DE
213f0 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
21400 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  E;.    pFile->de
21410 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
21420 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ics = 0;.    if(
21430 20 66 73 74 61 74 76 66 73 28 70 46 69 6c 65 2d   fstatvfs(pFile-
21440 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20  >h, &fsInfo) == 
21450 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74  -1 ) {.      ret
21460 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  urn;.    }..    
21470 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
21480 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
21490 74 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20  tmp") ) {.      
214a0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
214b0 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
214c0 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
214d0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
214e0 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
214f0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
21500 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f  OMIC4K |       /
21510 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79  * All ram filesy
21520 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20  stem writes are 
21530 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
21540 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
21550 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
21560 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
21570 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
21580 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
215b0 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
215c0 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
215d0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
215e0 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
215f0 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
21600 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
21610 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
21640 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
21650 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
21660 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
21670 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rstr(fsInfo.f_ba
21680 73 65 74 79 70 65 2c 20 22 65 74 66 73 22 29 20  setype, "etfs") 
21690 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
216a0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
216b0 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
216c0 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
216d0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
216e0 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66  =.        /* etf
216f0 73 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77  s cluster size w
21700 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
21710 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69   */.        (pFi
21720 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
21730 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
21740 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c  CAP_ATOMIC512) |
21750 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
21760 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
21770 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e  D |    /* growin
21780 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  g the file does 
21790 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a  not occur until.
217a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69        ** the wri
217d0 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20  te succeeds */. 
217e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
217f0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
21800 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
21810 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
21820 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21850 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
21860 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
21870 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
21880 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49   if( !strcmp(fsI
21890 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
218a0 22 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20  "qnx6") ){.     
218b0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
218c0 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
218d0 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
218e0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
218f0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
21900 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
21910 54 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20  TOMIC |         
21920 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65  /* All filesyste
21930 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
21940 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
21950 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
21960 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
21970 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
21980 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
21990 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
219c0 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
219d0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
219e0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
219f0 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
21a00 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
21a10 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
21a20 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
21a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a40 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
21a50 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
21a60 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
21a70 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63   }else if( !strc
21a80 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  mp(fsInfo.f_base
21a90 74 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b  type, "qnx4") ){
21aa0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
21ab0 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
21ac0 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
21ad0 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
21ae0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
21af0 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20          /* full 
21b00 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63  bitset of atomic
21b10 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f  s from max secto
21b20 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c  r size and small
21b30 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28  er */.        ((
21b40 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
21b50 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
21b60 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
21b70 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20  ) << 1) - 2 |.  
21b80 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
21b90 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
21ba0 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
21bb0 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
21bc0 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bf0 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
21c00 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
21c10 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
21c20 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66  if( strstr(fsInf
21c30 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64  o.f_basetype, "d
21c40 6f 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  os") ){.      pF
21c50 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
21c60 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
21c70 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
21c80 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
21c90 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f  tics =.        /
21ca0 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66  * full bitset of
21cb0 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61   atomics from ma
21cc0 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e  x sector size an
21cd0 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20  d smaller */.   
21ce0 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65       ((pFile->se
21cf0 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a  ctorSize / 512 *
21d00 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
21d10 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d  OMIC512) << 1) -
21d20 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c   2 |.        SQL
21d30 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
21d40 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
21d50 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
21d60 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
21d70 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
21d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d90 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
21da0 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
21db0 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
21dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
21dd0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
21de0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
21df0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
21e00 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20  P_ATOMIC512 |   
21e10 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65     /* blocks are
21e20 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
21e30 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
21e40 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
21e50 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
21e60 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
21e70 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ea0 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
21eb0 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
21ec0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
21ed0 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76  /* Last chance v
21ee0 65 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66  erification.  If
21ef0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
21f00 20 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c   isn't a multipl
21f10 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68  e of 512.  ** th
21f20 65 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69  en it isn't vali
21f30 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  d.*/.  if( pFile
21f40 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35  ->sectorSize % 5
21f50 31 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70  12 != 0 ){.    p
21f60 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
21f70 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b  acteristics = 0;
21f80 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74  .    pFile->sect
21f90 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  orSize = SQLITE_
21fa0 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
21fb0 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  IZE;.  }.}.#endi
21fc0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
21fd0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
21fe0 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
21ff0 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
22000 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
22010 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
22020 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
22030 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
22040 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
22050 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
22060 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
22070 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
22080 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
22090 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
220a0 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
220b0 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
220c0 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
220d0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
220e0 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
220f0 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
22100 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
22110 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
22120 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
22130 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
22140 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
22150 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
22160 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  ixSectorSize(sql
22170 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
22180 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20    unixFile *pFd 
22190 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
221a0 0a 20 20 73 65 74 44 65 76 69 63 65 43 68 61 72  .  setDeviceChar
221b0 61 63 74 65 72 69 73 74 69 63 73 28 70 46 64 29  acteristics(pFd)
221c0 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 64 2d 3e  ;.  return pFd->
221d0 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 0a 2f  sectorSize;.}../
221e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
221f0 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
22200 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
22210 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
22220 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74 6f  VFS is set up to
22230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
22240 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
22250 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66 61  VERWRITE by defa
22260 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ult..** However,
22270 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73 20   that choice is 
22280 63 6f 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69  controversial si
22290 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20  nce technically 
222a0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
222b0 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f  * file system do
222c0 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72  es not always pr
222d0 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65 20  ovide powersafe 
222e0 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e  overwrites.  (In
222f0 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
22300 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c   after a power-l
22310 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73  oss event, parts
22320 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68 61   of the file tha
22330 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20  t were never.** 
22340 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e  written might en
22350 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72  d up being alter
22360 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e  ed.)  However, n
22370 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72  on-PSOW behavior
22380 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72   is very,.** ver
22390 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73  y rare.  And ass
223a0 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65  erting PSOW make
223b0 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63 74  s a large reduct
223c0 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e  ion in the amoun
223d0 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64  t.** of required
223e0 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c   I/O for journal
223f0 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74  ing, since a lot
22400 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 65   of padding is e
22410 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48  liminated..**  H
22420 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45  ence, while POWE
22430 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
22440 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
22450 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69 6c  , there is a fil
22460 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61  e-control.** ava
22470 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69  ilable to turn i
22480 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75  t off and URI qu
22490 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61 76  ery parameter av
224a0 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
224b0 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  it off..*/.stati
224c0 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
224d0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
224e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
224f0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
22500 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
22510 69 64 3b 0a 20 20 73 65 74 44 65 76 69 63 65 43  id;.  setDeviceC
22520 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
22530 46 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  Fd);.  return pF
22540 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  d->deviceCharact
22550 65 72 69 73 74 69 63 73 3b 0a 7d 0a 0a 23 69 66  eristics;.}..#if
22560 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
22570 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51  _OMIT_WAL) || SQ
22580 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
22590 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ZE>0../*.** Retu
225a0 72 6e 20 74 68 65 20 73 79 73 74 65 6d 20 70 61  rn the system pa
225b0 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
225c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
225d0 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  uld not be calle
225e0 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74  d directly by ot
225f0 68 65 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73  her code in this
22600 20 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65   file. .** Inste
22610 61 64 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65  ad, it should be
22620 20 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72   called via macr
22630 6f 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28  o osGetpagesize(
22640 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
22650 20 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65   unixGetpagesize
22660 28 76 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56  (void){.#if OS_V
22670 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20  XWORKS.  return 
22680 31 30 32 34 3b 0a 23 65 6c 69 66 20 64 65 66 69  1024;.#elif defi
22690 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29  ned(_BSD_SOURCE)
226a0 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70 61 67  .  return getpag
226b0 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20  esize();.#else. 
226c0 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73   return (int)sys
226d0 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a  conf(_SC_PAGESIZ
226e0 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65  E);.#endif.}..#e
226f0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
22700 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
22710 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
22720 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
22730 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22740 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f  MIT_WAL../*.** O
22750 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
22760 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65  present an share
22770 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e  d memory buffer.
22780 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75    .**.** When mu
22790 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
227a0 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
227b0 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c   same wal-index,
227c0 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20   each thread.** 
227d0 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78  has its own unix
227e0 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  Shm object, but 
227f0 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74  they all point t
22800 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
22810 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75  nce.** of this u
22820 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
22830 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
22840 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64  ds, each wal-ind
22850 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  ex is opened.** 
22860 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72  only once per pr
22870 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  ocess..**.** Eac
22880 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  h unixShmNode ob
22890 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65  ject is connecte
228a0 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e  d to a single un
228b0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
228c0 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ct..** We could 
228d0 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62  coalesce this ob
228e0 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e  ject into unixIn
228f0 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61  odeInfo, but tha
22900 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20  t would mean.** 
22910 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20  every open file 
22920 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73  that does not us
22930 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
22940 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (in other words,
22950 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69   most.** open fi
22960 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20  les) would have 
22970 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20  to carry around 
22980 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72  this extra infor
22990 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74  mation.  So.** t
229a0 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
229b0 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
229c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
229d0 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  is unixShmNode o
229e0 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65  bject.** and the
229f0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
22a00 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 6f  ect is created o
22a10 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e  nly when needed.
22a20 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78  .**.** unixMutex
22a30 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
22a40 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  rue when creatin
22a50 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a  g or destroying.
22a60 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f  ** this object o
22a70 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  r while reading 
22a80 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  or writing the f
22a90 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
22aa0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66  .**.**      nRef
22ab0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
22ac0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
22ad0 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20  read-only after 
22ae0 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  the object is cr
22af0 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  eated:.** .**   
22b00 20 20 20 68 53 68 6d 0a 2a 2a 20 20 20 20 20 20     hShm.**      
22b10 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
22b20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f  Either unixShmNo
22b30 64 65 2e 70 53 68 6d 4d 75 74 65 78 20 6d 75 73  de.pShmMutex mus
22b40 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69  t be held or uni
22b50 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  xShmNode.nRef==0
22b60 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65   and.** unixMute
22b70 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20  xHeld() is true 
22b80 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20  when reading or 
22b90 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65  writing any othe
22ba0 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68  r field.** in th
22bb0 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  is structure..*/
22bc0 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e  .struct unixShmN
22bd0 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ode {.  unixInod
22be0 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20  eInfo *pInode;  
22bf0 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49     /* unixInodeI
22c00 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68  nfo that owns th
22c10 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20  is SHM node */. 
22c20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
22c30 70 53 68 6d 4d 75 74 65 78 3b 20 20 2f 2a 20 4d  pShmMutex;  /* M
22c40 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
22c50 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
22c60 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
22c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
22c80 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65  me of the mmappe
22c90 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
22ca0 68 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  hShm;           
22cb0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
22cc0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
22cd0 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
22ce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22cf0 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64  * Size of shared
22d00 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
22d10 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e  */.  u16 nRegion
22d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22d30 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
22d40 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75   apRegion */.  u
22d50 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20  8 isReadonly;   
22d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
22d70 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e if read-only *
22d80 2f 0a 20 20 75 38 20 69 73 55 6e 6c 6f 63 6b 65  /.  u8 isUnlocke
22d90 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
22da0 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 44 4d 53  * True if no DMS
22db0 20 6c 6f 63 6b 20 68 65 6c 64 20 2a 2f 0a 20 20   lock held */.  
22dc0 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b  char **apRegion;
22dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
22de0 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68  ray of mapped sh
22df0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
22e00 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
22e10 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
22e20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22e30 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
22e40 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
22e50 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  s */.  unixShm *
22e60 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
22e70 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d    /* All unixShm
22e80 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
22e90 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66  g to this */.#if
22ea0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
22eb0 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20  .  u8 exclMask; 
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ed0 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
22ee0 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
22ef0 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b  .  u8 sharedMask
22f00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22f10 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
22f20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
22f30 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
22f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
22f50 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69  xt available uni
22f60 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  xShm.id value */
22f70 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
22f80 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
22f90 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
22fa0 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
22fb0 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
22fc0 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
22fd0 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
22fe0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
22ff0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
23000 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  re initialized w
23010 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hen this object 
23020 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  is created and.*
23030 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  * are read-only 
23040 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a  thereafter:.**.*
23050 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 53 68  *    unixShm.pSh
23060 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 75 6e 69 78  mNode.**    unix
23070 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
23080 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
23090 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
230a0 68 65 20 75 6e 69 78 53 68 6d 2e 70 53 68 6d 4e  he unixShm.pShmN
230b0 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 20 6d  ode->pShmMutex m
230c0 75 73 74 0a 2a 2a 20 62 65 20 68 65 6c 64 20 77  ust.** be held w
230d0 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61  hile accessing a
230e0 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69  ny read/write fi
230f0 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  elds..*/.struct 
23100 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78  unixShm {.  unix
23110 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
23120 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e  e;     /* The un
23130 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d  derlying unixShm
23140 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Node object */. 
23150 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b   unixShm *pNext;
23160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23170 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68  ext unixShm with
23180 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68   the same unixSh
23190 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
231a0 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
231b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
231c0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69   holding the uni
231d0 78 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75  xShmNode->pShmMu
231e0 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20  tex */.  u8 id; 
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23200 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
23210 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
23220 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e  hin its unixShmN
23230 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61  ode */.  u16 sha
23240 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
23250 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
23260 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
23270 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61   */.  u16 exclMa
23280 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
23290 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
232a0 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
232b0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
232c0 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72  nstants used for
232d0 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66   locking.*/.#def
232e0 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53  ine UNIX_SHM_BAS
232f0 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f  E   ((22+SQLITE_
23300 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20  SHM_NLOCK)*4)   
23310 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
23320 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
23330 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  ine UNIX_SHM_DMS
23340 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41      (UNIX_SHM_BA
23350 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
23360 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
23370 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
23380 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64  * Apply posix ad
23390 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
233a0 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20   all bytes from 
233b0 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73  ofst through ofs
233c0 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63  t+n-1..**.** Loc
233d0 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20  ks block if the 
233e0 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20  mask is exactly 
233f0 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61  UNIX_SHM_C and a
23400 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a  re non-blocking.
23410 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
23420 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
23430 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
23440 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
23450 2c 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  ,       /* Open 
23460 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
23470 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20  e WAL file */.  
23480 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
23490 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43         /* F_UNLC
234a0 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46  K, F_RDLCK, or F
234b0 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20  _WRLCK */.  int 
234c0 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
234d0 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
234e0 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
234f0 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  range */.  int n
23500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23510 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
23520 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
23530 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ){.  unixShmNode
23540 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41   *pShmNode; /* A
23550 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68  pply locks to th
23560 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d  is open shared-m
23570 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f  emory segment */
23580 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
23590 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  f;        /* The
235a0 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
235b0 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
235c0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
235d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a  SQLITE_OK;    /*
235e0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   Result code for
235f0 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20  m fcntl() */..  
23600 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
23610 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
23620 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
23630 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
23640 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  */.  pShmNode = 
23650 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
23660 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72  ShmNode;.  asser
23670 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
23680 66 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  f==0 || sqlite3_
23690 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e  mutex_held(pShmN
236a0 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 29 20  ode->pShmMutex) 
236b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
236c0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 7c 7c  mNode->nRef>0 ||
236d0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
236e0 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64   );..  /* Shared
236f0 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61   locks never spa
23700 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  n more than one 
23710 62 79 74 65 20 2a 2f 0a 20 20 2f 2a 20 61 73 73  byte */.  /* ass
23720 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63  ert( n==1 || loc
23730 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29  kType!=F_RDLCK )
23740 3b 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73  ; */..  /* Locks
23750 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
23760 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
23770 3e 3d 31 20 26 26 20 6e 3c 3d 53 51 4c 49 54 45  >=1 && n<=SQLITE
23780 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  _SHM_NLOCK );.. 
23790 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
237a0 53 68 6d 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Shm>=0 ){.    /*
237b0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
237c0 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
237d0 72 73 20 2a 2f 0a 20 20 20 20 66 2e 6c 5f 74 79  rs */.    f.l_ty
237e0 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20  pe = lockType;. 
237f0 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20     f.l_whence = 
23800 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e  SEEK_SET;.    f.
23810 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a  l_start = ofst;.
23820 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b      f.l_len = n;
23830 0a 20 20 20 20 72 63 20 3d 20 6f 73 53 65 74 50  .    rc = osSetP
23840 6f 73 69 78 41 64 76 69 73 6f 72 79 4c 6f 63 6b  osixAdvisoryLock
23850 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 2c  (pShmNode->hShm,
23860 20 26 66 2c 20 70 46 69 6c 65 29 3b 0a 20 20 20   &f, pFile);.   
23870 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29   rc = (rc!=(-1))
23880 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
23890 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
238a0 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
238b0 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61   global lock sta
238c0 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20  te and do debug 
238d0 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65  tracing */.#ifde
238e0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
238f0 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f   { u16 mask;.  O
23900 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
23910 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20  K "));.  mask = 
23920 6f 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66  ofst>31 ? 0xffff
23930 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   : (1<<(ofst+n))
23940 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
23950 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23960 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
23970 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
23980 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
23990 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ("unlock %d ok",
239a0 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
239b0 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
239c0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
239d0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
239e0 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
239f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
23a00 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
23a10 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
23a20 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64  E(("read-lock %d
23a30 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
23a40 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
23a50 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
23a60 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
23a70 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
23a80 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ask;.    }else{.
23a90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
23aa0 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
23ab0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
23ac0 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
23ad0 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
23ae0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
23af0 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
23b00 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
23b10 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
23b20 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
23b30 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  se{.    if( lock
23b40 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
23b50 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
23b60 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  "unlock %d faile
23b70 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
23b80 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
23b90 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
23ba0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
23bb0 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22  ead-lock failed"
23bc0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
23bd0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
23be0 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
23bf0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
23c00 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
23c10 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
23c20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
23c30 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77  RACE((" - afterw
23c40 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e  ards %03x,%03x\n
23c50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ",.           pS
23c60 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
23c70 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78  sk, pShmNode->ex
23c80 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65  clMask));.  }.#e
23c90 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
23ca0 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a  c;        .}../*
23cb0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
23cc0 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  inimum number of
23cd0 20 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e   32KB shm region
23ce0 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
23cf0 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20   mapped at.** a 
23d00 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  time, assuming t
23d10 68 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67  hat each mapping
23d20 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65   must be an inte
23d30 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  ger multiple of 
23d40 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73  the.** current s
23d50 79 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e  ystem page-size.
23d60 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20  .**.** Usually, 
23d70 74 68 69 73 20 69 73 20 31 2e 20 54 68 65 20 65  this is 1. The e
23d80 78 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74  xception seems t
23d90 6f 20 62 65 20 73 79 73 74 65 6d 73 20 74 68 61  o be systems tha
23da0 74 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64  t are configured
23db0 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20  .** to use 64KB 
23dc0 70 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20  pages - in this 
23dd0 63 61 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e  case each mappin
23de0 67 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20  g must cover at 
23df0 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d  least two.** shm
23e00 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61   regions..*/.sta
23e10 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52  tic int unixShmR
23e20 65 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64  egionPerMap(void
23e30 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d  ){.  int shmsz =
23e40 20 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20   32*1024;       
23e50 20 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69       /* SHM regi
23e60 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  on size */.  int
23e70 20 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67   pgsz = osGetpag
23e80 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79  esize();   /* Sy
23e90 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a  stem page size *
23ea0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 67  /.  assert( ((pg
23eb0 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29  sz-1)&pgsz)==0 )
23ec0 3b 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65  ;   /* Page size
23ed0 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
23ee0 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70   of 2 */.  if( p
23ef0 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75  gsz<shmsz ) retu
23f00 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  rn 1;.  return p
23f10 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a  gsz/shmsz;.}../*
23f20 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e  .** Purge the un
23f30 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  ixShmNodeList li
23f40 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
23f50 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f  s with unixShmNo
23f60 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
23f70 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
23f80 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
23f90 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
23fa0 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
23fb0 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
23fc0 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
23fd0 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
23fe0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
23ff0 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20  mPurge(unixFile 
24000 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d  *pFd){.  unixShm
24010 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70  Node *p = pFd->p
24020 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
24030 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
24040 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
24050 69 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28  if( p && ALWAYS(
24060 70 2d 3e 6e 52 65 66 3d 3d 30 29 20 29 7b 0a 20  p->nRef==0) ){. 
24070 20 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61     int nShmPerMa
24080 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f  p = unixShmRegio
24090 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69  nPerMap();.    i
240a0 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74  nt i;.    assert
240b0 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64  ( p->pInode==pFd
240c0 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ->pInode );.    
240d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
240e0 65 65 28 70 2d 3e 70 53 68 6d 4d 75 74 65 78 29  ee(p->pShmMutex)
240f0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
24100 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d  <p->nRegion; i+=
24110 6e 53 68 6d 50 65 72 4d 61 70 29 7b 0a 20 20 20  nShmPerMap){.   
24120 20 20 20 69 66 28 20 70 2d 3e 68 53 68 6d 3e 3d     if( p->hShm>=
24130 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d  0 ){.        osM
24140 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f  unmap(p->apRegio
24150 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f  n[i], p->szRegio
24160 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
24170 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24180 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
24190 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n[i]);.      }. 
241a0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
241b0 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
241c0 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68  n);.    if( p->h
241d0 53 68 6d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Shm>=0 ){.      
241e0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64  robust_close(pFd
241f0 2c 20 70 2d 3e 68 53 68 6d 2c 20 5f 5f 4c 49 4e  , p->hShm, __LIN
24200 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68  E__);.      p->h
24210 53 68 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  Shm = -1;.    }.
24220 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70      p->pInode->p
24230 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ShmNode = 0;.   
24240 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
24250 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
24260 68 65 20 44 4d 53 20 6c 6f 63 6b 20 68 61 73 20  he DMS lock has 
24270 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 74 61 6b  not yet been tak
24280 65 6e 20 6f 6e 20 73 68 6d 20 66 69 6c 65 20 70  en on shm file p
24290 53 68 6d 4e 6f 64 65 2e 20 41 74 74 65 6d 70 74  ShmNode. Attempt
242a0 20 74 6f 0a 2a 2a 20 74 61 6b 65 20 69 74 20 6e   to.** take it n
242b0 6f 77 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ow. Return SQLIT
242c0 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
242d0 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
242e0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f   error.** code o
242f0 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
24300 49 66 20 74 68 65 20 44 4d 53 20 63 61 6e 6e 6f  If the DMS canno
24310 74 20 62 65 20 6c 6f 63 6b 65 64 20 62 65 63 61  t be locked beca
24320 75 73 65 20 74 68 69 73 20 69 73 20 61 20 72 65  use this is a re
24330 61 64 6f 6e 6c 79 5f 73 68 6d 3d 31 20 0a 2a 2a  adonly_shm=1 .**
24340 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20   connection and 
24350 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
24360 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
24370 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 0a 2a 2a   lock, return.**
24380 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
24390 5f 43 41 4e 54 49 4e 49 54 20 61 6e 64 20 73 65  _CANTINIT and se
243a0 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e  t pShmNode->isUn
243b0 6c 6f 63 6b 65 64 3d 31 2e 0a 2a 2f 0a 73 74 61  locked=1..*/.sta
243c0 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b  tic int unixLock
243d0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
243e0 78 46 69 6c 65 20 2a 70 44 62 46 64 2c 20 75 6e  xFile *pDbFd, un
243f0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
24400 6f 64 65 29 7b 0a 20 20 73 74 72 75 63 74 20 66  ode){.  struct f
24410 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
24420 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24430 0a 0a 20 20 2f 2a 20 55 73 65 20 46 5f 47 45 54  ..  /* Use F_GET
24440 4c 4b 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  LK to determine 
24450 74 68 65 20 6c 6f 63 6b 73 20 6f 74 68 65 72 20  the locks other 
24460 70 72 6f 63 65 73 73 65 73 20 61 72 65 20 68 6f  processes are ho
24470 6c 64 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20 74 68  lding.  ** on th
24480 65 20 44 4d 53 20 62 79 74 65 2e 20 49 66 20 69  e DMS byte. If i
24490 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
244a0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
244b0 20 69 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a   is holding.  **
244c0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
244d0 74 68 65 6e 20 74 68 69 73 20 70 72 6f 63 65 73  then this proces
244e0 73 20 6d 61 79 20 61 6c 73 6f 20 74 61 6b 65 20  s may also take 
244f0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20  a SHARED lock.  
24500 2a 2a 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ** and proceed w
24510 69 74 68 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ith opening the 
24520 2a 2d 73 68 6d 20 66 69 6c 65 2e 20 0a 20 20 2a  *-shm file. .  *
24530 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 6e 6f  *.  ** Or, if no
24540 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
24550 73 20 68 6f 6c 64 69 6e 67 20 61 6e 79 20 6c 6f  s holding any lo
24560 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 70 72  ck, then this pr
24570 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 74 68  ocess.  ** is th
24580 65 20 66 69 72 73 74 20 74 6f 20 6f 70 65 6e 20  e first to open 
24590 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  it. In this case
245a0 20 74 61 6b 65 20 61 6e 20 45 58 43 4c 55 53 49   take an EXCLUSI
245b0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
245c0 20 2a 2a 20 44 4d 53 20 62 79 74 65 20 61 6e 64   ** DMS byte and
245d0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 2a 2d   truncate the *-
245e0 73 68 6d 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  shm file to zero
245f0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
24600 54 68 65 6e 0a 20 20 2a 2a 20 64 6f 77 6e 67 72  Then.  ** downgr
24610 61 64 65 20 74 6f 20 61 20 53 48 41 52 45 44 20  ade to a SHARED 
24620 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 44 4d 53 20  lock on the DMS 
24630 62 79 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  byte..  **.  ** 
24640 49 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  If another proce
24650 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  ss is holding an
24660 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
24670 6f 6e 20 74 68 65 20 44 4d 53 20 62 79 74 65 2c  on the DMS byte,
24680 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
24690 49 54 45 5f 42 55 53 59 20 74 6f 20 74 68 65 20  ITE_BUSY to the 
246a0 63 61 6c 6c 65 72 20 28 69 74 20 77 69 6c 6c 20  caller (it will 
246b0 74 72 79 20 61 67 61 69 6e 29 2e 20 41 6e 20 65  try again). An e
246c0 61 72 6c 69 65 72 0a 20 20 2a 2a 20 76 65 72 73  arlier.  ** vers
246d0 69 6f 6e 20 6f 66 20 74 68 69 73 20 63 6f 64 65  ion of this code
246e0 20 61 74 74 65 6d 70 74 65 64 20 74 68 65 20 53   attempted the S
246f0 48 41 52 45 44 20 6c 6f 63 6b 20 61 74 20 74 68  HARED lock at th
24700 69 73 20 70 6f 69 6e 74 2e 20 42 75 74 0a 20 20  is point. But.  
24710 2a 2a 20 74 68 69 73 20 69 6e 74 72 6f 64 75 63  ** this introduc
24720 65 64 20 61 20 73 75 62 74 6c 65 20 72 61 63 65  ed a subtle race
24730 20 63 6f 6e 64 69 74 69 6f 6e 3a 20 69 66 20 74   condition: if t
24740 68 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 69  he process holdi
24750 6e 67 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  ng.  ** EXCLUSIV
24760 45 20 66 61 69 6c 65 64 20 6a 75 73 74 20 62 65  E failed just be
24770 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 20  fore truncating 
24780 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 2c 20  the *-shm file, 
24790 74 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 70  then this.  ** p
247a0 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
247b0 6e 20 61 6e 64 20 75 73 65 20 74 68 65 20 2a 2d  n and use the *-
247c0 73 68 6d 20 66 69 6c 65 20 77 69 74 68 6f 75 74  shm file without
247d0 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a   truncating it..
247e0 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20    ** And if the 
247f0 2a 2d 73 68 6d 20 66 69 6c 65 20 68 61 73 20 62  *-shm file has b
24800 65 65 6e 20 63 6f 72 72 75 70 74 65 64 20 62 79  een corrupted by
24810 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
24820 20 6f 72 0a 20 20 2a 2a 20 73 79 73 74 65 6d 20   or.  ** system 
24830 63 72 61 73 68 2c 20 74 68 65 20 64 61 74 61 62  crash, the datab
24840 61 73 65 20 69 74 73 65 6c 66 20 6d 61 79 20 61  ase itself may a
24850 6c 73 6f 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  lso become corru
24860 70 74 2e 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  pt.  */.  lock.l
24870 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
24880 45 54 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ET;.  lock.l_sta
24890 72 74 20 3d 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  rt = UNIX_SHM_DM
248a0 53 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  S;.  lock.l_len 
248b0 3d 20 31 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 74 79  = 1;.  lock.l_ty
248c0 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
248d0 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d  if( osFcntl(pShm
248e0 4e 6f 64 65 2d 3e 68 53 68 6d 2c 20 46 5f 47 45  Node->hShm, F_GE
248f0 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29  TLK, &lock)!=0 )
24900 20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49   {.    rc = SQLI
24910 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
24920 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e   }else if( lock.
24930 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
24940 29 7b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  ){.    if( pShmN
24950 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
24960 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  ){.      pShmNod
24970 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d 20  e->isUnlocked = 
24980 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  1;.      rc = SQ
24990 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
249a0 4e 54 49 4e 49 54 3b 0a 20 20 20 20 7d 65 6c 73  NTINIT;.    }els
249b0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  e{.      rc = un
249c0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
249d0 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20  pDbFd, F_WRLCK, 
249e0 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29  UNIX_SHM_DMS, 1)
249f0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ;.      /* The f
24a00 69 72 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  irst connection 
24a10 74 6f 20 61 74 74 61 63 68 20 6d 75 73 74 20 74  to attach must t
24a20 72 75 6e 63 61 74 65 20 74 68 65 20 2d 73 68 6d  runcate the -shm
24a30 20 66 69 6c 65 2e 20 20 57 65 0a 20 20 20 20 20   file.  We.     
24a40 20 2a 2a 20 74 72 75 6e 63 61 74 65 20 74 6f 20   ** truncate to 
24a50 33 20 62 79 74 65 73 20 28 61 6e 20 61 72 62 69  3 bytes (an arbi
24a60 74 72 61 72 79 20 73 6d 61 6c 6c 20 6e 75 6d 62  trary small numb
24a70 65 72 2c 20 6c 65 73 73 20 74 68 61 6e 20 74 68  er, less than th
24a80 65 0a 20 20 20 20 20 20 2a 2a 20 2d 73 68 6d 20  e.      ** -shm 
24a90 68 65 61 64 65 72 20 73 69 7a 65 29 20 72 61 74  header size) rat
24aa0 68 65 72 20 74 68 61 6e 20 30 20 61 73 20 61 20  her than 0 as a 
24ab0 73 79 73 74 65 6d 20 64 65 62 75 67 67 69 6e 67  system debugging
24ac0 20 61 69 64 2c 20 74 6f 0a 20 20 20 20 20 20 2a   aid, to.      *
24ad0 2a 20 68 65 6c 70 20 64 65 74 65 63 74 20 69 66  * help detect if
24ae0 20 61 20 2d 73 68 6d 20 66 69 6c 65 20 74 72 75   a -shm file tru
24af0 6e 63 61 74 69 6f 6e 20 69 73 20 6c 65 67 69 74  ncation is legit
24b00 69 6d 61 74 65 20 6f 72 20 69 73 20 74 68 65 20  imate or is the 
24b10 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 6f 72  work.      ** or
24b20 20 61 20 72 6f 67 75 65 20 70 72 6f 63 65 73 73   a rogue process
24b30 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72  . */.      if( r
24b40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24b50 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
24b60 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 2c  (pShmNode->hShm,
24b70 20 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72   3) ){.        r
24b80 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
24b90 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
24ba0 4d 4f 50 45 4e 2c 22 66 74 72 75 6e 63 61 74 65  MOPEN,"ftruncate
24bb0 22 2c 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  ",pShmNode->zFil
24bc0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  ename);.      }.
24bd0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
24be0 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46  ( lock.l_type==F
24bf0 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63  _WRLCK ){.    rc
24c00 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
24c10 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
24c20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24c30 61 73 73 65 72 74 28 20 6c 6f 63 6b 2e 6c 5f 74  assert( lock.l_t
24c40 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 7c 7c 20  ype==F_UNLCK || 
24c50 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52  lock.l_type==F_R
24c60 44 4c 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  DLCK );.    rc =
24c70 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
24c80 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43  ck(pDbFd, F_RDLC
24c90 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c  K, UNIX_SHM_DMS,
24ca0 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
24cb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
24cc0 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  pen a shared-mem
24cd0 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61  ory area associa
24ce0 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61  ted with open da
24cf0 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
24d00 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72  d.  .** This par
24d10 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e  ticular implemen
24d20 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70  tation uses mmap
24d30 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ped files..**.**
24d40 20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74   The file used t
24d50 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72  o implement shar
24d60 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20  ed-memory is in 
24d70 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
24d80 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65  ry.** as the ope
24d90 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
24da0 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65  and has the same
24db0 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65   name as the ope
24dc0 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  n database.** fi
24dd0 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68  le with the "-sh
24de0 6d 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e  m" suffix added.
24df0 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
24e00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
24e10 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65  ile.** is "/home
24e20 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
24e30 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20  " then the file 
24e40 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
24e50 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66  and mmapped.** f
24e60 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  or shared memory
24e70 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
24e80 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e  "/home/user1/con
24e90 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a  fig.db-shm".  .*
24ea0 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70  *.** Another app
24eb0 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75  roach to is to u
24ec0 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76  se files in /dev
24ed0 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70  /shm or /dev/tmp
24ee0 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f   or an.** some o
24ef0 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74  ther tmpfs mount
24f00 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20  . But if a file 
24f10 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64  in a different d
24f20 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d  irectory.** from
24f30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24f40 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
24f50 20 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73   differing acces
24f60 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a  s permissions.**
24f70 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d   or a chroot() m
24f80 69 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64  ight cause two d
24f90 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73  ifferent process
24fa0 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  es on the same.*
24fb0 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e  * database to en
24fc0 64 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65  d up using diffe
24fd0 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73  rent files for s
24fe0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a  hared memory - .
24ff0 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  ** meaning that 
25000 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75  their memory wou
25010 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  ld not really be
25020 20 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74   shared - result
25030 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61  ing.** in databa
25040 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
25050 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68  Nevertheless, th
25060 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73  is tmpfs file us
25070 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e  age.** can be en
25080 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
25090 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51  -time using -DSQ
250a0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
250b0 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a  RY="/dev/shm".**
250c0 20 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65   or the equivale
250d0 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  nt.  The use of 
250e0 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  the SQLITE_SHM_D
250f0 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
25100 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20  -time.** option 
25110 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e  results in an in
25120 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64  compatible build
25130 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69   of SQLite;  bui
25140 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a  lds of SQLite.**
25150 20 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65   that with diffe
25160 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f  ring SQLITE_SHM_
25170 44 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e  DIRECTORY settin
25180 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  gs attempt to us
25190 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61  e the.** same da
251a0 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
251b0 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61  he same time, da
251c0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
251d0 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  n will likely.**
251e0 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c   result. The SQL
251f0 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
25200 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  Y compile-time o
25210 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65  ption is conside
25220 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72  red.** "unsuppor
25230 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20  ted" and may go 
25240 61 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65  away in a future
25250 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e   SQLite release.
25260 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e  .**.** When open
25270 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64  ing a new shared
25280 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66  -memory file, if
25290 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e   no other instan
252a0 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66  ces of that.** f
252b0 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ile are currentl
252c0 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20  y open, in this 
252d0 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74  process or in ot
252e0 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74  her processes, t
252f0 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  hen.** the file 
25300 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65  must be truncate
25310 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  d to zero length
25320 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61   or have its hea
25330 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a  der cleared..**.
25340 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  ** If the origin
25350 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
25360 20 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e   (pDbFd) is usin
25370 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c  g the "unix-excl
25380 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65  " VFS.** that me
25390 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c  ans that an excl
253a0 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65  usive lock is he
253b0 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
253c0 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74  se file and.** t
253d0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
253e0 63 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20  cesses are able 
253f0 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
25400 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
25410 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c  In.** that case,
25420 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c   we do not reall
25430 79 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65  y need shared me
25440 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64  mory.  No shared
25450 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20   memory.** file 
25460 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
25470 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
25480 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64  ill be simulated
25490 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72   with heap memor
254a0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
254b0 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
254c0 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a  emory(unixFile *
254d0 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74  pDbFd){.  struct
254e0 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b   unixShm *p = 0;
254f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25500 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
25510 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
25520 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
25530 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a   *pShmNode;   /*
25540 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
25550 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
25560 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25570 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
25580 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
25590 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
255a0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
255b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f        /* The ino
255c0 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68  de of fd */.  ch
255d0 61 72 20 2a 7a 53 68 6d 3b 20 20 20 20 20 20 20  ar *zShm;       
255e0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
255f0 20 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66   the file used f
25600 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20  or SHM */.  int 
25610 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20  nShmFilename;   
25620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25630 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66  ize of the SHM f
25640 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73  ilename in bytes
25650 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
25660 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
25670 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a   new unixShm obj
25680 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71  ect. */.  p = sq
25690 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
256a0 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
256b0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
256c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
256d0 4b 50 54 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  KPT;.  memset(p,
256e0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
256f0 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
25700 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20  ->pShm==0 );..  
25710 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
25720 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65  if a unixShmNode
25730 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20   object already 
25740 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e  exists. Reuse an
25750 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f   existing.  ** o
25760 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43  ne if present. C
25770 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
25780 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
25790 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  */.  assert( uni
257a0 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c  xFileMutexNothel
257b0 64 28 70 44 62 46 64 29 20 29 3b 0a 20 20 75 6e  d(pDbFd) );.  un
257c0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
257d0 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64    pInode = pDbFd
257e0 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d  ->pInode;.  pShm
257f0 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Node = pInode->p
25800 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70  ShmNode;.  if( p
25810 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
25820 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
25830 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
25840 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20       /* fstat() 
25850 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73  info for databas
25860 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65  e file */.#ifnde
25870 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
25880 45 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74  ECTORY.    const
25890 20 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68   char *zBasePath
258a0 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b   = pDbFd->zPath;
258b0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
258c0 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20  Call fstat() to 
258d0 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70  figure out the p
258e0 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68  ermissions on th
258f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
25900 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77   If.    ** a new
25910 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63   *-shm file is c
25920 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d  reated, an attem
25930 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20  pt will be made 
25940 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20  to create it.   
25950 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d   ** with the sam
25960 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20  e permissions.. 
25970 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73     */.    if( os
25980 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20  Fstat(pDbFd->h, 
25990 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
259a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
259b0 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20  RR_FSTAT;.      
259c0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
259d0 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  r;.    }..#ifdef
259e0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
259f0 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69  CTORY.    nShmFi
25a00 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28  lename = sizeof(
25a10 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
25a20 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73  TORY) + 31;.#els
25a30 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61  e.    nShmFilena
25a40 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74  me = 6 + (int)st
25a50 72 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29 3b  rlen(zBasePath);
25a60 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
25a70 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Node = sqlite3_m
25a80 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
25a90 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68  *pShmNode) + nSh
25aa0 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20  mFilename );.   
25ab0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
25ac0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
25ad0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
25ae0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
25af0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
25b00 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d  .    memset(pShm
25b10 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Node, 0, sizeof(
25b20 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46  *pShmNode)+nShmF
25b30 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53  ilename);.    zS
25b40 68 6d 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  hm = pShmNode->z
25b50 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
25b60 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a  *)&pShmNode[1];.
25b70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
25b80 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
25b90 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
25ba0 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
25bb0 53 68 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Shm, .          
25bc0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
25bd0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
25be0 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d  "/sqlite-shm-%x-
25bf0 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %x",.           
25c00 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73            (u32)s
25c10 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33  Stat.st_ino, (u3
25c20 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b  2)sStat.st_dev);
25c30 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74  .#else.    sqlit
25c40 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d  e3_snprintf(nShm
25c50 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 2c 20  Filename, zShm, 
25c60 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50  "%s-shm", zBaseP
25c70 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
25c80 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
25c90 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 29  Fd->zPath, zShm)
25ca0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68  ;.#endif.    pSh
25cb0 6d 4e 6f 64 65 2d 3e 68 53 68 6d 20 3d 20 2d 31  mNode->hShm = -1
25cc0 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e  ;.    pDbFd->pIn
25cd0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20  ode->pShmNode = 
25ce0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53  pShmNode;.    pS
25cf0 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d  hmNode->pInode =
25d00 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
25d10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
25d20 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
25d30 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
25d40 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75  pShmNode->pShmMu
25d50 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
25d60 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
25d70 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
25d80 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
25d90 2d 3e 70 53 68 6d 4d 75 74 65 78 3d 3d 30 20 29  ->pShmMutex==0 )
25da0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
25db0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
25dc0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
25dd0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
25de0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
25df0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  if( pInode->bPro
25e00 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  cessLock==0 ){. 
25e10 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
25e20 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
25e30 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72  pDbFd->zPath, "r
25e40 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29  eadonly_shm", 0)
25e50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d   ){.        pShm
25e60 4e 6f 64 65 2d 3e 68 53 68 6d 20 3d 20 72 6f 62  Node->hShm = rob
25e70 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f  ust_open(zShm, O
25e80 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 28 73  _RDWR|O_CREAT,(s
25e90 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37  Stat.st_mode&077
25ea0 37 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  7));.      }.   
25eb0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
25ec0 3e 68 53 68 6d 3c 30 20 29 7b 0a 20 20 20 20 20  >hShm<0 ){.     
25ed0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68     pShmNode->hSh
25ee0 6d 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  m = robust_open(
25ef0 7a 53 68 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20  zShm, O_RDONLY, 
25f00 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30  (sStat.st_mode&0
25f10 37 37 37 29 29 3b 0a 20 20 20 20 20 20 20 20 69  777));.        i
25f20 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68  f( pShmNode->hSh
25f30 6d 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  m<0 ){.         
25f40 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
25f50 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
25f60 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c  EN_BKPT, "open",
25f70 20 7a 53 68 6d 29 3b 0a 20 20 20 20 20 20 20 20   zShm);.        
25f80 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
25f90 65 72 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  err;.        }. 
25fa0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
25fb0 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b  >isReadonly = 1;
25fc0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
25fd0 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65  /* If this proce
25fe0 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73  ss is running as
25ff0 20 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65   root, make sure
26000 20 74 68 61 74 20 74 68 65 20 53 48 4d 20 66 69   that the SHM fi
26010 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6f  le.      ** is o
26020 77 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  wned by the same
26030 20 75 73 65 72 20 74 68 61 74 20 6f 77 6e 73 20   user that owns 
26040 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
26050 61 62 61 73 65 2e 20 20 4f 74 68 65 72 77 69 73  abase.  Otherwis
26060 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e,.      ** the 
26070 6f 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77  original owner w
26080 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
26090 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20  to connect..    
260a0 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73    */.      robus
260b0 74 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65  tFchown(pShmNode
260c0 2d 3e 68 53 68 6d 2c 20 73 53 74 61 74 2e 73 74  ->hShm, sStat.st
260d0 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f 67  _uid, sStat.st_g
260e0 69 64 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  id);..      rc =
260f0 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64 4d   unixLockSharedM
26100 65 6d 6f 72 79 28 70 44 62 46 64 2c 20 70 53 68  emory(pDbFd, pSh
26110 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66  mNode);.      if
26120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26130 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 45  && rc!=SQLITE_RE
26140 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 20  ADONLY_CANTINIT 
26150 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f  ) goto shm_open_
26160 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  err;.    }.  }..
26170 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65    /* Make the ne
26180 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63  w connection a c
26190 68 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78  hild of the unix
261a0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
261b0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
261c0 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ode;.#ifdef SQLI
261d0 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64  TE_DEBUG.  p->id
261e0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
261f0 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
26200 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
26210 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
26220 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65  hm = p;.  unixLe
26230 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  aveMutex();..  /
26240 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20  * The reference 
26250 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64  count on pShmNod
26260 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
26270 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75  en incremented u
26280 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f  nder.  ** the co
26290 76 65 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45  ver of the unixE
262a0 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65  nterMutex() mute
262b0 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65  x and the pointe
262c0 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  r from the.  ** 
262d0 6e 65 77 20 28 73 74 72 75 63 74 20 75 6e 69 78  new (struct unix
262e0 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74  Shm) object to t
262f0 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  he pShmNode has 
26300 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68  been set. All th
26310 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20  at is.  ** left 
26320 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b  to do is to link
26330 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
26340 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
26350 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20  list starting.  
26360 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e  ** at pShmNode->
26370 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73  pFirst. This mus
26380 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20  t be done while 
26390 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a  holding the.  **
263a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d   pShmNode->pShmM
263b0 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  utex..  */.  sql
263c0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
263d0 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d  (pShmNode->pShmM
263e0 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78  utex);.  p->pNex
263f0 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  t = pShmNode->pF
26400 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  irst;.  pShmNode
26410 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20  ->pFirst = p;.  
26420 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
26430 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53  ave(pShmNode->pS
26440 68 6d 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  hmMutex);.  retu
26450 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  rn rc;..  /* Jum
26460 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72  p here on any er
26470 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f  ror */.shm_open_
26480 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75  err:.  unixShmPu
26490 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20  rge(pDbFd);     
264a0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
264b0 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
264c0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
264d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
264e0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
264f0 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
26500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
26510 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
26520 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
26530 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
26540 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
26550 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
26560 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
26570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26580 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
26590 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
265a0 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
265b0 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
265c0 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
265d0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
265e0 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
265f0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
26600 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
26610 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
26620 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
26630 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
26640 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
26650 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62  erwise, if the b
26660 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72  Extend parameter
26670 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
26680 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
26690 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
266a0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
266b0 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
266c0 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
266d0 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
266e0 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
266f0 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
26700 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
26710 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
26720 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62  turned. If .** b
26730 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65  Extend is non-ze
26740 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
26750 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
26760 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
26770 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
26780 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
26790 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
267a0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
267b0 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
267c0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
267d0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
267e0 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
267f0 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
26800 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
26810 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
26820 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
26830 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
26840 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
26850 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
26860 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
26870 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
26880 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
26890 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
268a0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
268b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
268c0 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71  unixShmMap(.  sq
268d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
268e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
268f0 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
26900 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
26910 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
26920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26930 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
26940 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
26950 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
26960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26970 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
26980 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e   */.  int bExten
26990 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
269a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
269b0 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
269c0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
269d0 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
269e0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
269f0 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
26a00 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  mory */.){.  uni
26a10 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
26a20 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
26a30 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e  unixShm *p;.  un
26a40 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
26a50 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
26a60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
26a70 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e   nShmPerMap = un
26a80 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61  ixShmRegionPerMa
26a90 70 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52  p();.  int nReqR
26aa0 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  egion;..  /* If 
26ab0 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
26ac0 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  y file has not y
26ad0 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
26ae0 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a  open it now. */.
26af0 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68    if( pDbFd->pSh
26b00 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  m==0 ){.    rc =
26b10 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
26b20 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20  emory(pDbFd);.  
26b30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26b40 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
26b50 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46  .  }..  p = pDbF
26b60 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e  d->pShm;.  pShmN
26b70 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
26b80 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  e;.  sqlite3_mut
26b90 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
26ba0 65 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a 20  e->pShmMutex);. 
26bb0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69   if( pShmNode->i
26bc0 73 55 6e 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20  sUnlocked ){.   
26bd0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 53 68   rc = unixLockSh
26be0 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
26bf0 2c 20 70 53 68 6d 4e 6f 64 65 29 3b 0a 20 20 20  , pShmNode);.   
26c00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26c10 4f 4b 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  OK ) goto shmpag
26c20 65 5f 6f 75 74 3b 0a 20 20 20 20 70 53 68 6d 4e  e_out;.    pShmN
26c30 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20  ode->isUnlocked 
26c40 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
26c50 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68  t( szRegion==pSh
26c60 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
26c70 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
26c80 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  gion==0 );.  ass
26c90 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
26ca0 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
26cb0 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
26cc0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d  ( pShmNode->hShm
26cd0 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
26ce0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
26cf0 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
26d00 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68  t( pShmNode->hSh
26d10 6d 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  m<0 || pDbFd->pI
26d20 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
26d30 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ck==0 );..  /* M
26d40 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  inimum number of
26d50 20 72 65 67 69 6f 6e 73 20 72 65 71 75 69 72 65   regions require
26d60 64 20 74 6f 20 62 65 20 6d 61 70 70 65 64 2e 20  d to be mapped. 
26d70 2a 2f 0a 20 20 6e 52 65 71 52 65 67 69 6f 6e 20  */.  nReqRegion 
26d80 3d 20 28 28 69 52 65 67 69 6f 6e 2b 6e 53 68 6d  = ((iRegion+nShm
26d90 50 65 72 4d 61 70 29 20 2f 20 6e 53 68 6d 50 65  PerMap) / nShmPe
26da0 72 4d 61 70 29 20 2a 20 6e 53 68 6d 50 65 72 4d  rMap) * nShmPerM
26db0 61 70 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e  ap;..  if( pShmN
26dc0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65  ode->nRegion<nRe
26dd0 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63  qRegion ){.    c
26de0 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20  har **apNew;    
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e00 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f    /* New apRegio
26e10 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
26e20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 52 65   int nByte = nRe
26e30 71 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e  qRegion*szRegion
26e40 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  ;   /* Minimum r
26e50 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
26e60 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
26e70 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
26e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
26e90 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20 2a  sed by fstat() *
26ea0 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  /..    pShmNode-
26eb0 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65  >szRegion = szRe
26ec0 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70  gion;..    if( p
26ed0 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30  ShmNode->hShm>=0
26ee0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
26ef0 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
26f00 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
26f10 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
26f20 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
26f30 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63  e..      ** Chec
26f40 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68  k to see if it h
26f50 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
26f60 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77  d (i.e. if the w
26f70 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73  al-index file is
26f80 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20  .      ** large 
26f90 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69  enough to contai
26fa0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
26fb0 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a  region)..      *
26fc0 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  /.      if( osFs
26fd0 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 53  tat(pShmNode->hS
26fe0 68 6d 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  hm, &sStat) ){. 
26ff0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27000 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
27010 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
27020 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
27030 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
27040 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e   sStat.st_size<n
27050 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
27060 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
27070 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
27080 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
27090 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74  f bExtend is set
270a0 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   to.        ** f
270b0 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
270c0 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
270d0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
270e0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
270f0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
27100 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
27110 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  d ){.          g
27120 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
27130 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
27140 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
27150 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
27160 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64   is true, extend
27170 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68   the file. Do th
27180 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  is by.        **
27190 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
271a0 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e  e byte to the en
271b0 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70  d of each (OS) p
271c0 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20  age being.      
271d0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f    ** allocated o
271e0 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68  r extended. Tech
271f0 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64  nically, we need
27200 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74   only write to t
27210 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61  he.        ** la
27220 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  st page in order
27230 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66   to extend the f
27240 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67  ile. But writing
27250 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20   to all new.    
27260 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72      ** pages for
27270 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c  ces the OS to al
27280 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65  locate them imme
27290 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72  diately, which r
272a0 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a  educes.        *
272b0 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66  * the chances of
272c0 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63   SIGBUS while ac
272d0 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70  cessing the mapp
272e0 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20  ed region later 
272f0 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
27300 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20         else{.   
27310 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
27320 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34  nst int pgsz = 4
27330 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69  096;.          i
27340 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20  nt iPg;..       
27350 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
27360 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  he last byte of 
27370 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63  each newly alloc
27380 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
27390 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
273a0 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74     assert( (nByt
273b0 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a  e % pgsz)==0 );.
273c0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50            for(iP
273d0 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  g=(sStat.st_size
273e0 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79  /pgsz); iPg<(nBy
273f0 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29  te/pgsz); iPg++)
27400 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
27410 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t x = 0;.       
27420 20 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64       if( seekAnd
27430 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65  WriteFd(pShmNode
27440 2d 3e 68 53 68 6d 2c 20 69 50 67 2a 70 67 73 7a  ->hShm, iPg*pgsz
27450 20 2b 20 70 67 73 7a 2d 31 2c 22 22 2c 31 2c 26   + pgsz-1,"",1,&
27460 78 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  x)!=1 ){.       
27470 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
27480 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e  r *zFile = pShmN
27490 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ode->zFilename;.
274a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
274b0 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
274c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
274d0 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a  SIZE, "write", z
274e0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
274f0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
27500 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  e_out;.         
27510 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
27520 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27530 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
27540 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
27550 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
27560 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
27570 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
27580 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
27590 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69   = (char **)sqli
275a0 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
275b0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
275c0 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67  pRegion, nReqReg
275d0 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20  ion*sizeof(char 
275e0 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  *).    );.    if
275f0 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
27600 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
27610 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
27620 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
27630 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
27640 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
27650 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20  gion = apNew;.  
27660 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
27670 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52  e->nRegion<nReqR
27680 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69  egion ){.      i
27690 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69  nt nMap = szRegi
276a0 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20  on*nShmPerMap;. 
276b0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
276c0 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20    void *pMem;.  
276d0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
276e0 2d 3e 68 53 68 6d 3e 3d 30 20 29 7b 0a 20 20 20  ->hShm>=0 ){.   
276f0 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d       pMem = osMm
27700 61 70 28 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20  ap(0, nMap,.    
27710 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
27720 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50  ->isReadonly ? P
27730 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f  ROT_READ : PROT_
27740 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c  READ|PROT_WRITE,
27750 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41   .            MA
27760 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f  P_SHARED, pShmNo
27770 64 65 2d 3e 68 53 68 6d 2c 20 73 7a 52 65 67 69  de->hShm, szRegi
27780 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64 65  on*(i64)pShmNode
27790 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20 20  ->nRegion.      
277a0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
277b0 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45   pMem==MAP_FAILE
277c0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
277d0 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
277e0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
277f0 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53  MMAP, "mmap", pS
27800 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
27810 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
27820 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
27830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27840 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
27850 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Mem = sqlite3_ma
27860 6c 6c 6f 63 36 34 28 6e 4d 61 70 29 3b 0a 20 20  lloc64(nMap);.  
27870 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d        if( pMem==
27880 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
27890 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
278a0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
278b0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
278c0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
278d0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d       memset(pMem
278e0 2c 20 30 2c 20 6e 4d 61 70 29 3b 0a 20 20 20 20  , 0, nMap);.    
278f0 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69    }..      for(i
27900 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70  =0; i<nShmPerMap
27910 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
27920 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
27930 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
27940 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61  gion+i] = &((cha
27950 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f  r*)pMem)[szRegio
27960 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n*i];.      }.  
27970 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
27980 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72  egion += nShmPer
27990 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Map;.    }.  }..
279a0 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  shmpage_out:.  i
279b0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
279c0 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a  gion>iRegion ){.
279d0 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f      *pp = pShmNo
279e0 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65  de->apRegion[iRe
279f0 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gion];.  }else{.
27a00 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
27a10 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
27a20 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72  >isReadonly && r
27a30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
27a40 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
27a50 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  NLY;.  sqlite3_m
27a60 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
27a70 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b  ode->pShmMutex);
27a80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27a90 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
27aa0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
27ab0 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
27ac0 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   segment..**.** 
27ad0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72 65  Note that the re
27ae0 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65  lationship betwe
27af0 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45 58  en SHAREd and EX
27b00 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73  CLUSIVE locks is
27b10 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66   a little.** dif
27b20 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e  ferent here than
27b30 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78   in posix.  In x
27b40 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63  ShmLock(), one c
27b50 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63  an go from unloc
27b60 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64  ked.** to shared
27b70 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f   and back or fro
27b80 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78  m unlocked to ex
27b90 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b  clusive and back
27ba0 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a  .  But one may.*
27bb0 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68  * not go from sh
27bc0 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  ared to exclusiv
27bd0 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73  e or from exclus
27be0 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a  ive to shared..*
27bf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
27c00 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  xShmLock(.  sqli
27c10 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
27c20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
27c30 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
27c40 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
27c50 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
27c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c70 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
27c80 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
27c90 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
27ca0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27cb0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
27cc0 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
27cd0 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
27ce0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
27cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27d00 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
27d10 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
27d20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
27d30 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
27d40 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  fd;      /* Conn
27d50 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
27d60 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
27d70 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70    unixShm *p = p
27d80 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
27d90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
27da0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
27db0 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  ng locked */.  u
27dc0 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  nixShm *pX;     
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27de0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
27df0 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
27e00 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53  lings */.  unixS
27e10 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
27e20 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20   = p->pShmNode; 
27e30 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
27e40 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f  ng file iNode */
27e50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27e60 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
27e70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
27e80 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
27e90 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
27ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27eb0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
27ec0 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
27ed0 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
27ee0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70  ert( pShmNode==p
27ef0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
27f00 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  hmNode );.  asse
27f10 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
27f20 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
27f30 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
27f40 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74   ofst>=0 && ofst
27f50 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  +n<=SQLITE_SHM_N
27f60 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
27f70 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ( n>=1 );.  asse
27f80 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49  rt( flags==(SQLI
27f90 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
27fa0 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
27fb0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
27fc0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
27fd0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
27fe0 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20  EXCLUSIVE).     
27ff0 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
28000 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
28010 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
28020 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
28030 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
28040 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
28050 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20  _SHM_EXCLUSIVE) 
28060 29 3b 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20  );.  /* assert( 
28070 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26  n==1 || (flags &
28080 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
28090 55 53 49 56 45 29 21 3d 30 20 29 3b 20 2a 2f 0a  USIVE)!=0 ); */.
280a0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
280b0 64 65 2d 3e 68 53 68 6d 3e 3d 30 20 7c 7c 20 70  de->hShm>=0 || p
280c0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
280d0 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b  rocessLock==1 );
280e0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
280f0 6f 64 65 2d 3e 68 53 68 6d 3c 30 20 7c 7c 20 70  ode->hShm<0 || p
28100 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
28110 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
28120 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28  ..  mask = (1<<(
28130 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f  ofst+n)) - (1<<o
28140 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fst);.  assert( 
28150 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
28160 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
28170 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
28180 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75  pShmNode->pShmMu
28190 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
281a0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
281b0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
281c0 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
281d0 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
281e0 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
281f0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
28200 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
28210 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
28220 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
28230 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
28240 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
28250 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
28260 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
28270 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
28280 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
28290 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
282a0 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
282b0 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
282c0 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
282d0 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
282e0 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
282f0 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
28300 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
28310 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
28320 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
28330 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
28340 44 62 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f  DbFd, F_UNLCK, o
28350 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
28360 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
28370 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
28380 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
28390 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
283a0 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
283b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
283c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
283d0 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
283e0 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
283f0 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
28400 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20  .    } .  }else 
28410 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
28420 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
28430 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
28440 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
28450 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
28460 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
28470 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
28480 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
28490 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
284a0 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
284b0 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
284c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
284d0 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
284e0 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
284f0 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
28500 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
28510 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
28520 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
28530 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
28540 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
28550 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
28560 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
28570 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
28580 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
28590 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
285a0 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
285b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
285c0 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
285d0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
285e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
285f0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
28600 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
28610 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
28620 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
28630 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28640 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
28650 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
28660 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
28670 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
28680 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73  Fd, F_RDLCK, ofs
28690 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
286a0 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   n);.      }else
286b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
286c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
286d0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
286e0 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68  Get the local sh
286f0 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ared locks */.  
28700 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28710 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
28720 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
28730 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
28740 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  e{.    /* Make s
28750 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63  ure no sibling c
28760 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20  onnections hold 
28770 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20  locks that will 
28780 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a  block this.    *
28790 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20  * lock.  If any 
287a0 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  do, return SQLIT
287b0 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61  E_BUSY right awa
287c0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
287d0 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
287e0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
287f0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
28800 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
28810 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20  k & mask)!=0 || 
28820 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  (pX->sharedMask 
28830 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
28840 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28850 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
28860 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
28870 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47     }.  .    /* G
28880 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
28890 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
288a0 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65  stem level.  The
288b0 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  n if successful.
288c0 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b      ** also mark
288d0 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
288e0 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c  ction as being l
288f0 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ocked..    */.  
28900 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28910 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
28920 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
28930 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c  ock(pDbFd, F_WRL
28940 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
28950 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
28960 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28970 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
28980 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65  ssert( (p->share
28990 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  dMask & mask)==0
289a0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   );.        p->e
289b0 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
289c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
289d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
289e0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
289f0 65 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a 20  e->pShmMutex);. 
28a00 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
28a10 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69  OCK shmid-%d, pi
28a20 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30  d-%d got %03x,%0
28a30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3x\n",.         
28a40 20 20 70 2d 3e 69 64 2c 20 6f 73 47 65 74 70 69    p->id, osGetpi
28a50 64 28 30 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d  d(0), p->sharedM
28a60 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b  ask, p->exclMask
28a70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
28a80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
28a90 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72  ent a memory bar
28aa0 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66  rier or memory f
28ab0 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d  ence on shared m
28ac0 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  emory.  .**.** A
28ad0 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f  ll loads and sto
28ae0 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65  res begun before
28af0 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73   the barrier mus
28b00 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72  t complete befor
28b10 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72  e.** any load or
28b20 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74   store begun aft
28b30 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a  er the barrier..
28b40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
28b50 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20  nixShmBarrier(. 
28b60 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
28b70 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
28b80 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
28b90 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
28ba0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
28bb0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
28bc0 45 54 45 52 28 66 64 29 3b 0a 20 20 73 71 6c 69  ETER(fd);.  sqli
28bd0 74 65 33 4d 65 6d 6f 72 79 42 61 72 72 69 65 72  te3MemoryBarrier
28be0 28 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 63  ();         /* c
28bf0 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65 64 20  ompiler-defined 
28c00 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 2a  memory barrier *
28c10 2f 0a 20 20 61 73 73 65 72 74 28 20 66 64 2d 3e  /.  assert( fd->
28c20 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 3d  pMethods->xLock=
28c30 3d 6e 6f 6c 6f 63 6b 4c 6f 63 6b 20 0a 20 20 20  =nolockLock .   
28c40 20 20 20 20 7c 7c 20 75 6e 69 78 46 69 6c 65 4d      || unixFileM
28c50 75 74 65 78 4e 6f 74 68 65 6c 64 28 28 75 6e 69  utexNotheld((uni
28c60 78 46 69 6c 65 2a 29 66 64 29 20 0a 20 20 29 3b  xFile*)fd) .  );
28c70 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
28c80 78 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  x();            
28c90 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74 65 78     /* Also mutex
28ca0 2c 20 66 6f 72 20 72 65 64 75 6e 64 61 6e 63 79  , for redundancy
28cb0 20 2a 2f 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d   */.  unixLeaveM
28cc0 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  utex();.}../*.**
28cd0 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   Close a connect
28ce0 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
28cf0 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68  mory.  Delete th
28d00 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a  e underlying .**
28d10 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65   storage if dele
28d20 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  teFlag is true..
28d30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
28d40 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f  s no shared memo
28d50 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
28d60 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  th the connectio
28d70 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72  n then this.** r
28d80 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d  outine is a harm
28d90 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  less no-op..*/.s
28da0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
28db0 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65  mUnmap(.  sqlite
28dc0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
28dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28de0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
28df0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
28e00 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20  nt deleteFlag   
28e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28e20 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d  * Delete shared-
28e30 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a  memory if true *
28e40 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a  /.){.  unixShm *
28e50 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
28e60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
28e70 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  nnection to be c
28e80 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53  losed */.  unixS
28e90 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
28ea0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
28eb0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61  e underlying sha
28ec0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
28ed0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70  */.  unixShm **p
28ee0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
28ef0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
28f00 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67  ing over sibling
28f10 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
28f20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
28f30 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
28f40 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
28f50 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
28f60 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20  e */..  pDbFd = 
28f70 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
28f80 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
28f90 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
28fa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28fb0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
28fc0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73  >pShmNode;..  as
28fd0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
28fe0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
28ff0 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
29000 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
29010 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
29020 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  node );..  /* Re
29030 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
29040 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
29050 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
29060 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
29070 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
29080 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
29090 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 70  nter(pShmNode->p
290a0 53 68 6d 4d 75 74 65 78 29 3b 0a 20 20 66 6f 72  ShmMutex);.  for
290b0 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70  (pp=&pShmNode->p
290c0 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b  First; (*pp)!=p;
290d0 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e   pp = &(*pp)->pN
290e0 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70  ext){}.  *pp = p
290f0 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46  ->pNext;..  /* F
29100 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ree the connecti
29110 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  on p */.  sqlite
29120 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62  3_free(p);.  pDb
29130 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20  Fd->pShm = 0;.  
29140 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
29150 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53  ave(pShmNode->pS
29160 68 6d 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  hmMutex);..  /* 
29170 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  If pShmNode->nRe
29180 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c  f has reached 0,
29190 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
291a0 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20  underlying.  ** 
291b0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
291c0 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 61 73 73  le, too */.  ass
291d0 65 72 74 28 20 75 6e 69 78 46 69 6c 65 4d 75 74  ert( unixFileMut
291e0 65 78 4e 6f 74 68 65 6c 64 28 70 44 62 46 64 29  exNotheld(pDbFd)
291f0 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   );.  unixEnterM
29200 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
29210 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
29220 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
29230 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
29240 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
29250 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c  0 ){.    if( del
29260 65 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e  eteFlag && pShmN
29270 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30 20 29 7b 0a  ode->hShm>=0 ){.
29280 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70        osUnlink(p
29290 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
292a0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  me);.    }.    u
292b0 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46  nixShmPurge(pDbF
292c0 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
292d0 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72  aveMutex();..  r
292e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
292f0 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  .}...#else.# def
29300 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20  ine unixShmMap  
29310 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e     0.# define un
29320 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23  ixShmLock    0.#
29330 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42   define unixShmB
29340 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e  arrier 0.# defin
29350 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20  e unixShmUnmap  
29360 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
29370 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29380 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 53 51 4c  _WAL */..#if SQL
29390 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
293a0 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20  E>0./*.** If it 
293b0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d  is currently mem
293c0 6f 72 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61  ory mapped, unma
293d0 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73  p file pFd..*/.s
293e0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55  tatic void unixU
293f0 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  nmapfile(unixFil
29400 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72  e *pFd){.  asser
29410 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
29420 74 3d 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53  t==0 );.#ifdef S
29430 51 4c 49 54 45 5f 53 48 41 52 45 44 5f 4d 41 50  QLITE_SHARED_MAP
29440 50 49 4e 47 0a 20 20 69 66 28 20 70 46 64 2d 3e  PING.  if( pFd->
29450 70 49 6e 6f 64 65 20 29 20 72 65 74 75 72 6e 3b  pInode ) return;
29460 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46  .#endif.  if( pF
29470 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b  d->pMapRegion ){
29480 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46  .    osMunmap(pF
29490 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70  d->pMapRegion, p
294a0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
294b0 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d  al);.    pFd->pM
294c0 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20  apRegion = 0;.  
294d0 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20    pFd->mmapSize 
294e0 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  = 0;.    pFd->mm
294f0 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30  apSizeActual = 0
29500 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
29510 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
29520 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65  e size of the me
29530 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 69  mory mapping mai
29540 6e 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65 20  ntained by file 
29550 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70  .** descriptor p
29560 46 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65 73  Fd to nNew bytes
29570 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20 6d  . Any existing m
29580 61 70 70 69 6e 67 20 69 73 20 64 69 73 63 61 72  apping is discar
29590 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ded..**.** If su
295a0 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66  ccessful, this f
295b0 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
295c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
295d0 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  bles:.**.**     
295e0 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52    unixFile.pMapR
295f0 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75  egion.**       u
29600 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65  nixFile.mmapSize
29610 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
29620 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  le.mmapSizeActua
29630 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63  l.**.** If unsuc
29640 63 65 73 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f  cessful, an erro
29650 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 6f 67  r message is log
29660 67 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f  ged via sqlite3_
29670 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65  log() and.** the
29680 20 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73   three variables
29690 20 61 62 6f 76 65 20 61 72 65 20 7a 65 72 6f 65   above are zeroe
296a0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
296b0 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a  SQLite should.**
296c0 20 63 6f 6e 74 69 6e 75 65 20 61 63 63 65 73 73   continue access
296d0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
296e0 20 75 73 69 6e 67 20 74 68 65 20 78 52 65 61 64   using the xRead
296f0 28 29 20 61 6e 64 20 78 57 72 69 74 65 28 29 0a  () and xWrite().
29700 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ** methods..*/.s
29710 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 52  tatic void unixR
29720 65 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e 69 78  emapfile(.  unix
29730 46 69 6c 65 20 2a 70 46 64 2c 20 20 20 20 20 20  File *pFd,      
29740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29750 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
29760 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e  bject */.  i64 n
29770 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 20 20  New             
29780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
29790 71 75 69 72 65 64 20 6d 61 70 70 69 6e 67 20 73  quired mapping s
297a0 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ize */.){.  cons
297b0 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22  t char *zErr = "
297c0 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d  mmap";.  int h =
297d0 20 70 46 64 2d 3e 68 3b 20 20 20 20 20 20 20 20   pFd->h;        
297e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
297f0 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
29800 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65   open on db file
29810 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67 20   */.  u8 *pOrig 
29820 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  = (u8 *)pFd->pMa
29830 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f  pRegion;   /* Po
29840 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
29850 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f   file mapping */
29860 0a 20 20 69 36 34 20 6e 4f 72 69 67 20 3d 20 70  .  i64 nOrig = p
29870 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
29880 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  al;     /* Size 
29890 6f 66 20 70 4f 72 69 67 20 72 65 67 69 6f 6e 20  of pOrig region 
298a0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38  in bytes */.  u8
298b0 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298d0 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f     /* Location o
298e0 66 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f  f new mapping */
298f0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50  .  int flags = P
29900 52 4f 54 5f 52 45 41 44 3b 20 20 20 20 20 20 20  ROT_READ;       
29910 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
29920 20 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61 70   to pass to mmap
29930 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  () */..  assert(
29940 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
29950 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
29960 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69  nNew>pFd->mmapSi
29970 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
29980 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53  nNew<=pFd->mmapS
29990 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73 73 65  izeMax );.  asse
299a0 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
299b0 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61  assert( pFd->mma
299c0 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64  pSizeActual>=pFd
299d0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20  ->mmapSize );.  
299e0 61 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49 4c  assert( MAP_FAIL
299f0 45 44 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66  ED!=0 );..#ifdef
29a00 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41   SQLITE_MMAP_REA
29a10 44 57 52 49 54 45 0a 20 20 69 66 28 20 28 70 46  DWRITE.  if( (pF
29a20 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  d->ctrlFlags & U
29a30 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d  NIXFILE_RDONLY)=
29a40 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d 20 50 52  =0 ) flags |= PR
29a50 4f 54 5f 57 52 49 54 45 3b 0a 23 65 6e 64 69 66  OT_WRITE;.#endif
29a60 0a 0a 20 20 69 66 28 20 70 4f 72 69 67 20 29 7b  ..  if( pOrig ){
29a70 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
29a80 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20  .    i64 nReuse 
29a90 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b  = pFd->mmapSize;
29aa0 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74  .#else.    const
29ab0 20 69 6e 74 20 73 7a 53 79 73 70 61 67 65 20 3d   int szSyspage =
29ac0 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29   osGetpagesize()
29ad0 3b 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73 65  ;.    i64 nReuse
29ae0 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a   = (pFd->mmapSiz
29af0 65 20 26 20 7e 28 73 7a 53 79 73 70 61 67 65 2d  e & ~(szSyspage-
29b00 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
29b10 75 38 20 2a 70 52 65 71 20 3d 20 26 70 4f 72 69  u8 *pReq = &pOri
29b20 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20 20 20  g[nReuse];..    
29b30 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70 61 67  /* Unmap any pag
29b40 65 73 20 6f 66 20 74 68 65 20 65 78 69 73 74 69  es of the existi
29b50 6e 67 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20  ng mapping that 
29b60 63 61 6e 6e 6f 74 20 62 65 20 72 65 75 73 65 64  cannot be reused
29b70 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65  . */.    if( nRe
29b80 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a 20 20  use!=nOrig ){.  
29b90 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 52 65      osMunmap(pRe
29ba0 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73 65 29  q, nOrig-nReuse)
29bb0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48 41 56  ;.    }..#if HAV
29bc0 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70 4e 65  E_MREMAP.    pNe
29bd0 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70 4f 72  w = osMremap(pOr
29be0 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e 65 77  ig, nReuse, nNew
29bf0 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56 45  , MREMAP_MAYMOVE
29c00 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 22 6d  );.    zErr = "m
29c10 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a 20 20  remap";.#else.  
29c20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28    pNew = osMmap(
29c30 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65 75 73  pReq, nNew-nReus
29c40 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48  e, flags, MAP_SH
29c50 41 52 45 44 2c 20 68 2c 20 6e 52 65 75 73 65 29  ARED, h, nReuse)
29c60 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d  ;.    if( pNew!=
29c70 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  MAP_FAILED ){.  
29c80 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 70 52      if( pNew!=pR
29c90 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73  eq ){.        os
29ca0 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e 4e 65  Munmap(pNew, nNe
29cb0 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20 20 20  w - nReuse);.   
29cc0 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20       pNew = 0;. 
29cd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29ce0 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 72 69 67      pNew = pOrig
29cf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29d00 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54  #endif..    /* T
29d10 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 65 78  he attempt to ex
29d20 74 65 6e 64 20 74 68 65 20 65 78 69 73 74 69 6e  tend the existin
29d30 67 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64  g mapping failed
29d40 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f 0a 20 20  . Free it. */.  
29d50 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f    if( pNew==MAP_
29d60 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65 77 3d 3d  FAILED || pNew==
29d70 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e  0 ){.      osMun
29d80 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73  map(pOrig, nReus
29d90 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
29da0 20 2f 2a 20 49 66 20 70 4e 65 77 20 69 73 20 73   /* If pNew is s
29db0 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79 20 74  till NULL, try t
29dc0 6f 20 63 72 65 61 74 65 20 61 6e 20 65 6e 74 69  o create an enti
29dd0 72 65 6c 79 20 6e 65 77 20 6d 61 70 70 69 6e 67  rely new mapping
29de0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d  . */.  if( pNew=
29df0 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  =0 ){.    pNew =
29e00 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e 65 77 2c   osMmap(0, nNew,
29e10 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52   flags, MAP_SHAR
29e20 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a  ED, h, 0);.  }..
29e30 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f    if( pNew==MAP_
29e40 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 70 4e  FAILED ){.    pN
29e50 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e 4e 65 77  ew = 0;.    nNew
29e60 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69 78 4c 6f   = 0;.    unixLo
29e70 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f 4b  gError(SQLITE_OK
29e80 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e 7a 50 61  , zErr, pFd->zPa
29e90 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  th);..    /* If 
29ea0 74 68 65 20 6d 6d 61 70 28 29 20 61 62 6f 76 65  the mmap() above
29eb0 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 65 20   failed, assume 
29ec0 74 68 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75  that all subsequ
29ed0 65 6e 74 20 6d 6d 61 70 28 29 20 63 61 6c 6c 73  ent mmap() calls
29ee0 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 70 72 6f  .    ** will pro
29ef0 62 61 62 6c 79 20 66 61 69 6c 20 74 6f 6f 2e 20  bably fail too. 
29f00 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73 69  Fall back to usi
29f10 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20  ng xRead/xWrite 
29f20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20 20 20 20  exclusively.    
29f30 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
29f40 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e 6d 6d    */.    pFd->mm
29f50 61 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a 20  apSizeMax = 0;. 
29f60 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61 70 52 65   }.  pFd->pMapRe
29f70 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70  gion = (void *)p
29f80 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61 70  New;.  pFd->mmap
29f90 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  Size = pFd->mmap
29fa0 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4e 65  SizeActual = nNe
29fb0 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f  w;.}../*.** Memo
29fc0 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20  ry map or remap 
29fd0 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
29fe0 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  by file-descript
29ff0 6f 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66  or pFd (if the f
2a000 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64  ile.** is alread
2a010 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78  y mapped, the ex
2a020 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69  isting mapping i
2a030 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68  s replaced by th
2a040 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a  e new). Or, if .
2a050 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ** there already
2a060 20 65 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e   exists a mappin
2a070 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  g for this file,
2a080 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 73   and there are s
2a090 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e  till .** outstan
2a0a0 64 69 6e 67 20 78 46 65 74 63 68 28 29 20 72 65  ding xFetch() re
2a0b0 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20  ferences to it, 
2a0c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2a0d0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2a0e0 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79  If parameter nBy
2a0f0 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  te is non-negati
2a100 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ve, then it is t
2a110 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  he requested siz
2a120 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70  e of .** the map
2a130 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20  ping to create. 
2a140 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42  Otherwise, if nB
2a150 79 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  yte is less than
2a160 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
2a170 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73 69  .** requested si
2a180 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ze is the size o
2a190 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
2a1a0 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73  sk. The actual s
2a1b0 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72  ize of the.** cr
2a1c0 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73  eated mapping is
2a1d0 20 65 69 74 68 65 72 20 74 68 65 20 72 65 71 75   either the requ
2a1e0 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68  ested size or th
2a1f0 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72  e value configur
2a200 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c  ed .** using SQL
2a210 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c  ITE_FCNTL_MMAP_L
2a220 49 4d 49 54 2c 20 77 68 69 63 68 65 76 65 72 20  IMIT, whichever 
2a230 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  is smaller..**.*
2a240 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
2a250 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
2a260 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e  ror occurs (even
2a270 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20   if the mapping 
2a280 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61  is not.** recrea
2a290 74 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  ted as a result 
2a2a0 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  of outstanding r
2a2b0 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e  eferences) or an
2a2c0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a   SQLite error.**
2a2d0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
2a2e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2a2f0 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46  nixMapfile(unixF
2a300 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 4d  ile *pFd, i64 nM
2a310 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6e  ap){.  assert( n
2a320 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e  Map>=0 || pFd->n
2a330 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20  FetchOut==0 );. 
2a340 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20   assert( nMap>0 
2a350 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  || (pFd->mmapSiz
2a360 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61  e==0 && pFd->pMa
2a370 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20  pRegion==0) );. 
2a380 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68   if( pFd->nFetch
2a390 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53  Out>0 ) return S
2a3a0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
2a3b0 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 73   nMap<0 ){.    s
2a3c0 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
2a3d0 75 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  uf;          /* 
2a3e0 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69  Low-level file i
2a3f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
2a400 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46    if( osFstat(pF
2a410 64 2d 3e 68 2c 20 26 73 74 61 74 62 75 66 29 20  d->h, &statbuf) 
2a420 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2a430 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
2a440 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  AT;.    }.    nM
2a450 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ap = statbuf.st_
2a460 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  size;.  }.  if( 
2a470 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69  nMap>pFd->mmapSi
2a480 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61  zeMax ){.    nMa
2a490 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  p = pFd->mmapSiz
2a4a0 65 4d 61 78 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  eMax;.  }..#ifde
2a4b0 66 20 53 51 4c 49 54 45 5f 53 48 41 52 45 44 5f  f SQLITE_SHARED_
2a4c0 4d 41 50 50 49 4e 47 0a 20 20 69 66 28 20 70 46  MAPPING.  if( pF
2a4d0 64 2d 3e 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20  d->pInode ){.   
2a4e0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
2a4f0 70 49 6e 6f 64 65 20 3d 20 70 46 64 2d 3e 70 49  pInode = pFd->pI
2a500 6e 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 70 46  node;.    if( pF
2a510 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 20  d->pMapRegion ) 
2a520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a530 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
2a540 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20  utex();.    if( 
2a550 70 49 6e 6f 64 65 2d 3e 70 53 68 61 72 65 64 4d  pInode->pSharedM
2a560 61 70 70 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20  apping==0 ){.   
2a570 20 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 6f 73     u8 *pNew = os
2a580 4d 6d 61 70 28 30 2c 20 6e 4d 61 70 2c 20 50 52  Mmap(0, nMap, PR
2a590 4f 54 5f 52 45 41 44 2c 20 4d 41 50 5f 53 48 41  OT_READ, MAP_SHA
2a5a0 52 45 44 2c 20 70 46 64 2d 3e 68 2c 20 30 29 3b  RED, pFd->h, 0);
2a5b0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d  .      if( pNew=
2a5c0 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
2a5d0 20 20 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72         unixLogEr
2a5e0 72 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 22  ror(SQLITE_OK, "
2a5f0 6d 6d 61 70 22 2c 20 70 46 64 2d 3e 7a 50 61 74  mmap", pFd->zPat
2a600 68 29 3b 0a 20 20 20 20 20 20 20 20 70 46 64 2d  h);.        pFd-
2a610 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30  >mmapSizeMax = 0
2a620 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2a630 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70         pInode->p
2a640 53 68 61 72 65 64 4d 61 70 70 69 6e 67 20 3d 20  SharedMapping = 
2a650 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 49  pNew;.        pI
2a660 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 4d 61 70  node->nSharedMap
2a670 70 69 6e 67 20 3d 20 6e 4d 61 70 3b 0a 20 20 20  ping = nMap;.   
2a680 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
2a690 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  Fd->pMapRegion =
2a6a0 20 70 49 6e 6f 64 65 2d 3e 70 53 68 61 72 65 64   pInode->pShared
2a6b0 4d 61 70 70 69 6e 67 3b 0a 20 20 20 20 70 46 64  Mapping;.    pFd
2a6c0 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
2a6d0 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
2a6e0 20 3d 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72   = pInode->nShar
2a6f0 65 64 4d 61 70 70 69 6e 67 3b 0a 20 20 20 20 75  edMapping;.    u
2a700 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2a710 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a720 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 23 65 6e 64 69  TE_OK;.  }.#endi
2a730 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  f..  assert( nMa
2a740 70 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61  p>0 || (pFd->mma
2a750 70 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d  pSize==0 && pFd-
2a760 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20  >pMapRegion==0) 
2a770 29 3b 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70  );.  if( nMap!=p
2a780 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  Fd->mmapSize ){.
2a790 20 20 20 20 75 6e 69 78 52 65 6d 61 70 66 69 6c      unixRemapfil
2a7a0 65 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20  e(pFd, nMap);.  
2a7b0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2a7c0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
2a7d0 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
2a7e0 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
2a7f0 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  .** If possible,
2a800 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
2a810 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f  r to a mapping o
2a820 66 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69  f file fd starti
2a830 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ng at offset.** 
2a840 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e  iOff. The mappin
2a850 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20  g must be valid 
2a860 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d  for at least nAm
2a870 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  t bytes..**.** I
2a880 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72  f such a pointer
2a890 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64   can be obtained
2a8a0 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70  , store it in *p
2a8b0 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  p and return SQL
2a8c0 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69  ITE_OK..** Or, i
2a8d0 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74  f one cannot but
2a8e0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2a8f0 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61  , set *pp to 0 a
2a900 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
2a910 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c  _OK..** Finally,
2a920 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   if an error doe
2a930 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20  s occur, return 
2a940 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
2a950 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a  code. The final.
2a960 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20  ** value of *pp 
2a970 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
2a980 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
2a990 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
2a9a0 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20  n does return a 
2a9b0 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c  pointer, the cal
2a9c0 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61  ler must eventua
2a9d0 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20  lly .** release 
2a9e0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 62 79  the reference by
2a9f0 20 63 61 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66   calling unixUnf
2aa00 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  etch()..*/.stati
2aa10 63 20 69 6e 74 20 75 6e 69 78 46 65 74 63 68 28  c int unixFetch(
2aa20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
2aa30 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20  , i64 iOff, int 
2aa40 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29  nAmt, void **pp)
2aa50 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
2aa60 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
2aa70 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
2aa80 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20  unixFile *)fd;  
2aa90 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
2aaa0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
2aab0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70   */.#endif.  *pp
2aac0 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54   = 0;..#if SQLIT
2aad0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
2aae0 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61  0.  if( pFd->mma
2aaf0 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20  pSizeMax>0 ){.  
2ab00 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
2ab10 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  egion==0 ){.    
2ab20 20 20 69 6e 74 20 72 63 20 3d 20 75 6e 69 78 4d    int rc = unixM
2ab30 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b  apfile(pFd, -1);
2ab40 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2ab50 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2ab60 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2ab70 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
2ab80 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29  e >= iOff+nAmt )
2ab90 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28  {.      *pp = &(
2aba0 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
2abb0 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20  egion)[iOff];.  
2abc0 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f      pFd->nFetchO
2abd0 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ut++;.    }.  }.
2abe0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2abf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2ac00 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64  .** If the third
2ac10 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
2ac20 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73  -NULL, then this
2ac30 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73   function releas
2ac40 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e  es a .** referen
2ac50 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61  ce obtained by a
2ac60 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
2ac70 6f 20 75 6e 69 78 46 65 74 63 68 28 29 2e 20 54  o unixFetch(). T
2ac80 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
2ac90 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
2aca0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
2acb0 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
2acc0 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
2acd0 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ing.** argument 
2ace0 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20  that was passed 
2acf0 74 6f 20 74 68 65 20 75 6e 69 78 46 65 74 63 68  to the unixFetch
2ad00 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a  () invocation. .
2ad10 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
2ad20 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
2ad30 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
2ad40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  is function is b
2ad50 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  eing called .** 
2ad60 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46  to inform the VF
2ad70 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63  S layer that, ac
2ad80 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58  cording to POSIX
2ad90 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d  , any existing m
2ada0 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e  apping .** may n
2adb0 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e  ow be invalid an
2adc0 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61  d should be unma
2add0 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
2ade0 69 6e 74 20 75 6e 69 78 55 6e 66 65 74 63 68 28  int unixUnfetch(
2adf0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
2ae00 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64  , i64 iOff, void
2ae10 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45   *p){.#if SQLITE
2ae20 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
2ae30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
2ae40 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66   = (unixFile *)f
2ae50 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
2ae60 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
2ae70 66 69 6c 65 20 2a 2f 0a 20 20 55 4e 55 53 45 44  file */.  UNUSED
2ae80 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29  _PARAMETER(iOff)
2ae90 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20  ;..  /* If p==0 
2aea0 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72  (unmap the entir
2aeb0 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65  e file) then the
2aec0 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75  re must be no ou
2aed0 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20  tstanding .  ** 
2aee0 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
2aef0 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28  s. Or, if p!=0 (
2af00 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e  meaning it is an
2af10 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
2af20 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  e),.  ** then th
2af30 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ere must be at l
2af40 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
2af50 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ding.  */.  asse
2af60 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64  rt( (p==0)==(pFd
2af70 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20  ->nFetchOut==0) 
2af80 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30  );..  /* If p!=0
2af90 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20  , it must match 
2afa0 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20  the iOff value. 
2afb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  */.  assert( p==
2afc0 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29  0 || p==&((u8 *)
2afd0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  pFd->pMapRegion)
2afe0 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69 66 28  [iOff] );..  if(
2aff0 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e   p ){.    pFd->n
2b000 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65  FetchOut--;.  }e
2b010 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55 6e 6d  lse{.    unixUnm
2b020 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d  apfile(pFd);.  }
2b030 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ..  assert( pFd-
2b040 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b  >nFetchOut>=0 );
2b050 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
2b060 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
2b070 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2b080 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  R(p);.  UNUSED_P
2b090 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a  ARAMETER(iOff);.
2b0a0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2b0b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2b0c0 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
2b0d0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2b0e0 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
2b0f0 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
2b100 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2b110 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
2b120 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
2b130 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2b140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b150 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2b160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
2b1a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  ../*.** This div
2b1b0 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64  ision contains d
2b1c0 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
2b1d0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2b1e0 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a   objects that.**
2b1f0 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
2b200 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  us file locking 
2b210 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20  strategies.  It 
2b220 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65  also contains de
2b230 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20  finitions.** of 
2b240 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
2b250 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75  ns.  A finder-fu
2b260 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2b270 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70  o locate the app
2b280 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69  ropriate.** sqli
2b290 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2b2a0 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74  bject for a part
2b2b0 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
2b2c0 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44  file.  The pAppD
2b2d0 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  ata.** field of 
2b2e0 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20  the sqlite3_vfs 
2b2f0 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20  VFS objects are 
2b300 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62  initialized to b
2b310 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  e pointers to.**
2b320 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e   the correct fin
2b330 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72  der-function for
2b340 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a   that VFS..**.**
2b350 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e   Most finder fun
2b360 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20  ctions return a 
2b370 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78  pointer to a fix
2b380 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ed sqlite3_io_me
2b390 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e  thods.** object.
2b3a0 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72    The only inter
2b3b0 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75  esting finder-fu
2b3c0 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f  nction is autolo
2b3d0 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63  ckIoFinder, whic
2b3e0 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68  h.** looks at th
2b3f0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70  e filesystem typ
2b400 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67  e and tries to g
2b410 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f  uess the best lo
2b420 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67  cking.** strateg
2b430 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a  y from that..**.
2b440 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75  ** For finder-fu
2b450 6e 63 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62  nction F, two ob
2b460 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
2b470 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  d:.**.**    (1) 
2b480 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d  The real finder-
2b490 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
2b4a0 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20  FImpt()"..**.** 
2b4b0 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e     (2) A constan
2b4c0 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  t pointer to thi
2b4d0 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  s function named
2b4e0 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a   just "F"..**.**
2b4f0 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
2b500 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69   the F pointer i
2b510 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41  s used as the pA
2b520 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72  ppData value for
2b530 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e   VFS.** objects.
2b540 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
2b550 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20  this instead of 
2b560 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61  letting pAppData
2b570 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74   point.** direct
2b580 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72  ly at the finder
2b590 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20  -function since 
2b5a0 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e  C90 rules preven
2b5b0 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f  t a void*.** fro
2b5c0 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61  m be cast into a
2b5d0 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
2b5e0 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68  r..**.**.** Each
2b5f0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
2b600 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65  s macro generate
2b610 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a  s two objects:.*
2b620 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73  *.**   *  A cons
2b630 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  tant sqlite3_io_
2b640 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63  methods object c
2b650 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20  all METHOD that 
2b660 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20  has locking.**  
2b670 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53      methods CLOS
2b680 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c  E, LOCK, UNLOCK,
2b690 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a   CKRESLOCK..**.*
2b6a0 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65  *   *  An I/O me
2b6b0 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
2b6c0 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44  tion called FIND
2b6d0 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ER that returns 
2b6e0 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20  a pointer.**    
2b6f0 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20    to the METHOD 
2b700 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72  object in the pr
2b710 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a  evious bullet..*
2b720 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48  /.#define IOMETH
2b730 4f 44 53 28 46 49 4e 44 45 52 2c 4d 45 54 48 4f  ODS(FINDER,METHO
2b740 44 2c 56 45 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c  D,VERSION,CLOSE,
2b750 4c 4f 43 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f  LOCK,UNLOCK,CKLO
2b760 43 4b 2c 53 48 4d 4d 41 50 29 20 20 20 20 20 5c  CK,SHMMAP)     \
2b770 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
2b780 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2b790 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20   METHOD = {     
2b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b7c0 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20     VERSION,     
2b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b7e0 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20  * iVersion */   
2b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b800 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2b810 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20    CLOSE,        
2b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b830 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20   xClose */      
2b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b850 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2b860 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20   unixRead,      
2b870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b880 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20  xRead */        
2b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8a0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2b8b0 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20  unixWrite,      
2b8c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b8d0 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20  Write */        
2b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8f0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
2b900 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20  nixTruncate,    
2b910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
2b920 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20  runcate */      
2b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b940 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2b950 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  ixSync,         
2b960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
2b970 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  nc */           
2b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b990 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2b9a0 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  xFileSize,      
2b9b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
2b9c0 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  eSize */        
2b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9e0 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b         \.   LOCK
2b9f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ba00 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
2ba10 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba30 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43        \.   UNLOC
2ba40 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
2ba50 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2ba60 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
2ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba80 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b       \.   CKLOCK
2ba90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2baa0 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
2bab0 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20  eservedLock */  
2bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bad0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
2bae0 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
2baf0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
2bb00 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20  trol */         
2bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74     \.   unixSect
2bb30 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
2bb40 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
2bb50 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
2bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb70 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63    \.   unixDevic
2bb80 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
2bb90 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70  ,  /* xDeviceCap
2bba0 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20  abilities */    
2bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbc0 20 5c 0a 20 20 20 53 48 4d 4d 41 50 2c 20 20 20   \.   SHMMAP,   
2bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbe0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20    /* xShmMap */ 
2bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc10 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  \.   unixShmLock
2bc20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bc30 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20   /* xShmLock */ 
2bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2bc60 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69  .   unixShmBarri
2bc70 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
2bc80 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
2bc90 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2bcb0 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 2c     unixShmUnmap,
2bcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bcd0 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20  * xShmUnmap */  
2bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2bd00 20 20 75 6e 69 78 46 65 74 63 68 2c 20 20 20 20    unixFetch,    
2bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bd20 20 78 46 65 74 63 68 20 2a 2f 20 20 20 20 20 20   xFetch */      
2bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd40 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2bd50 20 75 6e 69 78 55 6e 66 65 74 63 68 2c 20 20 20   unixUnfetch,   
2bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bd70 78 55 6e 66 65 74 63 68 20 2a 2f 20 20 20 20 20  xUnfetch */     
2bd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd90 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20             \.}; 
2bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bde0 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
2bdf0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2be00 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e  _io_methods *FIN
2be10 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20  DER##Impl(const 
2be20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c  char *z, unixFil
2be30 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55  e *p){   \.  UNU
2be40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29  SED_PARAMETER(z)
2be50 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  ; UNUSED_PARAMET
2be60 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20  ER(p);          
2be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be80 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75          \.  retu
2be90 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20  rn &METHOD;     
2bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bed0 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20         \.}      
2bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
2bf30 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2bf40 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74  methods *(*const
2bf50 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63   FINDER)(const c
2bf60 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70  har*,unixFile *p
2bf70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e  )    \.    = FIN
2bf80 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a  DER##Impl;../*.*
2bf90 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f  * Here are all o
2bfa0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  f the sqlite3_io
2bfb0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
2bfc0 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65   for each of the
2bfd0 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  .** locking stra
2bfe0 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f  tegies.  Functio
2bff0 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70  ns that return p
2c000 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65  ointers to these
2c010 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20   methods.** are 
2c020 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f  also created..*/
2c030 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f  .IOMETHODS(.  po
2c040 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  sixIoFinder,    
2c050 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2c060 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2c070 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68  */.  posixIoMeth
2c080 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
2c090 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2c0a0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2c0b0 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20   */.  3,        
2c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0d0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2c0e0 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20 65 6e   and mmap are en
2c0f0 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
2c100 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2c110 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2c120 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
2c130 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2c140 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2c150 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e  thod */.  unixUn
2c160 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
2c170 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2c180 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
2c190 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2c1a0 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ,    /* xCheckRe
2c1b0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2c1c0 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4d 61  d */.  unixShmMa
2c1d0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
2c1e0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2c1f0 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
2c200 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e  S(.  nolockIoFin
2c210 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  der,           /
2c220 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2c230 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f  n name */.  nolo
2c240 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
2c250 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2c260 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2c270 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20  ct name */.  3, 
2c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c290 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2c2a0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70   memory and mmap
2c2b0 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   are enabled */.
2c2c0 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20    nolockClose,  
2c2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c2e0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2c2f0 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20    nolockLock,   
2c300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c310 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2c320 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20   nolockUnlock,  
2c330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2c340 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2c350 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73    nolockCheckRes
2c360 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78  ervedLock,  /* x
2c370 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2c380 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3a0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2c3b0 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ap method */.).I
2c3c0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c  OMETHODS(.  dotl
2c3d0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
2c3e0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2c3f0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2c400 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  .  dotlockIoMeth
2c410 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ods,         /* 
2c420 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2c430 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
2c440 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
2c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c460 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2c470 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2c480 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20  dotlockClose,   
2c490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
2c4a0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
2c4b0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20  dotlockLock,    
2c4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2c4d0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
2c4e0 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  otlockUnlock,   
2c4f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2c500 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2c510 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
2c520 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68  rvedLock, /* xCh
2c530 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2c540 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
2c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c560 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
2c570 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69   method */.)..#i
2c580 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2c590 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
2c5a0 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b  METHODS(.  flock
2c5b0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2c5c0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
2c5d0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
2c5e0 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73    flockIoMethods
2c5f0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
2c600 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2c610 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2c620 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
2c630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c640 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
2c650 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66   disabled */.  f
2c660 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
2c670 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
2c680 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  se method */.  f
2c690 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
2c6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
2c6b0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  k method */.  fl
2c6c0 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
2c6d0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
2c6e0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
2c6f0 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
2c700 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65  dLock,   /* xChe
2c710 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
2c720 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
2c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c740 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
2c750 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
2c760 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  if..#if OS_VXWOR
2c770 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  KS.IOMETHODS(.  
2c780 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  semIoFinder,    
2c790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2c7a0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2c7b0 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68  e */.  semIoMeth
2c7c0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
2c7d0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2c7e0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2c7f0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
2c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c810 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2c820 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2c830 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65 2c 20 20  /.  semXClose,  
2c840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c850 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2c860 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c 20 20 20  /.  semXLock,   
2c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c880 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2c890 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20  .  semXUnlock,  
2c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c8b0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2c8c0 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b 52 65 73  /.  semXCheckRes
2c8d0 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a  ervedLock,    /*
2c8e0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2c8f0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2c900 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2c910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2c920 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
2c930 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
2c940 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2c950 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2c960 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
2c970 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49  OMETHODS(.  afpI
2c980 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
2c990 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2c9a0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2c9b0 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c  .  afpIoMethods,
2c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c9d0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2c9e0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
2c9f0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
2ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ca10 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2ca20 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2ca30 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  afpClose,       
2ca40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
2ca50 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
2ca60 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  afpLock,        
2ca70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2ca80 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
2ca90 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fpUnlock,       
2caa0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2cab0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2cac0 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
2cad0 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68  Lock,     /* xCh
2cae0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2caf0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
2cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb10 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
2cb20 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
2cb30 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  dif../*.** The p
2cb40 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  roxy locking met
2cb50 68 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d  hod is a "super-
2cb60 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73  method" in the s
2cb70 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20  ense that it.** 
2cb80 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20  opens secondary 
2cb90 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2cba0 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61   for the conch a
2cbb0 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e  nd lock files an
2cbc0 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f  d.** it uses pro
2cbd0 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46  xy, dot-file, AF
2cbe0 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c  P, and flock() l
2cbf0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
2cc00 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e  n those.** secon
2cc10 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72  dary files.  For
2cc20 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68   this reason, th
2cc30 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20  e division that 
2cc40 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72  implements.** pr
2cc50 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  oxy locking is l
2cc60 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74  ocated much furt
2cc70 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20  her down in the 
2cc80 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65  file.  But we ne
2cc90 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61  ed.** to go ahea
2cca0 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65  d and define the
2ccb0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2ccc0 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66  ods and finder f
2ccd0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70  unction.** for p
2cce0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72  roxy locking her
2ccf0 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72  e.  So we forwar
2cd00 64 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f  d declare the I/
2cd10 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69  O methods..*/.#i
2cd20 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2cd30 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2cd40 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2cd50 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70  YLE.static int p
2cd60 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65  roxyClose(sqlite
2cd70 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63  3_file*);.static
2cd80 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73   int proxyLock(s
2cd90 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
2cda0 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
2cdb0 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  roxyUnlock(sqlit
2cdc0 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
2cdd0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2cde0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2cdf0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
2ce00 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44   int*);.IOMETHOD
2ce10 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64  S(.  proxyIoFind
2ce20 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
2ce30 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2ce40 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78  n name */.  prox
2ce50 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  yIoMethods,     
2ce60 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2ce70 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2ce80 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
2ce90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cea0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2ceb0 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2cec0 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c  led */.  proxyCl
2ced0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2cee0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2cef0 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  hod */.  proxyLo
2cf00 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2cf10 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2cf20 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c  od */.  proxyUnl
2cf30 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2cf40 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2cf50 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68  hod */.  proxyCh
2cf60 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
2cf70 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
2cf80 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2cf90 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cfb0 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2cfc0 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
2cfd0 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53   nfs lockd on OS
2cfe0 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20  X 10.3+ doesn't 
2cff0 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b  clear write lock
2d000 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f  s when a read lo
2d010 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66  ck is set */.#if
2d020 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2d030 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2d040 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2d050 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
2d060 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  nfsIoFinder,    
2d070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2d080 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
2d090 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74  me */.  nfsIoMet
2d0a0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
2d0b0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2d0c0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2d0d0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0f0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2d100 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2d110 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65  d */.  unixClose
2d120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d130 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2d140 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b  od */.  unixLock
2d150 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d160 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2d170 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63  od */.  nfsUnloc
2d180 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2d190 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
2d1a0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
2d1b0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
2d1c0 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
2d1d0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2d1e0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2d1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d200 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
2d210 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
2d220 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2d230 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2d240 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2d250 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
2d260 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
2d270 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
2d280 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
2d290 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
2d2a0 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
2d2b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
2d2c0 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
2d2d0 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
2d2e0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2d2f0 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
2d300 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
2d310 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
2d320 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61  * This is for Ma
2d330 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  cOSX only..*/.st
2d340 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2d350 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61  e3_io_methods *a
2d360 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
2d370 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
2d380 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
2d390 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
2d3a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2d3b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2d3c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70             /* op
2d3d0 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66  en file object f
2d3e0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2d3f0 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  file */.){.  sta
2d400 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
2d410 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63   Mapping {.    c
2d420 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2d430 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20  system;         
2d440 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74       /* Filesyst
2d450 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a  em type name */.
2d460 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
2d470 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
2d480 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70  ethods;   /* App
2d490 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
2d4a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61   method */.  } a
2d4b0 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Map[] = {.    { 
2d4c0 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "hfs",    &posix
2d4d0 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2d4e0 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f   { "ufs",    &po
2d4f0 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
2d500 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20      { "afpfs",  
2d510 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
2d520 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
2d530 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
2d540 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22  ,.    { "webdav"
2d550 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  , &nolockIoMetho
2d560 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30  ds },.    { 0, 0
2d570 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b   }.  };.  int i;
2d580 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
2d590 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   fsInfo;.  struc
2d5a0 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
2d5b0 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
2d5c0 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
2d5d0 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
2d5e0 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
2d5f0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
2d600 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
2d610 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
2d620 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
2d630 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
2d640 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
2d650 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28  thods;.  }.  if(
2d660 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68   statfs(filePath
2d670 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
2d680 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e   ){.    if( fsIn
2d690 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54  fo.f_flags & MNT
2d6a0 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  _RDONLY ){.     
2d6b0 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
2d6c0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
2d6d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61      for(i=0; aMa
2d6e0 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
2d6f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
2d700 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
2d710 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d  f_fstypename, aM
2d720 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
2d730 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
2d740 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e   return aMap[i].
2d750 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20  pMethods;.      
2d760 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
2d770 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20  * Default case. 
2d780 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74  Handles, amongst
2d790 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a   others, "nfs"..
2d7a0 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72    ** Test byte-r
2d7b0 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20  ange lock using 
2d7c0 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20  fcntl(). If the 
2d7d0 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a  call succeeds, .
2d7e0 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
2d7f0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2d800 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20   supports POSIX 
2d810 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20  style locks. .  
2d820 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
2d830 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
2d840 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
2d850 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
2d860 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
2d870 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
2d880 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
2d890 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
2d8a0 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
2d8b0 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
2d8c0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
2d8d0 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
2d8e0 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29  ame, "nfs")==0 )
2d8f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
2d900 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  nfsIoMethods;.  
2d910 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
2d920 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
2d930 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
2d940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2d950 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  rn &dotlockIoMet
2d960 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
2d970 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2d980 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
2d990 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
2d9a0 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
2d9b0 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
2d9c0 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
2d9d0 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
2d9e0 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
2d9f0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2da00 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2da10 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53  STYLE */..#if OS
2da20 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54  _VXWORKS./*.** T
2da30 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
2da40 63 74 69 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b  ction for VxWork
2da50 73 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  s checks to see 
2da60 69 66 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  if posix advisor
2da70 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  y.** locking wor
2da80 6b 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c  ks.  If it does,
2da90 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 77 68   then that is wh
2daa0 61 74 20 69 73 20 75 73 65 64 2e 20 20 49 66 20  at is used.  If 
2dab0 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77  it does not.** w
2dac0 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61  ork, then fallba
2dad0 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61  ck to named sema
2dae0 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  phore locking..*
2daf0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
2db00 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2db10 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64  s *vxworksIoFind
2db20 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
2db30 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
2db40 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
2db50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2db60 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
2db70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
2db80 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
2db90 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
2dba0 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
2dbb0 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
2dbc0 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
2dbd0 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
2dbe0 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
2dbf0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
2dc00 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
2dc10 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
2dc20 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2dc30 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
2dc40 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
2dc50 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
2dc60 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
2dc70 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
2dc80 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
2dc90 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
2dca0 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
2dcb0 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
2dcc0 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
2dcd0 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
2dce0 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
2dcf0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
2dd00 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
2dd10 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
2dd20 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
2dd30 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
2dd40 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
2dd50 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
2dd60 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
2dd70 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
2dd80 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
2dd90 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
2dda0 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74  return &semIoMet
2ddb0 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
2ddc0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2ddd0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
2dde0 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49  (*const vxworksI
2ddf0 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
2de00 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
2de10 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65  = vxworksIoFinde
2de20 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
2de30 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
2de40 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61  ./*.** An abstra
2de50 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f  ct type for a po
2de60 69 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d  inter to an IO m
2de70 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
2de80 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65  ction:.*/.typede
2de90 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  f const sqlite3_
2dea0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69  io_methods *(*fi
2deb0 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74  nder_type)(const
2dec0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2ded0 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.../**********
2dee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2def0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df20 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
2df30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2df40 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
2df50 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
2df60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
2df80 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
2df90 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2dfa0 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
2dfb0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
2dfc0 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
2dfd0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
2dfe0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2dff0 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
2e000 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
2e010 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74   by pId..*/.stat
2e020 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69  ic int fillInUni
2e030 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  xFile(.  sqlite3
2e040 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2e050 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
2e060 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  fs object */.  i
2e070 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
2e080 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
2e090 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
2e0a0 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  f file being ope
2e0b0 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
2e0c0 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20  _file *pId,     
2e0d0 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65   /* Write to the
2e0e0 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
2e0f0 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
2e100 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2e110 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
2e120 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
2e130 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
2e140 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20  ctrlFlags       
2e150 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
2e160 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76  ore UNIXFILE_* v
2e170 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  alues */.){.  co
2e180 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2e190 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67  ethods *pLocking
2e1a0 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c  Style;.  unixFil
2e1b0 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  e *pNew = (unixF
2e1c0 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74  ile *)pId;.  int
2e1d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e1e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
2e1f0 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29  ->pInode==NULL )
2e200 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69  ;..  /* No locki
2e210 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d  ng occurs in tem
2e220 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a  porary files */.
2e230 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2e240 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46  ame!=0 || (ctrlF
2e250 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
2e260 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20  NOLOCK)!=0 );.. 
2e270 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
2e280 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68     %-3d %s\n", h
2e290 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
2e2a0 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20   pNew->h = h;.  
2e2b0 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66  pNew->pVfs = pVf
2e2c0 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68  s;.  pNew->zPath
2e2d0 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
2e2e0 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2e2f0 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b  = (u8)ctrlFlags;
2e300 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
2e310 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e  MMAP_SIZE>0.  pN
2e320 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  ew->mmapSizeMax 
2e330 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
2e340 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65  onfig.szMmap;.#e
2e350 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
2e360 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28  e3_uri_boolean((
2e370 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
2e380 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69  XFILE_URI) ? zFi
2e390 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20  lename : 0),.   
2e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3b0 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20          "psow", 
2e3c0 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
2e3d0 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
2e3e0 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2e3f0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50  gs |= UNIXFILE_P
2e400 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  SOW;.  }.  if( s
2e410 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d  trcmp(pVfs->zNam
2e420 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d  e,"unix-excl")==
2e430 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
2e440 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2e450 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a  FILE_EXCL;.  }..
2e460 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2e470 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77   pNew->pId = vxw
2e480 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a  orksFindFileId(z
2e490 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
2e4a0 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b   pNew->pId==0 ){
2e4b0 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c  .    ctrlFlags |
2e4c0 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
2e4d0 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
2e4e0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2e4f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
2e500 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49   ctrlFlags & UNI
2e510 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a  XFILE_NOLOCK ){.
2e520 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
2e530 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  e = &nolockIoMet
2e540 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
2e550 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
2e560 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79   = (**(finder_ty
2e570 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61  pe*)pVfs->pAppDa
2e580 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ta)(zFilename, p
2e590 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  New);.#if SQLITE
2e5a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2e5b0 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63  STYLE.    /* Cac
2e5c0 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20  he zFilename in 
2e5d0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
2e5e0 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74  ext (AFP and dot
2e5f0 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66  lock override) f
2e600 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c  or.    ** proxyL
2e610 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69  ock activation i
2e620 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f  s possible (remo
2e630 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65  te proxy is base
2e640 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20  d on db name).  
2e650 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72    ** zFilename r
2e660 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
2e670 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  il file is close
2e680 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f  d, to support */
2e690 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2e6a0 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69  ngContext = (voi
2e6b0 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65  d*)zFilename;.#e
2e6c0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
2e6d0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2e6e0 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2e6f0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2e700 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2e710 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2e720 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c  _STYLE.    || pL
2e730 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2e740 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e  nfsIoMethods.#en
2e750 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
2e760 45 5f 53 48 41 52 45 44 5f 4d 41 50 50 49 4e 47  E_SHARED_MAPPING
2e770 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67  .    || pLocking
2e780 53 74 79 6c 65 20 3d 3d 20 26 6e 6f 6c 6f 63 6b  Style == &nolock
2e790 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66  IoMethods.#endif
2e7a0 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e  .  ){.    unixEn
2e7b0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
2e7c0 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
2e7d0 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
2e7e0 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  pInode);.    if(
2e7f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e800 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e  {.      /* If an
2e810 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2e820 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  in findInodeInfo
2e830 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69  (), close the fi
2e840 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20  le descriptor.  
2e850 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
2e860 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61  ly, before relea
2e870 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20  sing the mutex. 
2e880 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20  findInodeInfo() 
2e890 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a  may fail.      *
2e8a0 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  * in two scenari
2e8b0 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  os:.      **.   
2e8c0 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61     **   (a) A ca
2e8d0 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61  ll to fstat() fa
2e8e0 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20  iled..      **  
2e8f0 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61   (b) A malloc fa
2e900 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  iled..      **. 
2e910 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f       ** Scenario
2e920 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63   (b) may only oc
2e930 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65  cur if the proce
2e940 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f  ss is holding no
2e950 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
2e960 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2e970 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
2e980 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
2e990 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65   were other file
2e9a0 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
2e9b0 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69  ptors on this fi
2e9c0 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c  le, then no mall
2e9d0 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75  oc would be requ
2e9e0 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
2e9f0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
2ea00 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
2ea10 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69   case, it is qui
2ea20 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65  te safe to close
2ea30 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  .      ** handle
2ea40 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75   h - as it is gu
2ea50 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f  aranteed that no
2ea60 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c   posix locks wil
2ea70 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20  l be released.  
2ea80 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20      ** by doing 
2ea90 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  so..      **.   
2eaa0 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69     ** If scenari
2eab0 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65  o (a) caused the
2eac0 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e   error then thin
2ead0 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61  gs are not so sa
2eae0 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  fe. The.      **
2eaf0 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70   implicit assump
2eb00 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61  tion here is tha
2eb10 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69  t if fstat() fai
2eb20 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69  ls, things are i
2eb30 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20  n.      ** such 
2eb40 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64  bad shape that d
2eb50 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f  ropping a lock o
2eb60 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61  r two doesn't ma
2eb70 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20  tter much..     
2eb80 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74   */.      robust
2eb90 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
2eba0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
2ebb0 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20   h = -1;.    }. 
2ebc0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2ebd0 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51  x();.  }..#if SQ
2ebe0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2ebf0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
2ec00 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
2ec10 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
2ec20 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70  ingStyle == &afp
2ec30 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2ec40 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20   /* AFP locking 
2ec50 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
2ec60 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
2ec70 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
2ec80 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c  .    ** the afpL
2ec90 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20  ockingContext.. 
2eca0 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63     */.    afpLoc
2ecb0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
2ecc0 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  x;.    pNew->loc
2ecd0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
2ece0 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  tx = sqlite3_mal
2ecf0 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
2ed00 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Ctx) );.    if( 
2ed10 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pCtx==0 ){.     
2ed20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2ed30 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  EM_BKPT;.    }el
2ed40 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a  se{.      /* NB:
2ed50 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74   zFilename exist
2ed60 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61  s and remains va
2ed70 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  lid until the fi
2ed80 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20  le is closed.   
2ed90 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20     ** according 
2eda0 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46  to requirement F
2edb0 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f  11141.  So we do
2edc0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b   not need to mak
2edd0 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
2ede0 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d  y of the filenam
2edf0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78  e. */.      pCtx
2ee00 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65  ->dbPath = zFile
2ee10 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78  name;.      pCtx
2ee20 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  ->reserved = 0;.
2ee30 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76        srandomdev
2ee40 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e  ();.      unixEn
2ee50 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
2ee60 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
2ee70 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
2ee80 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20  ->pInode);.     
2ee90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2eea0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
2eeb0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d  lite3_free(pNew-
2eec0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
2eed0 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74  ;.        robust
2eee0 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
2eef0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
2ef00 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20     h = -1;.     
2ef10 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61   }.      unixLea
2ef20 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20  veMutex();      
2ef30 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e    .    }.  }.#en
2ef40 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20  dif..  else if( 
2ef50 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2ef60 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
2ef70 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74  ds ){.    /* Dot
2ef80 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65  file locking use
2ef90 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
2efa0 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
2efb0 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
2efc0 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b    ** the dotlock
2efd0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a  LockingContext .
2efe0 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20      */.    char 
2eff0 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20  *zLockFile;.    
2f000 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20  int nFilename;. 
2f010 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65     assert( zFile
2f020 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e  name!=0 );.    n
2f030 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29  Filename = (int)
2f040 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  strlen(zFilename
2f050 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b  ) + 6;.    zLock
2f060 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73  File = (char *)s
2f070 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
2f080 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
2f090 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30  if( zLockFile==0
2f0a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2f0b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2f0c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f0d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2f0e0 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a  ntf(nFilename, z
2f0f0 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44  LockFile, "%s" D
2f100 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a  OTLOCK_SUFFIX, z
2f110 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Filename);.    }
2f120 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2f130 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63  ngContext = zLoc
2f140 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20  kFile;.  }..#if 
2f150 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73  OS_VXWORKS.  els
2f160 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
2f170 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74  yle == &semIoMet
2f180 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  hods ){.    /* N
2f190 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
2f1a0 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
2f1b0 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
2f1c0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
2f1d0 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  ** included in t
2f1e0 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e  he semLockingCon
2f1f0 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20  text.    */.    
2f200 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2f210 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
2f220 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
2f230 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
2f240 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
2f250 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d  TE_OK) && (pNew-
2f260 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e  >pInode->pSem==N
2f270 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68  ULL) ){.      ch
2f280 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70  ar *zSemName = p
2f290 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65  New->pInode->aSe
2f2a0 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74  mName;.      int
2f2b0 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   n;.      sqlite
2f2c0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
2f2d0 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d  ATHNAME, zSemNam
2f2e0 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20  e, "/%s.sem",.  
2f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f300 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e       pNew->pId->
2f310 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b  zCanonicalName);
2f320 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b  .      for( n=1;
2f330 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b   zSemName[n]; n+
2f340 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20  + ).        if( 
2f350 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27  zSemName[n]=='/'
2f360 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d   ) zSemName[n] =
2f370 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77   '_';.      pNew
2f380 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
2f390 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61   sem_open(zSemNa
2f3a0 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36  me, O_CREAT, 066
2f3b0 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  6, 1);.      if(
2f3c0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
2f3d0 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45  Sem == SEM_FAILE
2f3e0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  D ){.        rc 
2f3f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2f400 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  KPT;.        pNe
2f410 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
2f420 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ame[0] = '\0';. 
2f430 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2f440 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2f450 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2f460 0a 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e  .  storeLastErrn
2f470 6f 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20  o(pNew, 0);.#if 
2f480 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
2f490 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f4a0 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
2f4b0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2f4c0 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2f4d0 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20  ;.    h = -1;.  
2f4e0 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65    osUnlink(zFile
2f4f0 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d  name);.    pNew-
2f500 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
2f510 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20  IXFILE_DELETE;. 
2f520 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
2f530 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f540 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
2f550 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2f560 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2f570 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
2f580 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c  ew->pMethod = pL
2f590 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20  ockingStyle;.   
2f5a0 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
2f5b0 3b 0a 20 20 20 20 76 65 72 69 66 79 44 62 46 69  ;.    verifyDbFi
2f5c0 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20  le(pNew);.  }.  
2f5d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2f5e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
2f5f0 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
2f600 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70  ry in which to p
2f610 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ut temporary fil
2f620 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  es..** If no sui
2f630 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  table temporary 
2f640 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63  file directory c
2f650 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  an be found, ret
2f660 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
2f670 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2f680 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
2f690 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
2f6a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
2f6b0 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c  rs[] = {.     0,
2f6c0 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f  .     0,.     "/
2f6d0 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  var/tmp",.     "
2f6e0 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
2f6f0 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22  "/tmp",.     "."
2f700 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  .  };.  unsigned
2f710 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 73 74   int i = 0;.  st
2f720 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
2f730 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
2f740 72 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  r = sqlite3_temp
2f750 5f 64 69 72 65 63 74 6f 72 79 3b 0a 0a 20 20 69  _directory;..  i
2f760 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20  f( !azDirs[0] ) 
2f770 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65  azDirs[0] = gete
2f780 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49  nv("SQLITE_TMPDI
2f790 52 22 29 3b 0a 20 20 69 66 28 20 21 61 7a 44 69  R");.  if( !azDi
2f7a0 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31  rs[1] ) azDirs[1
2f7b0 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44  ] = getenv("TMPD
2f7c0 49 52 22 29 3b 0a 20 20 77 68 69 6c 65 28 31 29  IR");.  while(1)
2f7d0 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 21 3d  {.    if( zDir!=
2f7e0 30 0a 20 20 20 20 20 26 26 20 6f 73 53 74 61 74  0.     && osStat
2f7f0 28 7a 44 69 72 2c 20 26 62 75 66 29 3d 3d 30 0a  (zDir, &buf)==0.
2f800 20 20 20 20 20 26 26 20 53 5f 49 53 44 49 52 28       && S_ISDIR(
2f810 62 75 66 2e 73 74 5f 6d 6f 64 65 29 0a 20 20 20  buf.st_mode).   
2f820 20 20 26 26 20 6f 73 41 63 63 65 73 73 28 7a 44    && osAccess(zD
2f830 69 72 2c 20 30 33 29 3d 3d 30 0a 20 20 20 20 29  ir, 03)==0.    )
2f840 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 7a  {.      return z
2f850 44 69 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Dir;.    }.    i
2f860 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 7a 44  f( i>=sizeof(azD
2f870 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69  irs)/sizeof(azDi
2f880 72 73 5b 30 5d 29 20 29 20 62 72 65 61 6b 3b 0a  rs[0]) ) break;.
2f890 20 20 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72      zDir = azDir
2f8a0 73 5b 69 2b 2b 5d 3b 0a 20 20 7d 0a 20 20 72 65  s[i++];.  }.  re
2f8b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2f8c0 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
2f8d0 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
2f8e0 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
2f8f0 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  t be allocated.*
2f900 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
2f910 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73   process and mus
2f920 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
2f930 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  to hold at least
2f940 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  .** pVfs->mxPath
2f950 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  name bytes..*/.s
2f960 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
2f970 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
2f980 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2f990 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2f9a0 44 69 72 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  Dir;.  int iLimi
2f9b0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 27  t = 0;..  /* It'
2f9c0 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
2f9d0 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
2f9e0 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
2f9f0 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
2fa00 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
2fa10 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
2fa20 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
2fa30 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
2fa40 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
2fa50 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f  n failing. .  */
2fa60 0a 20 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a  .  zBuf[0] = 0;.
2fa70 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
2fa80 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
2fa90 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69  _IOERR );..  zDi
2faa0 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65  r = unixTempFile
2fab0 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69  Dir();.  if( zDi
2fac0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
2fad0 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
2fae0 4d 50 50 41 54 48 3b 0a 20 20 64 6f 7b 0a 20 20  MPPATH;.  do{.  
2faf0 20 20 75 36 34 20 72 3b 0a 20 20 20 20 73 71 6c    u64 r;.    sql
2fb00 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
2fb10 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a  sizeof(r), &r);.
2fb20 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66      assert( nBuf
2fb30 3e 32 20 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6e  >2 );.    zBuf[n
2fb40 42 75 66 2d 32 5d 20 3d 20 30 3b 0a 20 20 20 20  Buf-2] = 0;.    
2fb50 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2fb60 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73  (nBuf, zBuf, "%s
2fb70 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  /"SQLITE_TEMP_FI
2fb80 4c 45 5f 50 52 45 46 49 58 22 25 6c 6c 78 25 63  LE_PREFIX"%llx%c
2fb90 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2fba0 20 20 20 20 20 20 20 20 7a 44 69 72 2c 20 72 2c          zDir, r,
2fbb0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75   0);.    if( zBu
2fbc0 66 5b 6e 42 75 66 2d 32 5d 21 3d 30 20 7c 7c 20  f[nBuf-2]!=0 || 
2fbd0 28 69 4c 69 6d 69 74 2b 2b 29 3e 31 30 20 29 20  (iLimit++)>10 ) 
2fbe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2fbf0 52 4f 52 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f  ROR;.  }while( o
2fc00 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d  sAccess(zBuf,0)=
2fc10 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
2fc20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
2fc30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2fc40 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
2fc50 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2fc60 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  _)./*.** Routine
2fc70 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
2fc80 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20  unixFile into a 
2fc90 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e  proxy-locking un
2fca0 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65  ixFile..** Imple
2fcb0 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65  mentation in the
2fcc0 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69   proxy-lock divi
2fcd0 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62  sion, but used b
2fce0 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20  y unixOpen().** 
2fcf0 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
2fd00 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69  _PROXY_LOCKING i
2fd10 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  s defined..*/.st
2fd20 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72  atic int proxyTr
2fd30 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
2fd40 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74  unixFile*, const
2fd50 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a   char*);.#endif.
2fd60 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
2fd70 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
2fd80 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
2fd90 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74   was opened on t
2fda0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
2fdb0 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
2fdc0 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f  nal or master-jo
2fdd0 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e  urnal file) iden
2fde0 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61  tified by pathna
2fdf0 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68  me.** zPath with
2fe00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58   SQLITE_OPEN_XXX
2fe10 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20   flags matching 
2fe20 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20  those passed as 
2fe30 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
2fe40 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2fe50 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53  unction..**.** S
2fe60 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72  uch a file descr
2fe70 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20  iptor may exist 
2fe80 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  if a database co
2fe90 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f  nnection was clo
2fea0 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61  sed.** but the a
2feb0 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64  ssociated file d
2fec0 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20  escriptor could 
2fed0 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65  not be closed be
2fee0 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74  cause some.** ot
2fef0 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
2ff00 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  tor open on the 
2ff10 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c  same file is hol
2ff20 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b  ding a file-lock
2ff30 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f  ..** Refer to co
2ff40 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e  mments in the un
2ff50 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69  ixClose() functi
2ff60 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74  on and the lengt
2ff70 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65  hy comment.** de
2ff80 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20  scribing "Posix 
2ff90 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67  Advisory Locking
2ffa0 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  " at the start o
2ffb0 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  f this file for 
2ffc0 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61  .** further deta
2ffd0 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65  ils. Also, ticke
2ffe0 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49  t #4018..**.** I
2fff0 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c  f a suitable fil
30000 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
30010 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69  found, then it i
30020 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  s returned. If n
30030 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64  o.** such file d
30040 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63  escriptor is loc
30050 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ated, -1 is retu
30060 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
30070 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69  UnixUnusedFd *fi
30080 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e  ndReusableFd(con
30090 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
300a0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e  int flags){.  Un
300b0 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
300c0 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  sed = 0;..  /* D
300d0 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72  o not search for
300e0 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
300f0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78  descriptor on vx
30100 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75  works. Not becau
30110 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20  se.  ** vxworks 
30120 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69  would not benefi
30130 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67  t from the chang
30140 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27  e (it might, we'
30150 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20  re not sure),.  
30160 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e  ** but because n
30170 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74  o way to test it
30180 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76   is currently av
30190 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62  ailable. It is b
301a0 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20  etter .  ** not 
301b0 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67  to risk breaking
301c0 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74   vxworks support
301d0 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66   for the sake of
301e0 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65   such an obscure
301f0 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20   .  ** feature. 
30200 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f   */.#if !OS_VXWO
30210 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61  RKS.  struct sta
30220 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
30230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
30240 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20  sults of stat() 
30250 63 61 6c 6c 20 2a 2f 0a 0a 20 20 75 6e 69 78 45  call */..  unixE
30260 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20  nterMutex();..  
30270 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c  /* A stat() call
30280 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61   may fail for va
30290 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49  rious reasons. I
302a0 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
302b0 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73  it is.  ** almos
302c0 74 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 61  t certain that a
302d0 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e  n open() call on
302e0 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 20 77   the same path w
302f0 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20  ill also fail.. 
30300 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61   ** For this rea
30310 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  son, if an error
30320 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 73   occurs in the s
30330 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c  tat() call here,
30340 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f   it is.  ** igno
30350 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65  red and -1 is re
30360 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  turned. The call
30370 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f  er will try to o
30380 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20  pen a new file. 
30390 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f   ** descriptor o
303a0 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c  n the same path,
303b0 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72   fail, and retur
303c0 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51  n an error to SQ
303d0 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Lite..  **.  ** 
303e0 45 76 65 6e 20 69 66 20 61 20 73 75 62 73 65 71  Even if a subseq
303f0 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c  uent open() call
30400 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74   does succeed, t
30410 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20  he consequences 
30420 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72  of.  ** not sear
30430 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65 75 73  ching for a reus
30440 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  able file descri
30450 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72  ptor are not dir
30460 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 6e 6f  e.  */.  if( ino
30470 64 65 4c 69 73 74 21 3d 30 20 26 26 20 30 3d 3d  deList!=0 && 0==
30480 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 73  osStat(zPath, &s
30490 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69  Stat) ){.    uni
304a0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
304b0 64 65 3b 0a 0a 20 20 20 20 70 49 6e 6f 64 65 20  de;..    pInode 
304c0 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
304d0 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
304e0 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  & (pInode->fileI
304f0 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f  d.dev!=sStat.st_
30500 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20  dev.            
30510 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f           || pIno
30520 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d  de->fileId.ino!=
30530 28 75 36 34 29 73 53 74 61 74 2e 73 74 5f 69 6e  (u64)sStat.st_in
30540 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e  o) ){.       pIn
30550 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ode = pInode->pN
30560 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
30570 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20  f( pInode ){.   
30580 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20     UnixUnusedFd 
30590 2a 2a 70 70 3b 0a 20 20 20 20 20 20 61 73 73 65  **pp;.      asse
305a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
305b0 78 5f 6e 6f 74 68 65 6c 64 28 70 49 6e 6f 64 65  x_notheld(pInode
305c0 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 20 29 3b  ->pLockMutex) );
305d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
305e0 75 74 65 78 5f 65 6e 74 65 72 28 70 49 6e 6f 64  utex_enter(pInod
305f0 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a  e->pLockMutex);.
30600 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49        for(pp=&pI
30610 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a  node->pUnused; *
30620 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61  pp && (*pp)->fla
30630 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28  gs!=flags; pp=&(
30640 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a  (*pp)->pNext));.
30650 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
30660 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *pp;.      if( p
30670 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
30680 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d    *pp = pUnused-
30690 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
306a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
306b0 74 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65  tex_leave(pInode
306c0 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20  ->pLockMutex);. 
306d0 20 20 20 7d 0a 20 20 7d 0a 20 20 75 6e 69 78 4c     }.  }.  unixL
306e0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 23 65 6e  eaveMutex();.#en
306f0 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53  dif    /* if !OS
30700 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65  _VXWORKS */.  re
30710 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a  turn pUnused;.}.
30720 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
30730 6d 6f 64 65 2c 20 75 69 64 20 61 6e 64 20 67 69  mode, uid and gi
30740 64 20 6f 66 20 66 69 6c 65 20 7a 46 69 6c 65 2e  d of file zFile.
30750 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
30760 67 65 74 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63  getFileMode(.  c
30770 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
30780 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
30790 2a 20 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  * File name */. 
307a0 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20   mode_t *pMode, 
307b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307c0 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73   /* OUT: Permiss
307d0 69 6f 6e 73 20 6f 66 20 7a 46 69 6c 65 20 2a 2f  ions of zFile */
307e0 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20  .  uid_t *pUid, 
307f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30800 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 6f     /* OUT: uid o
30810 66 20 7a 46 69 6c 65 2e 20 2a 2f 0a 20 20 67 69  f zFile. */.  gi
30820 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20 20  d_t *pGid       
30830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30840 20 4f 55 54 3a 20 67 69 64 20 6f 66 20 7a 46 69   OUT: gid of zFi
30850 6c 65 2e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  le. */.){.  stru
30860 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
30870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
30880 75 74 70 75 74 20 6f 66 20 73 74 61 74 28 29 20  utput of stat() 
30890 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
308a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
308b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
308c0 30 3d 3d 6f 73 53 74 61 74 28 7a 46 69 6c 65 2c  0==osStat(zFile,
308d0 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
308e0 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73  *pMode = sStat.s
308f0 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20  t_mode & 0777;. 
30900 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74 61 74     *pUid = sStat
30910 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 2a 70 47  .st_uid;.    *pG
30920 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69  id = sStat.st_gi
30930 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
30940 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
30950 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 72  R_FSTAT;.  }.  r
30960 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
30970 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
30980 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e   is called by un
30990 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65  ixOpen() to dete
309a0 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70  rmine the unix p
309b0 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f  ermissions.** to
309c0 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65   create new file
309d0 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72  s with. If no er
309e0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
309f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
30a00 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20  turned.** and a 
30a10 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66  value suitable f
30a20 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74 68  or passing as th
30a30 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
30a40 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a   to open(2) is.*
30a50 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d  * written to *pM
30a60 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ode. If an IO er
30a70 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
30a80 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
30a90 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
30aa0 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
30ab0 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20  f *pMode is not 
30ac0 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
30ad0 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 74  In most cases, t
30ae0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
30af0 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68   *pMode to 0, wh
30b00 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a  ich will become.
30b10 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e  ** an indication
30b20 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28   to robust_open(
30b30 29 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  ) to create the 
30b40 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51  file using.** SQ
30b50 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
30b60 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 61 64  E_PERMISSIONS ad
30b70 6a 75 73 74 65 64 20 62 79 20 74 68 65 20 75 6d  justed by the um
30b80 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74  ask..** But if t
30b90 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
30ba0 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72  ened is a WAL or
30bb0 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
30bc0 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   file, then .** 
30bd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75  this function qu
30be0 65 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73  eries the file-s
30bf0 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65  ystem for the pe
30c00 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
30c10 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
30c20 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
30c30 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65   and sets *pMode
30c40 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20   to this value. 
30c50 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73  Whenever .** pos
30c60 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a  sible, WAL and j
30c70 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
30c80 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
30c90 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
30ca0 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61  ons .** as the a
30cb0 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
30cc0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
30cd0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  f the SQLITE_ENA
30ce0 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70  BLE_8_3_NAMES op
30cf0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
30d00 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69   then the.** ori
30d10 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  ginal filename i
30d20 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20  s unavailable.  
30d30 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73  But 8_3_NAMES is
30d40 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a   only used for.*
30d50 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d  * FAT filesystem
30d60 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e  s and permission
30d70 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20  s do not matter 
30d80 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75  there, so just u
30d90 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  se.** the defaul
30da0 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a  t permissions..*
30db0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
30dc0 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
30dd0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
30de0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
30df0 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69     /* Path of fi
30e00 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65  le (possibly) be
30e10 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20  ing created */. 
30e20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
30e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e40 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
30e50 20 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74   as 4th argument
30e60 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20   to xOpen() */. 
30e70 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20   mode_t *pMode, 
30e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e90 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73   /* OUT: Permiss
30ea0 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c  ions to open fil
30eb0 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f  e with */.  uid_
30ec0 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20  t *pUid,        
30ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
30ee0 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20 6f  UT: uid to set o
30ef0 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
30f00 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20  gid_t *pGid     
30f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20 73  /* OUT: gid to s
30f30 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a  et on the file *
30f40 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
30f50 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
30f60 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
30f70 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64   Code */.  *pMod
30f80 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d  e = 0;.  *pUid =
30f90 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b   0;.  *pGid = 0;
30fa0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28  .  if( flags & (
30fb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c  SQLITE_OPEN_WAL|
30fc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
30fd0 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20  _JOURNAL) ){.   
30fe0 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41   char zDb[MAX_PA
30ff0 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f  THNAME+1];     /
31000 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
31010 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20  path */.    int 
31020 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  nDb;            
31030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
31040 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74  ber of valid byt
31050 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 0a 20 20  es in zDb */..  
31060 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20    /* zPath is a 
31070 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72  path to a WAL or
31080 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
31090 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
310a0 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a  ck derives.    *
310b0 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  * the path to th
310c0 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
310d0 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20  abase file from 
310e0 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63  zPath. This bloc
310f0 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a  k handles.    **
31100 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e   the following n
31110 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  aming convention
31120 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
31130 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
31140 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a  -journal".    **
31150 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
31160 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  -wal".    **   "
31170 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
31180 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20  rnalNN".    **  
31190 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
311a0 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20  alNN".    **.   
311b0 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20   ** where NN is 
311c0 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72  a decimal number
311d0 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20  . The NN naming 
311e0 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20  schemes are .   
311f0 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20   ** used by the 
31200 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63  test_multiplex.c
31210 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a   module..    */.
31220 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65      nDb = sqlite
31230 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29  3Strlen30(zPath)
31240 20 2d 20 31 3b 20 0a 20 20 20 20 77 68 69 6c 65   - 1; .    while
31250 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d  ( zPath[nDb]!='-
31260 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  ' ){.      /* In
31270 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f   normal operatio
31280 6e 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  n, the journal f
31290 69 6c 65 20 6e 61 6d 65 20 77 69 6c 6c 20 61 6c  ile name will al
312a0 77 61 79 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20  ways contain.   
312b0 20 20 20 2a 2a 20 61 20 27 2d 27 20 63 68 61 72     ** a '-' char
312c0 61 63 74 65 72 2e 20 20 48 6f 77 65 76 65 72 20  acter.  However 
312d0 69 6e 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 20  in 8+3 filename 
312e0 6d 6f 64 65 2c 20 6f 72 20 69 66 20 61 20 63 6f  mode, or if a co
312f0 72 72 75 70 74 0a 20 20 20 20 20 20 2a 2a 20 72  rrupt.      ** r
31300 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
31310 73 70 65 63 69 66 69 65 73 20 61 20 6d 61 73 74  specifies a mast
31320 65 72 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 20  er journal with 
31330 61 20 67 6f 6f 66 79 20 6e 61 6d 65 2c 20 74 68  a goofy name, th
31340 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
31350 27 2d 27 20 6d 69 67 68 74 20 62 65 20 6d 69 73  '-' might be mis
31360 73 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69  sing. */.      i
31370 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61  f( nDb==0 || zPa
31380 74 68 5b 6e 44 62 5d 3d 3d 27 2e 27 20 29 20 72  th[nDb]=='.' ) r
31390 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
313a0 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20  .      nDb--;.  
313b0 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a    }.    memcpy(z
313c0 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b  Db, zPath, nDb);
313d0 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20  .    zDb[nDb] = 
313e0 27 5c 30 27 3b 0a 0a 20 20 20 20 72 63 20 3d 20  '\0';..    rc = 
313f0 67 65 74 46 69 6c 65 4d 6f 64 65 28 7a 44 62 2c  getFileMode(zDb,
31400 20 70 4d 6f 64 65 2c 20 70 55 69 64 2c 20 70 47   pMode, pUid, pG
31410 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  id);.  }else if(
31420 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
31430 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
31440 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65  SE ){.    *pMode
31450 20 3d 20 30 36 30 30 3b 0a 20 20 7d 65 6c 73 65   = 0600;.  }else
31460 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
31470 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 7b 0a  ITE_OPEN_URI ){.
31480 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
31490 73 20 61 20 6d 61 69 6e 20 64 61 74 61 62 61 73  s a main databas
314a0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
314b0 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 75  ile was opened u
314c0 73 69 6e 67 20 61 20 55 52 49 0a 20 20 20 20 2a  sing a URI.    *
314d0 2a 20 66 69 6c 65 6e 61 6d 65 2c 20 63 68 65 63  * filename, chec
314e0 6b 20 66 6f 72 20 74 68 65 20 22 6d 6f 64 65 6f  k for the "modeo
314f0 66 22 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66  f" parameter. If
31500 20 70 72 65 73 65 6e 74 2c 20 69 6e 74 65 72 70   present, interp
31510 72 65 74 0a 20 20 20 20 2a 2a 20 69 74 73 20 76  ret.    ** its v
31520 61 6c 75 65 20 61 73 20 61 20 66 69 6c 65 6e 61  alue as a filena
31530 6d 65 20 61 6e 64 20 74 72 79 20 74 6f 20 63 6f  me and try to co
31540 70 79 20 74 68 65 20 6d 6f 64 65 2c 20 75 69 64  py the mode, uid
31550 20 61 6e 64 20 67 69 64 20 66 72 6f 6d 0a 20 20   and gid from.  
31560 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 2e 20    ** that file. 
31570 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
31580 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
31590 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 50  uri_parameter(zP
315a0 61 74 68 2c 20 22 6d 6f 64 65 6f 66 22 29 3b 0a  ath, "modeof");.
315b0 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20      if( z ){.   
315c0 20 20 20 72 63 20 3d 20 67 65 74 46 69 6c 65 4d     rc = getFileM
315d0 6f 64 65 28 7a 2c 20 70 4d 6f 64 65 2c 20 70 55  ode(z, pMode, pU
315e0 69 64 2c 20 70 47 69 64 29 3b 0a 20 20 20 20 7d  id, pGid);.    }
315f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
31600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
31610 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
31620 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
31630 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
31640 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
31650 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
31660 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
31670 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
31680 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
31690 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
316a0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
316b0 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
316c0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
316d0 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
316e0 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
316f0 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
31700 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
31710 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
31720 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
31730 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
31740 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
31750 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
31760 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
31770 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
31780 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
31790 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
317a0 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
317b0 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
317c0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
317d0 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
317e0 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
317f0 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
31800 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
31810 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
31820 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
31830 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
31840 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
31850 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
31860 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
31870 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
31880 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
31890 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
318a0 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
318b0 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
318c0 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
318d0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
318e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
318f0 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
31900 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
31910 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
31920 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
31930 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
31940 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
31950 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
31960 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
31970 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
31980 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
31990 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
319a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
319b0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
319c0 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
319d0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
319e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319f0 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
31a00 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
31a10 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
31a20 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
31a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
31a40 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
31a50 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
31a60 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  e */.){.  unixFi
31a70 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
31a80 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
31a90 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20   fd = -1;       
31aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
31ab0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72  ile descriptor r
31ac0 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28  eturned by open(
31ad0 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46  ) */.  int openF
31ae0 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
31af0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
31b00 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
31b10 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
31b20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
31b30 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
31b40 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
31b50 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20    int noLock;   
31b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b70 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
31b80 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
31b90 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ves */.  int rc 
31ba0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
31bb0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
31bc0 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
31bd0 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61  */.  int ctrlFla
31be0 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
31bf0 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f      /* UNIXFILE_
31c00 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e  * flags */..  in
31c10 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
31c20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
31c30 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
31c40 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
31c50 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
31c60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
31c70 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
31c80 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
31c90 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
31ca0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
31cb0 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
31cc0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
31cd0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
31ce0 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
31cf0 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
31d00 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
31d10 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51  ADWRITE);.#if SQ
31d20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
31d30 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
31d40 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28  isAutoProxy  = (
31d50 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
31d60 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a  PEN_AUTOPROXY);.
31d70 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
31d80 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
31d90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
31da0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73  OCKING_STYLE.  s
31db0 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
31dc0 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  nfo;.#endif..  /
31dd0 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
31de0 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66  master or main-f
31df0 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69  ile journal, thi
31e00 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
31e10 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65  open.  ** a file
31e20 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74  -descriptor on t
31e30 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f  he directory too
31e40 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  . The first time
31e50 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a   unixSync().  **
31e60 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64   is called the d
31e70 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
31e80 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
31e90 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63   fsync()ed and c
31ea0 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20  lose()d..  */.  
31eb0 69 6e 74 20 69 73 4e 65 77 4a 72 6e 6c 20 3d 20  int isNewJrnl = 
31ec0 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
31ed0 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
31ee0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
31ef0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
31f00 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
31f10 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
31f20 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
31f30 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
31f40 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  L.  ));..  /* If
31f50 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
31f60 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
31f70 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
31f80 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
31f90 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
31fa0 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
31fb0 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
31fc0 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
31fd0 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
31fe0 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f  ar zTmpname[MAX_
31ff0 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63  PATHNAME+2];.  c
32000 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
32010 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20   = zPath;..  /* 
32020 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
32030 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
32040 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20  re true: .  **. 
32050 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
32060 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
32070 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
32080 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
32090 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a  e set, and .  **
320a0 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
320b0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
320c0 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
320d0 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
320e0 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
320f0 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
32100 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
32110 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
32120 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
32130 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
32140 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
32150 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
32160 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
32170 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
32180 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
32190 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
321a0 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
321b0 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
321c0 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
321d0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
321e0 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
321f0 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
32200 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
32210 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
32220 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
32230 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
32240 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
32250 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
32260 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d  ever .  ** autom
32270 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
32280 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65  . Nor are they e
32290 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ver temporary fi
322a0 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
322b0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
322c0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
322d0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
322e0 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  IN_DB );.  asser
322f0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
32300 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
32310 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
32320 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
32330 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
32340 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
32350 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
32360 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
32370 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
32380 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
32390 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
323a0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
323b0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
323c0 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
323d0 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
323e0 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
323f0 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
32400 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
32410 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
32420 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
32430 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
32440 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  _DB .       || e
32450 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
32460 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
32470 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
32480 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
32490 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
324a0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
324b0 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
324c0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
324d0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
324e0 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
324f0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
32500 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20  TRANSIENT_DB || 
32510 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
32520 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f  EN_WAL.  );..  /
32530 2a 20 44 65 74 65 63 74 20 61 20 70 69 64 20 63  * Detect a pid c
32540 68 61 6e 67 65 20 61 6e 64 20 72 65 73 65 74 20  hange and reset 
32550 74 68 65 20 50 52 4e 47 2e 20 20 54 68 65 72 65  the PRNG.  There
32560 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
32570 74 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73  tion.  ** here s
32580 75 63 68 20 74 68 61 74 20 74 77 6f 20 6f 72 20  uch that two or 
32590 6d 6f 72 65 20 74 68 72 65 61 64 73 20 61 6c 6c  more threads all
325a0 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20   trying to open 
325b0 64 61 74 61 62 61 73 65 73 20 61 74 0a 20 20 2a  databases at.  *
325c0 2a 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74 61  * the same insta
325d0 6e 74 20 6d 69 67 68 74 20 61 6c 6c 20 72 65 73  nt might all res
325e0 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20 42 75  et the PRNG.  Bu
325f0 74 20 6d 75 6c 74 69 70 6c 65 20 72 65 73 65 74  t multiple reset
32600 73 0a 20 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c  s.  ** are harml
32610 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
32620 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d 6f  randomnessPid!=o
32630 73 47 65 74 70 69 64 28 30 29 20 29 7b 0a 20 20  sGetpid(0) ){.  
32640 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20    randomnessPid 
32650 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b 0a 20  = osGetpid(0);. 
32660 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
32670 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d 0a  mness(0,0);.  }.
32680 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
32690 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
326a0 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
326b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
326c0 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55  _DB ){.    UnixU
326d0 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
326e0 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  ;.    pUnused = 
326f0 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a  findReusableFd(z
32700 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Name, flags);.  
32710 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
32720 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75  .      fd = pUnu
32730 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c  sed->fd;.    }el
32740 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  se{.      pUnuse
32750 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
32760 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e  oc64(sizeof(*pUn
32770 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66  used));.      if
32780 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
32790 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
327a0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
327b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
327c0 20 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74    p->pPreallocat
327d0 65 64 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73  edUnused = pUnus
327e0 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61  ed;..    /* Data
327f0 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  base filenames a
32800 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  re double-zero t
32810 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65  erminated if the
32820 79 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a  y are not.    **
32830 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d   URIs with param
32840 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74  eters.  Hence, t
32850 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62  hey can always b
32860 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20  e passed into.  
32870 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69    ** sqlite3_uri
32880 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f  _parameter(). */
32890 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c  .    assert( (fl
328a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
328b0 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b  N_URI) || zName[
328c0 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d  strlen(zName)+1]
328d0 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20  ==0 );..  }else 
328e0 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20  if( !zName ){.  
328f0 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
32900 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72   NULL, the upper
32910 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73   layer is reques
32920 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65  ting a temp file
32930 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
32940 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4e  isDelete && !isN
32950 65 77 4a 72 6e 6c 29 3b 0a 20 20 20 20 72 63 20  ewJrnl);.    rc 
32960 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  = unixGetTempnam
32970 65 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  e(pVfs->mxPathna
32980 6d 65 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  me, zTmpname);. 
32990 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
329a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
329b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
329c0 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e     zName = zTmpn
329d0 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  ame;..    /* Gen
329e0 65 72 61 74 65 64 20 74 65 6d 70 6f 72 61 72 79  erated temporary
329f0 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 61   filenames are a
32a00 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72  lways double-zer
32a10 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 20  o terminated.   
32a20 20 2a 2a 20 66 6f 72 20 75 73 65 20 62 79 20 73   ** for use by s
32a30 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
32a40 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61  eter(). */.    a
32a50 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72  ssert( zName[str
32a60 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30  len(zName)+1]==0
32a70 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65   );.  }..  /* De
32a80 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75  termine the valu
32a90 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70  e of the flags p
32aa0 61 72 61 6d 65 74 65 72 20 70 61 73 73 65 64 20  arameter passed 
32ab0 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f  to POSIX functio
32ac0 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54  n.  ** open(). T
32ad0 68 65 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c  hese must be cal
32ae0 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20  culated even if 
32af0 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61  open() is not ca
32b00 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68  lled, as.  ** th
32b10 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64  ey may be stored
32b20 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
32b30 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20  file handle and 
32b40 75 73 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a  used by the .  *
32b50 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c  * 'conch file' l
32b60 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  ocking functions
32b70 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20   later on.  */. 
32b80 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
32b90 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20  )  openFlags |= 
32ba0 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20  O_RDONLY;.  if( 
32bb0 69 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 70  isReadWrite ) op
32bc0 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57  enFlags |= O_RDW
32bd0 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61 74  R;.  if( isCreat
32be0 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  e )    openFlags
32bf0 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69   |= O_CREAT;.  i
32c00 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29  f( isExclusive )
32c10 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
32c20 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57  _EXCL|O_NOFOLLOW
32c30 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  );.  openFlags |
32c40 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f  = (O_LARGEFILE|O
32c50 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28  _BINARY);..  if(
32c60 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64   fd<0 ){.    mod
32c70 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20  e_t openMode;   
32c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65             /* Pe
32c90 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65  rmissions to cre
32ca0 61 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  ate file with */
32cb0 0a 20 20 20 20 75 69 64 5f 74 20 75 69 64 3b 20  .    uid_t uid; 
32cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32cd0 20 20 20 2f 2a 20 55 73 65 72 69 64 20 66 6f 72     /* Userid for
32ce0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
32cf0 20 67 69 64 5f 74 20 67 69 64 3b 20 20 20 20 20   gid_t gid;     
32d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32d10 2a 20 47 72 6f 75 70 69 64 20 66 6f 72 20 74 68  * Groupid for th
32d20 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63  e file */.    rc
32d30 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c   = findCreateFil
32d40 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61  eMode(zName, fla
32d50 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26  gs, &openMode, &
32d60 75 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 20 20  uid, &gid);.    
32d70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32d80 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
32d90 74 28 20 21 70 2d 3e 70 50 72 65 61 6c 6c 6f 63  t( !p->pPrealloc
32da0 61 74 65 64 55 6e 75 73 65 64 20 29 3b 0a 20 20  atedUnused );.  
32db0 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
32dc0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
32dd0 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
32de0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
32df0 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72  URNAL );.      r
32e00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
32e10 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
32e20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e  open(zName, open
32e30 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29  Flags, openMode)
32e40 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
32e50 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20  OPENX   %-3d %s 
32e60 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d  0%o\n", fd, zNam
32e70 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a  e, openFlags));.
32e80 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 45      assert( !isE
32e90 78 63 6c 75 73 69 76 65 20 7c 7c 20 28 6f 70 65  xclusive || (ope
32ea0 6e 46 6c 61 67 73 20 26 20 4f 5f 43 52 45 41 54  nFlags & O_CREAT
32eb0 29 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )!=0 );.    if( 
32ec0 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66  fd<0 ){.      if
32ed0 28 20 69 73 4e 65 77 4a 72 6e 6c 20 26 26 20 65  ( isNewJrnl && e
32ee0 72 72 6e 6f 3d 3d 45 41 43 43 45 53 20 26 26 20  rrno==EACCES && 
32ef0 6f 73 41 63 63 65 73 73 28 7a 4e 61 6d 65 2c 20  osAccess(zName, 
32f00 46 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20  F_OK) ){.       
32f10 20 2f 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f   /* If unable to
32f20 20 63 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61   create a journa
32f30 6c 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69  l because the di
32f40 72 65 63 74 6f 72 79 20 69 73 20 6e 6f 74 0a 20  rectory is not. 
32f50 20 20 20 20 20 20 20 2a 2a 20 77 72 69 74 61 62         ** writab
32f60 6c 65 2c 20 63 68 61 6e 67 65 20 74 68 65 20 65  le, change the e
32f70 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 69 6e 64  rror code to ind
32f80 69 63 61 74 65 20 74 68 61 74 2e 20 2a 2f 0a 20  icate that. */. 
32f90 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32fa0 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 49 52 45  TE_READONLY_DIRE
32fb0 43 54 4f 52 59 3b 0a 20 20 20 20 20 20 7d 65 6c  CTORY;.      }el
32fc0 73 65 20 69 66 28 20 65 72 72 6e 6f 21 3d 45 49  se if( errno!=EI
32fd0 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72  SDIR && isReadWr
32fe0 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ite ){.        /
32ff0 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * Failed to open
33000 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65   the file for re
33010 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
33020 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20   Try read-only. 
33030 2a 2f 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  */.        flags
33040 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45   &= ~(SQLITE_OPE
33050 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
33060 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
33070 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  .        openFla
33080 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f  gs &= ~(O_RDWR|O
33090 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 20  _CREAT);.       
330a0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
330b0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
330c0 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67          openFlag
330d0 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
330e0 20 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c         isReadonl
330f0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66  y = 1;.        f
33100 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
33110 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
33120 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
33130 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
33140 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
33150 20 69 6e 74 20 72 63 32 20 3d 20 75 6e 69 78 4c   int rc2 = unixL
33160 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
33170 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
33180 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  pen", zName);.  
33190 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
331a0 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32  TE_OK ) rc = rc2
331b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
331c0 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
331d0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
331e0 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e  s process is run
331f0 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20 61 6e 64  ning as root and
33200 20 69 66 20 63 72 65 61 74 69 6e 67 20 61 20 6e   if creating a n
33210 65 77 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20  ew rollback.    
33220 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41  ** journal or WA
33230 4c 20 66 69 6c 65 2c 20 73 65 74 20 74 68 65 20  L file, set the 
33240 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65  ownership of the
33250 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20   journal or WAL 
33260 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 74 68 65  to be.    ** the
33270 20 73 61 6d 65 20 61 73 20 74 68 65 20 6f 72 69   same as the ori
33280 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a  ginal database..
33290 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66      */.    if( f
332a0 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
332b0 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f  PEN_WAL|SQLITE_O
332c0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
332d0 29 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  ) ){.      robus
332e0 74 46 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c  tFchown(fd, uid,
332f0 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   gid);.    }.  }
33300 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30  .  assert( fd>=0
33310 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c   );.  if( pOutFl
33320 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74  ags ){.    *pOut
33330 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
33340 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   }..  if( p->pPr
33350 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
33360 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 61   ){.    p->pPrea
33370 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 2d 3e  llocatedUnused->
33380 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e  fd = fd;.    p->
33390 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
333a0 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61  sed->flags = fla
333b0 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  gs;.  }..  if( i
333c0 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f  sDelete ){.#if O
333d0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50  S_VXWORKS.    zP
333e0 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c  ath = zName;.#el
333f0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
33400 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f 43  E_UNLINK_AFTER_C
33410 4c 4f 53 45 29 0a 20 20 20 20 7a 50 61 74 68 20  LOSE).    zPath 
33420 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
33430 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  f("%s", zName);.
33440 20 20 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30      if( zPath==0
33450 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   ){.      robust
33460 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f  _close(p, fd, __
33470 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 72  LINE__);.      r
33480 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
33490 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23  EM_BKPT;.    }.#
334a0 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e  else.    osUnlin
334b0 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  k(zName);.#endif
334c0 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
334d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
334e0 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20  TYLE.  else{.   
334f0 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20   p->openFlags = 
33500 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23  openFlags;.  }.#
33510 65 6e 64 69 66 0a 20 20 0a 23 69 66 20 64 65 66  endif.  .#if def
33520 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
33530 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
33540 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
33550 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c   if( fstatfs(fd,
33560 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
33570 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  ){.    storeLast
33580 45 72 72 6e 6f 28 70 2c 20 65 72 72 6e 6f 29 3b  Errno(p, errno);
33590 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
335a0 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(p, fd, __LINE_
335b0 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  _);.    return S
335c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
335d0 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20  SS;.  }.  if (0 
335e0 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f  == strncmp("msdo
335f0 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74  s", fsInfo.f_fst
33600 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20  ypename, 5)) {. 
33610 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
33620 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c  File)->fsFlags |
33630 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  = SQLITE_FSFLAGS
33640 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 20  _IS_MSDOS;.  }. 
33650 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d   if (0 == strncm
33660 70 28 22 65 78 66 61 74 22 2c 20 66 73 49 6e 66  p("exfat", fsInf
33670 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
33680 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78  5)) {.    ((unix
33690 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73  File*)pFile)->fs
336a0 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
336b0 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
336c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
336d0 2f 2a 20 53 65 74 20 75 70 20 61 70 70 72 6f 70  /* Set up approp
336e0 72 69 61 74 65 20 63 74 72 6c 46 6c 61 67 73 20  riate ctrlFlags 
336f0 2a 2f 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  */.  if( isDelet
33700 65 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  e )             
33710 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
33720 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b  UNIXFILE_DELETE;
33730 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
33740 79 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  y )             
33750 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
33760 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20  IXFILE_RDONLY;. 
33770 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21   noLock = eType!
33780 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
33790 4e 5f 44 42 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f  N_DB;.  if( noLo
337a0 63 6b 20 29 20 20 20 20 20 20 20 20 20 20 20 20  ck )            
337b0 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20        ctrlFlags 
337c0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  |= UNIXFILE_NOLO
337d0 43 4b 3b 0a 20 20 69 66 28 20 69 73 4e 65 77 4a  CK;.  if( isNewJ
337e0 72 6e 6c 20 29 20 20 20 20 20 20 20 20 20 20 20  rnl )           
337f0 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
33800 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
33810 43 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  C;.  if( flags &
33820 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
33830 20 29 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20   ) ctrlFlags |= 
33840 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a 23  UNIXFILE_URI;..#
33850 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
33860 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
33870 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
33880 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20  _PROXY_LOCKING. 
33890 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31   isAutoProxy = 1
338a0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69  ;.#endif.  if( i
338b0 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a  sAutoProxy && (z
338c0 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28  Path!=NULL) && (
338d0 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73  !noLock) && pVfs
338e0 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63  ->xOpen ){.    c
338f0 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20  har *envforce = 
33900 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46  getenv("SQLITE_F
33910 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
33920 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73  NG");.    int us
33930 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20  eProxy = 0;..   
33940 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45   /* SQLITE_FORCE
33950 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d  _PROXY_LOCKING==
33960 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c  1 means force al
33970 77 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20  ways use proxy, 
33980 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20  0 means .    ** 
33990 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c  never use proxy,
339a0 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20   NULL means use 
339b0 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f  proxy for non-lo
339c0 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20  cal files only. 
339d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66   */.    if( envf
339e0 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  orce!=NULL ){.  
339f0 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61      useProxy = a
33a00 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b  toi(envforce)>0;
33a10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33a20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66    useProxy = !(f
33a30 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e  sInfo.f_flags&MN
33a40 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a  T_LOCAL);.    }.
33a50 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79      if( useProxy
33a60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
33a70 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56  illInUnixFile(pV
33a80 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a  fs, fd, pFile, z
33a90 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29  Path, ctrlFlags)
33aa0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
33ab0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33ac0 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54       rc = proxyT
33ad0 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
33ae0 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
33af0 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20  e, ":auto:");.  
33b00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33b10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33b20 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78       /* Use unix
33b30 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75  Close to clean u
33b40 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  p the resources 
33b50 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55  added in fillInU
33b60 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20  nixFile .       
33b70 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20     ** and clear 
33b80 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72  all the structur
33b90 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20  e's references. 
33ba0 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a   Specifically, .
33bb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69            ** pFi
33bc0 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c  le->pMethods wil
33bd0 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c  l be NULL so sql
33be0 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c  ite3OsClose will
33bf0 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20   be a no-op .   
33c00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
33c10 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46      unixClose(pF
33c20 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
33c30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
33c40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33c50 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
33c60 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ished;.    }.  }
33c70 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 61 73 73  .#endif.  .  ass
33c80 65 72 74 28 20 7a 50 61 74 68 3d 3d 30 20 7c 7c  ert( zPath==0 ||
33c90 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 0a   zPath[0]=='/' .
33ca0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
33cb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
33cc0 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  ER_JOURNAL || eT
33cd0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
33ce0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _MAIN_JOURNAL . 
33cf0 20 29 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49   );.  rc = fillI
33d00 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
33d10 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
33d20 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f  , ctrlFlags);..o
33d30 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20  pen_finished:.  
33d40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33d50 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
33d60 5f 66 72 65 65 28 70 2d 3e 70 50 72 65 61 6c 6c  _free(p->pPreall
33d70 6f 63 61 74 65 64 55 6e 75 73 65 64 29 3b 0a 20  ocatedUnused);. 
33d80 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
33d90 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  }.../*.** Delete
33da0 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61   the file at zPa
33db0 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79  th. If the dirSy
33dc0 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nc argument is t
33dd0 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20  rue, fsync().** 
33de0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 66  the directory af
33df0 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ter deleting the
33e00 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
33e10 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28   int unixDelete(
33e20 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
33e30 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20  NotUsed,     /* 
33e40 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  VFS containing t
33e50 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c 65  his as the xDele
33e60 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  te method */.  c
33e70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
33e80 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
33e90 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64   of file to be d
33ea0 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  eleted */.  int 
33eb0 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20 20  dirSync         
33ec0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
33ed0 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63 74  , fsync() direct
33ee0 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
33ef0 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ng file */.){.  
33f00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
33f10 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  OK;.  UNUSED_PAR
33f20 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
33f30 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
33f40 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
33f50 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a  _IOERR_DELETE);.
33f60 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a    if( osUnlink(z
33f70 50 61 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  Path)==(-1) ){. 
33f80 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e     if( errno==EN
33f90 4f 45 4e 54 0a 23 69 66 20 4f 53 5f 56 58 57 4f  OENT.#if OS_VXWO
33fa0 52 4b 53 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f  RKS.        || o
33fb0 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 30 29  sAccess(zPath,0)
33fc0 21 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 29  !=0.#endif.    )
33fd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
33fe0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
33ff0 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73  _NOENT;.    }els
34000 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  e{.      rc = un
34010 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
34020 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
34030 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29  "unlink", zPath)
34040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
34050 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e 64  rn rc;.  }.#ifnd
34060 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
34070 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20  E_DIRSYNC.  if( 
34080 28 64 69 72 53 79 6e 63 20 26 20 31 29 21 3d 30  (dirSync & 1)!=0
34090 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a   ){.    int fd;.
340a0 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44      rc = osOpenD
340b0 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20  irectory(zPath, 
340c0 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &fd);.    if( rc
340d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
340e0 20 20 20 20 20 69 66 28 20 66 75 6c 6c 5f 66 73       if( full_fs
340f0 79 6e 63 28 66 64 2c 30 2c 30 29 20 29 7b 0a 20  ync(fd,0,0) ){. 
34100 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
34110 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
34120 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c  IOERR_DIR_FSYNC,
34130 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29   "fsync", zPath)
34140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34150 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
34160 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
34170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34180 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
34190 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a 20  TE_CANTOPEN );. 
341a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
341b0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  _OK;.    }.  }.#
341c0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
341d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  c;.}../*.** Test
341e0 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   the existence o
341f0 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d  f or access perm
34200 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20  issions of file 
34210 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65  zPath. The.** te
34220 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70  st performed dep
34230 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
34240 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  e of flags:.**.*
34250 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
34260 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75  ESS_EXISTS: Retu
34270 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
34280 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53   exists.**     S
34290 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
342a0 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31  DWRITE: Return 1
342b0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
342c0 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c  read and writabl
342d0 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  e..**     SQLITE
342e0 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59  _ACCESS_READONLY
342f0 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
34300 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62  e file is readab
34310 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  le..**.** Otherw
34320 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ise return 0..*/
34330 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
34340 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
34350 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
34360 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e    /* The VFS con
34370 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63  taining this xAc
34380 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  cess method */. 
34390 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
343a0 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68  th,      /* Path
343b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
343c0 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  examine */.  int
343d0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
343e0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20       /* What do 
343f0 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e  we want to learn
34400 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68   about the zPath
34410 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20   file? */.  int 
34420 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
34430 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
34440 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65  ult boolean here
34450 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f   */.){.  UNUSED_
34460 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
34470 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
34480 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
34490 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
344a0 53 3b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  S; );.  assert( 
344b0 70 52 65 73 4f 75 74 21 3d 30 20 29 3b 0a 0a 20  pResOut!=0 );.. 
344c0 20 2f 2a 20 54 68 65 20 73 70 65 63 20 73 61 79   /* The spec say
344d0 73 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65  s there are thre
344e0 65 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 75 65  e possible value
344f0 73 20 66 6f 72 20 66 6c 61 67 73 2e 20 20 42 75  s for flags.  Bu
34500 74 20 6f 6e 6c 79 0a 20 20 2a 2a 20 74 77 6f 20  t only.  ** two 
34510 6f 66 20 74 68 65 6d 20 61 72 65 20 61 63 74 75  of them are actu
34520 61 6c 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 61  ally used */.  a
34530 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 53 51  ssert( flags==SQ
34540 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
34550 54 53 20 7c 7c 20 66 6c 61 67 73 3d 3d 53 51 4c  TS || flags==SQL
34560 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
34570 52 49 54 45 20 29 3b 0a 0a 20 20 69 66 28 20 66  RITE );..  if( f
34580 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43  lags==SQLITE_ACC
34590 45 53 53 5f 45 58 49 53 54 53 20 29 7b 0a 20 20  ESS_EXISTS ){.  
345a0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
345b0 66 3b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  f;.    *pResOut 
345c0 3d 20 28 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61  = (0==osStat(zPa
345d0 74 68 2c 20 26 62 75 66 29 20 26 26 20 62 75 66  th, &buf) && buf
345e0 2e 73 74 5f 73 69 7a 65 3e 30 29 3b 0a 20 20 7d  .st_size>0);.  }
345f0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 73 4f  else{.    *pResO
34600 75 74 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 50  ut = osAccess(zP
34610 61 74 68 2c 20 57 5f 4f 4b 7c 52 5f 4f 4b 29 3d  ath, W_OK|R_OK)=
34620 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  =0;.  }.  return
34630 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
34640 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  *.**.*/.static i
34650 6e 74 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d  nt mkFullPathnam
34660 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
34670 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
34680 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 70 61       /* Input pa
34690 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f  th */.  char *zO
346a0 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
346b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
346c0 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  t buffer */.  in
346d0 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
346e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
346f0 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
34700 6f 66 20 62 75 66 66 65 72 20 7a 4f 75 74 20 2a  of buffer zOut *
34710 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 74 68  /.){.  int nPath
34720 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
34730 33 30 28 7a 50 61 74 68 29 3b 0a 20 20 69 6e 74  30(zPath);.  int
34740 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 69 66 28   iOff = 0;.  if(
34750 20 7a 50 61 74 68 5b 30 5d 21 3d 27 2f 27 20 29   zPath[0]!='/' )
34760 7b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 63  {.    if( osGetc
34770 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 32 29  wd(zOut, nOut-2)
34780 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
34790 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
347a0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
347b0 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c  _BKPT, "getcwd",
347c0 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20   zPath);.    }. 
347d0 20 20 20 69 4f 66 66 20 3d 20 73 71 6c 69 74 65     iOff = sqlite
347e0 33 53 74 72 6c 65 6e 33 30 28 7a 4f 75 74 29 3b  3Strlen30(zOut);
347f0 0a 20 20 20 20 7a 4f 75 74 5b 69 4f 66 66 2b 2b  .    zOut[iOff++
34800 5d 20 3d 20 27 2f 27 3b 0a 20 20 7d 0a 20 20 69  ] = '/';.  }.  i
34810 66 28 20 28 69 4f 66 66 2b 6e 50 61 74 68 2b 31  f( (iOff+nPath+1
34820 29 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 2f 2a  )>nOut ){.    /*
34830 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 73 20   SQLite assumes 
34840 74 68 61 74 20 78 46 75 6c 6c 50 61 74 68 6e 61  that xFullPathna
34850 6d 65 28 29 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  me() nul-termina
34860 74 65 73 20 74 68 65 20 6f 75 74 70 75 74 20 62  tes the output b
34870 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 65 76 65  uffer.    ** eve
34880 6e 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20  n if it returns 
34890 61 6e 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20  an error.  */.  
348a0 20 20 7a 4f 75 74 5b 69 4f 66 66 5d 20 3d 20 27    zOut[iOff] = '
348b0 5c 30 27 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  \0';.    return 
348c0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
348d0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
348e0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
348f0 74 2d 69 4f 66 66 2c 20 26 7a 4f 75 74 5b 69 4f  t-iOff, &zOut[iO
34900 66 66 5d 2c 20 22 25 73 22 2c 20 7a 50 61 74 68  ff], "%s", zPath
34910 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
34920 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
34930 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
34940 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
34950 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54  full pathname. T
34960 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
34970 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73  .** is stored as
34980 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
34990 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  d string in the 
349a0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
349b0 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a  o by.** zPath. .
349c0 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74  **.** zOut point
349d0 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  s to a buffer of
349e0 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65   at least sqlite
349f0 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
34a00 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74   bytes .** (in t
34a10 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41  his case, MAX_PA
34a20 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54  THNAME bytes). T
34a30 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20  he full-path is 
34a40 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68  written to.** th
34a50 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  is buffer before
34a60 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
34a70 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75  tatic int unixFu
34a80 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
34a90 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
34aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
34ab0 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
34ac0 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
34ad0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
34ae0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
34af0 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
34b00 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
34b10 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20   nOut,          
34b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
34b30 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
34b40 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
34b50 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20    char *zOut    
34b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b70 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
34b80 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 64 65 66 69   */.){.#if !defi
34b90 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e  ned(HAVE_READLIN
34ba0 4b 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 48  K) || !defined(H
34bb0 41 56 45 5f 4c 53 54 41 54 29 0a 20 20 72 65 74  AVE_LSTAT).  ret
34bc0 75 72 6e 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61  urn mkFullPathna
34bd0 6d 65 28 7a 50 61 74 68 2c 20 7a 4f 75 74 2c 20  me(zPath, zOut, 
34be0 6e 4f 75 74 29 3b 0a 23 65 6c 73 65 0a 20 20 69  nOut);.#else.  i
34bf0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
34c00 4b 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  K;.  int nByte;.
34c10 20 20 69 6e 74 20 6e 4c 69 6e 6b 20 3d 20 31 3b    int nLink = 1;
34c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 79 6d  /* Number of sym
34c40 62 6f 6c 69 63 20 6c 69 6e 6b 73 20 66 6f 6c 6c  bolic links foll
34c50 6f 77 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  owed so far */. 
34c60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
34c70 20 3d 20 7a 50 61 74 68 3b 20 20 20 20 20 20 2f   = zPath;      /
34c80 2a 20 49 6e 70 75 74 20 70 61 74 68 20 66 6f 72  * Input path for
34c90 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   each iteration 
34ca0 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61  of loop */.  cha
34cb0 72 20 2a 7a 44 65 6c 20 3d 20 30 3b 0a 0a 20 20  r *zDel = 0;..  
34cc0 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78  assert( pVfs->mx
34cd0 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41  Pathname==MAX_PA
34ce0 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53  THNAME );.  UNUS
34cf0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
34d00 73 29 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  s);..  /* It's o
34d10 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
34d20 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
34d30 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
34d40 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
34d50 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
34d60 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
34d70 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
34d80 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
34d90 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
34da0 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
34db0 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
34dc0 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
34dd0 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
34de0 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
34df0 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
34e00 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
34e10 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
34e20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
34e30 52 4f 52 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 0a  ROR );..  do {..
34e40 20 20 20 20 2f 2a 20 43 61 6c 6c 20 73 74 61 74      /* Call stat
34e50 28 29 20 6f 6e 20 70 61 74 68 20 7a 49 6e 2e 20  () on path zIn. 
34e60 53 65 74 20 62 4c 69 6e 6b 20 74 6f 20 74 72 75  Set bLink to tru
34e70 65 20 69 66 20 74 68 65 20 70 61 74 68 20 69 73  e if the path is
34e80 20 61 20 73 79 6d 62 6f 6c 69 63 0a 20 20 20 20   a symbolic.    
34e90 2a 2a 20 6c 69 6e 6b 2c 20 6f 72 20 66 61 6c 73  ** link, or fals
34ea0 65 20 6f 74 68 65 72 77 69 73 65 2e 20 20 2a 2f  e otherwise.  */
34eb0 0a 20 20 20 20 69 6e 74 20 62 4c 69 6e 6b 20 3d  .    int bLink =
34ec0 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   0;.    struct s
34ed0 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28  tat buf;.    if(
34ee0 20 6f 73 4c 73 74 61 74 28 7a 49 6e 2c 20 26 62   osLstat(zIn, &b
34ef0 75 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  uf)!=0 ){.      
34f00 69 66 28 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e  if( errno!=ENOEN
34f10 54 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  T ){.        rc 
34f20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
34f30 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
34f40 4b 50 54 2c 20 22 6c 73 74 61 74 22 2c 20 7a 49  KPT, "lstat", zI
34f50 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
34f60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 4c 69  }else{.      bLi
34f70 6e 6b 20 3d 20 53 5f 49 53 4c 4e 4b 28 62 75 66  nk = S_ISLNK(buf
34f80 2e 73 74 5f 6d 6f 64 65 29 3b 0a 20 20 20 20 7d  .st_mode);.    }
34f90 0a 0a 20 20 20 20 69 66 28 20 62 4c 69 6e 6b 20  ..    if( bLink 
34fa0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 44 65  ){.      if( zDe
34fb0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
34fc0 7a 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zDel = sqlite3_m
34fd0 61 6c 6c 6f 63 28 6e 4f 75 74 29 3b 0a 20 20 20  alloc(nOut);.   
34fe0 20 20 20 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30       if( zDel==0
34ff0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
35000 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
35010 20 7d 65 6c 73 65 20 69 66 28 20 2b 2b 6e 4c 69   }else if( ++nLi
35020 6e 6b 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 53 59  nk>SQLITE_MAX_SY
35030 4d 4c 49 4e 4b 53 20 29 7b 0a 20 20 20 20 20 20  MLINKS ){.      
35040 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
35050 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
35060 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
35070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35080 0a 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d  .        nByte =
35090 20 6f 73 52 65 61 64 6c 69 6e 6b 28 7a 49 6e 2c   osReadlink(zIn,
350a0 20 7a 44 65 6c 2c 20 6e 4f 75 74 2d 31 29 3b 0a   zDel, nOut-1);.
350b0 20 20 20 20 20 20 20 20 69 66 28 20 6e 42 79 74          if( nByt
350c0 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e<0 ){.         
350d0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
350e0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
350f0 45 4e 5f 42 4b 50 54 2c 20 22 72 65 61 64 6c 69  EN_BKPT, "readli
35100 6e 6b 22 2c 20 7a 49 6e 29 3b 0a 20 20 20 20 20  nk", zIn);.     
35110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35120 20 20 20 20 69 66 28 20 7a 44 65 6c 5b 30 5d 21      if( zDel[0]!
35130 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
35140 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
35150 20 20 20 20 20 20 20 66 6f 72 28 6e 20 3d 20 73         for(n = s
35160 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
35170 49 6e 29 3b 20 6e 3e 30 20 26 26 20 7a 49 6e 5b  In); n>0 && zIn[
35180 6e 2d 31 5d 21 3d 27 2f 27 3b 20 6e 2d 2d 29 3b  n-1]!='/'; n--);
35190 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
351a0 20 6e 42 79 74 65 2b 6e 2b 31 3e 6e 4f 75 74 20   nByte+n+1>nOut 
351b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
351c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
351d0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
351e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
351f0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
35200 6d 6f 76 65 28 26 7a 44 65 6c 5b 6e 5d 2c 20 7a  move(&zDel[n], z
35210 44 65 6c 2c 20 6e 42 79 74 65 2b 31 29 3b 0a 20  Del, nByte+1);. 
35220 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
35230 63 70 79 28 7a 44 65 6c 2c 20 7a 49 6e 2c 20 6e  cpy(zDel, zIn, n
35240 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
35250 20 6e 42 79 74 65 20 2b 3d 20 6e 3b 0a 20 20 20   nByte += n;.   
35260 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
35270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
35280 20 7a 44 65 6c 5b 6e 42 79 74 65 5d 20 3d 20 27   zDel[nByte] = '
35290 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  \0';.        }. 
352a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 49       }..      zI
352b0 6e 20 3d 20 7a 44 65 6c 3b 0a 20 20 20 20 7d 0a  n = zDel;.    }.
352c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
352d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a 49  =SQLITE_OK || zI
352e0 6e 21 3d 7a 4f 75 74 20 7c 7c 20 7a 49 6e 5b 30  n!=zOut || zIn[0
352f0 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 20 20 69 66  ]=='/' );.    if
35300 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35310 26 26 20 7a 49 6e 21 3d 7a 4f 75 74 20 29 7b 0a  && zIn!=zOut ){.
35320 20 20 20 20 20 20 72 63 20 3d 20 6d 6b 46 75 6c        rc = mkFul
35330 6c 50 61 74 68 6e 61 6d 65 28 7a 49 6e 2c 20 7a  lPathname(zIn, z
35340 4f 75 74 2c 20 6e 4f 75 74 29 3b 0a 20 20 20 20  Out, nOut);.    
35350 7d 0a 20 20 20 20 69 66 28 20 62 4c 69 6e 6b 3d  }.    if( bLink=
35360 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
35370 7a 49 6e 20 3d 20 7a 4f 75 74 3b 0a 20 20 7d 77  zIn = zOut;.  }w
35380 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
35390 5f 4f 4b 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  _OK );..  sqlite
353a0 33 5f 66 72 65 65 28 7a 44 65 6c 29 3b 0a 20 20  3_free(zDel);.  
353b0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
353c0 66 20 20 20 2f 2a 20 48 41 56 45 5f 52 45 41 44  f   /* HAVE_READ
353d0 4c 49 4e 4b 20 26 26 20 48 41 56 45 5f 4c 53 54  LINK && HAVE_LST
353e0 41 54 20 2a 2f 0a 7d 0a 0a 0a 23 69 66 6e 64 65  AT */.}...#ifnde
353f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
35400 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
35410 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
35420 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
35430 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
35440 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
35450 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
35460 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
35470 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
35480 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
35490 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63  /.#include <dlfc
354a0 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64  n.h>.static void
354b0 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c   *unixDlOpen(sql
354c0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
354d0 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
354e0 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55  Filename){.  UNU
354f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
35500 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
35510 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   dlopen(zFilenam
35520 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54  e, RTLD_NOW | RT
35530 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f  LD_GLOBAL);.}../
35540 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c  *.** SQLite call
35550 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
35560 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
35570 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78  r a call to unix
35580 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e  DlSym() or.** un
35590 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73  ixDlOpen() fails
355a0 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c   (returns a null
355b0 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20   pointer). If a 
355c0 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72  more detailed er
355d0 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69  ror.** message i
355e0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20  s available, it 
355f0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42  is written to zB
35600 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72  ufOut. If no err
35610 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73  or message.** is
35620 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66   available, zBuf
35630 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  Out is left unmo
35640 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74  dified and SQLit
35650 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74  e uses a default
35660 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
35670 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
35680 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71  d unixDlError(sq
35690 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
356a0 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
356b0 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20  ar *zBufOut){.  
356c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
356d0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
356e0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
356f0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
35700 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72  );.  zErr = dler
35710 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72  ror();.  if( zEr
35720 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
35730 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
35740 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a  zBufOut, "%s", z
35750 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  Err);.  }.  unix
35760 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
35770 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e  static void (*un
35780 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  ixDlSym(sqlite3_
35790 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f  vfs *NotUsed, vo
357a0 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  id *p, const cha
357b0 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a  r*zSym))(void){.
357c0 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77    /* .  ** GCC w
357d0 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
357e0 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43  rors says that C
357f0 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  90 does not allo
35800 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a  w a void* to be.
35810 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61    ** cast into a
35820 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
35830 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74  nction.  And yet
35840 20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73   the library dls
35850 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a  ym() routine.  *
35860 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64  * returns a void
35870 2a 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c  * which is reall
35880 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  y a pointer to a
35890 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68   function.  So h
358a0 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73  ow do we.  ** us
358b0 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d  e dlsym() with -
358c0 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f  pedantic-errors?
358d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61  .  **.  ** Varia
358e0 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64  ble x below is d
358f0 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  efined to be a p
35900 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
35910 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a  tion taking.  **
35920 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64   parameters void
35930 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72  * and const char
35940 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  * and returning 
35950 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
35960 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65  unction..  ** We
35970 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79   initialize x by
35980 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20   assigning it a 
35990 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64  pointer to the d
359a0 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e  lsym() function.
359b0 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69  .  ** (That assi
359c0 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20  gnment requires 
359d0 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77  a cast.)  Then w
359e0 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74  e call the funct
359f0 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20  ion that.  ** x 
35a00 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a  points to.  .  *
35a10 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b  *.  ** This work
35a20 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b  -around is unlik
35a30 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72  ely to work corr
35a40 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73  ectly on any sys
35a50 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79  tem where.  ** y
35a60 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74  ou really cannot
35a70 20 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e   cast a function
35a80 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f   pointer into vo
35a90 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20  id*.  But then, 
35aa0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65  on the.  ** othe
35ab0 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20  r hand, dlsym() 
35ac0 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  will not work on
35ad0 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65   such a system e
35ae0 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76  ither, so we hav
35af0 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c  e.  ** not reall
35b00 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e  y lost anything.
35b10 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28  .  */.  void (*(
35b20 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  *x)(void*,const 
35b30 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20  char*))(void);. 
35b40 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
35b50 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20  R(NotUsed);.  x 
35b60 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69  = (void(*(*)(voi
35b70 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
35b80 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20  (void))dlsym;.  
35b90 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a  return (*x)(p, z
35ba0 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Sym);.}.static v
35bb0 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28  oid unixDlClose(
35bc0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
35bd0 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e  Used, void *pHan
35be0 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  dle){.  UNUSED_P
35bf0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
35c00 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61  );.  dlclose(pHa
35c10 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  ndle);.}.#else /
35c20 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
35c30 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
35c40 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
35c50 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f   #define unixDlO
35c60 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
35c70 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20   unixDlError 0. 
35c80 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53   #define unixDlS
35c90 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65  ym   0.  #define
35ca0 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23   unixDlClose 0.#
35cb0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
35cc0 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  te nBuf bytes of
35cd0 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20   random data to 
35ce0 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66  the supplied buf
35cf0 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  fer zBuf..*/.sta
35d00 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64  tic int unixRand
35d10 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
35d20 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
35d30 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
35d40 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  f){.  UNUSED_PAR
35d50 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
35d60 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f  .  assert((size_
35d70 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28  t)nBuf>=(sizeof(
35d80 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69  time_t)+sizeof(i
35d90 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  nt)));..  /* We 
35da0 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  have to initiali
35db0 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65  ze zBuf to preve
35dc0 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  nt valgrind from
35dd0 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20   reporting.  ** 
35de0 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70  errors.  The rep
35df0 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76  orts issued by v
35e00 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f  algrind are inco
35e10 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64  rrect - we would
35e20 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61  .  ** prefer tha
35e30 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  t the randomness
35e40 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79   be increased by
35e50 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74   making use of t
35e60 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61  he.  ** uninitia
35e70 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a  lized space in z
35e80 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69  Buf - but valgri
35e90 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74  nd errors tend t
35ea0 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d  o worry.  ** som
35eb0 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72  e users.  Rather
35ec0 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20   than argue, it 
35ed0 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73  seems easier jus
35ee0 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a  t to initialize.
35ef0 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61    ** the whole a
35f00 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65  rray and silence
35f10 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20   valgrind, even 
35f20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65  if that means le
35f30 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20  ss randomness.  
35f40 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d  ** in the random
35f50 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   seed..  **.  **
35f60 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69   When testing, i
35f70 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66  nitializing zBuf
35f80 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c  [] to zero is al
35f90 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d  l we do.  That m
35fa0 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77  eans.  ** that w
35fb0 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
35fc0 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d   same random num
35fd0 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54  ber sequence.  T
35fe0 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20  his makes the.  
35ff0 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61  ** tests repeata
36000 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  ble..  */.  mems
36010 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
36020 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50  );.  randomnessP
36030 69 64 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29  id = osGetpid(0)
36040 3b 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ;  .#if !defined
36050 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
36060 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
36070 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53  _OMIT_RANDOMNESS
36080 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 66 64  ).  {.    int fd
36090 2c 20 67 6f 74 3b 0a 20 20 20 20 66 64 20 3d 20  , got;.    fd = 
360a0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65  robust_open("/de
360b0 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44  v/urandom", O_RD
360c0 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  ONLY, 0);.    if
360d0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
360e0 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20  time_t t;.      
360f0 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20  time(&t);.      
36100 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c  memcpy(zBuf, &t,
36110 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20   sizeof(t));.   
36120 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
36130 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 72 61 6e  sizeof(t)], &ran
36140 64 6f 6d 6e 65 73 73 50 69 64 2c 20 73 69 7a 65  domnessPid, size
36150 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  of(randomnessPid
36160 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
36170 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65  ( sizeof(t)+size
36180 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  of(randomnessPid
36190 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  )<=(size_t)nBuf 
361a0 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20  );.      nBuf = 
361b0 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65  sizeof(t) + size
361c0 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  of(randomnessPid
361d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
361e0 20 20 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73      do{ got = os
361f0 52 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e  Read(fd, zBuf, n
36200 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f  Buf); }while( go
36210 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
36220 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62  NTR );.      rob
36230 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c  ust_close(0, fd,
36240 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
36250 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
36260 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a  eturn nBuf;.}...
36270 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
36280 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
36290 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
362a0 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
362b0 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  ..** The argumen
362c0 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
362d0 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
362e0 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70  we want to sleep
362f0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
36300 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
36310 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
36320 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74  nds of sleep act
36330 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74  ually.** request
36340 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65  ed from the unde
36350 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
36360 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65   system, a numbe
36370 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  r which.** might
36380 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
36390 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
363a0 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e   argument, but n
363b0 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  ot less.** than 
363c0 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
363d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
363e0 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
363f0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
36400 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23  microseconds){.#
36410 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
36420 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
36430 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63  sp;..  sp.tv_sec
36440 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20   = microseconds 
36450 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e  / 1000000;.  sp.
36460 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f  tv_nsec = (micro
36470 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30  seconds % 100000
36480 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e  0) * 1000;.  nan
36490 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c  osleep(&sp, NULL
364a0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
364b0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
364c0 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
364d0 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66  conds;.#elif def
364e0 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50  ined(HAVE_USLEEP
364f0 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50  ) && HAVE_USLEEP
36500 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73  .  usleep(micros
36510 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45  econds);.  UNUSE
36520 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
36530 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
36540 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
36550 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73  se.  int seconds
36560 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
36570 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30  +999999)/1000000
36580 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64  ;.  sleep(second
36590 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
365a0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
365b0 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64  .  return second
365c0 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69  s*1000000;.#endi
365d0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
365e0 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
365f0 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
36600 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69  on-zero value, i
36610 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
36620 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
36630 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  f seconds since 
36640 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64  1970 and is used
36650 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75   to set the resu
36660 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lt of.** sqlite3
36670 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20  OsCurrentTime() 
36680 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a  during testing..
36690 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
366a0 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
366b0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d  3_current_time =
366c0 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73   0;  /* Fake sys
366d0 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f  tem time in seco
366e0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20  nds since 1970. 
366f0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
36700 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
36710 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
36720 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
36730 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69   Time).  Write i
36740 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68  nto *piNow.** th
36750 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  e current time a
36760 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
36770 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74  ian Day number t
36780 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e  imes 86_400_000.
36790 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f    In.** other wo
367a0 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20  rds, write into 
367b0 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65  *piNow the numbe
367c0 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
367d0 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69  s since the Juli
367e0 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e  an.** epoch of n
367f0 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68  oon in Greenwich
36800 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c   on November 24,
36810 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64   4714 B.C accord
36820 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72  ing to the.** pr
36830 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61  oleptic Gregoria
36840 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a  n calendar..**.*
36850 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
36860 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
36870 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   Return SQLITE_E
36880 52 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65  RROR if the time
36890 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61   and date .** ca
368a0 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
368b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
368c0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
368d0 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  4(sqlite3_vfs *N
368e0 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f  otUsed, sqlite3_
368f0 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20  int64 *piNow){. 
36900 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
36910 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78  lite3_int64 unix
36920 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35  Epoch = 24405875
36930 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
36940 38 36 34 30 30 30 30 3b 0a 20 20 69 6e 74 20 72  8640000;.  int r
36950 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  c = SQLITE_OK;.#
36960 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45  if defined(NO_GE
36970 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74  TTOD).  time_t t
36980 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20  ;.  time(&t);.  
36990 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74  *piNow = ((sqlit
369a0 65 33 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30  e3_int64)t)*1000
369b0 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65   + unixEpoch;.#e
369c0 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  lif OS_VXWORKS. 
369d0 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
369e0 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67   sNow;.  clock_g
369f0 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41  ettime(CLOCK_REA
36a00 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20  LTIME, &sNow);. 
36a10 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70   *piNow = unixEp
36a20 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69  och + 1000*(sqli
36a30 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74  te3_int64)sNow.t
36a40 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f  v_sec + sNow.tv_
36a50 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65  nsec/1000000;.#e
36a60 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d  lse.  struct tim
36a70 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 28 76 6f  eval sNow;.  (vo
36a80 69 64 29 67 65 74 74 69 6d 65 6f 66 64 61 79 28  id)gettimeofday(
36a90 26 73 4e 6f 77 2c 20 30 29 3b 20 20 2f 2a 20 43  &sNow, 0);  /* C
36aa0 61 6e 6e 6f 74 20 66 61 69 6c 20 67 69 76 65 6e  annot fail given
36ab0 20 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73   valid arguments
36ac0 20 2a 2f 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75   */.  *piNow = u
36ad0 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a  nixEpoch + 1000*
36ae0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
36af0 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f  Now.tv_sec + sNo
36b00 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a  w.tv_usec/1000;.
36b10 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
36b20 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
36b30 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
36b40 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69  _time ){.    *pi
36b50 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69  Now = 1000*(sqli
36b60 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65  te3_int64)sqlite
36b70 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b  3_current_time +
36b80 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a   unixEpoch;.  }.
36b90 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
36ba0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
36bb0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
36bc0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
36bd0 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
36be0 45 44 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  ED./*.** Find th
36bf0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
36c00 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
36c10 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
36c20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75   Write the.** cu
36c30 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
36c40 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
36c50 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  Day number into 
36c60 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65  *prNow and.** re
36c70 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
36c80 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
36c90 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
36ca0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
36cb0 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
36cc0 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
36cd0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62  s *NotUsed, doub
36ce0 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71  le *prNow){.  sq
36cf0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20  lite3_int64 i = 
36d00 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 55  0;.  int rc;.  U
36d10 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36d20 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 63 20 3d  NotUsed);.  rc =
36d30 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
36d40 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20  Int64(0, &i);.  
36d50 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30  *prNow = i/86400
36d60 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20  000.0;.  return 
36d70 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  rc;.}.#else.# de
36d80 66 69 6e 65 20 75 6e 69 78 43 75 72 72 65 6e 74  fine unixCurrent
36d90 54 69 6d 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  Time 0.#endif../
36da0 2a 0a 2a 2a 20 54 68 65 20 78 47 65 74 4c 61 73  *.** The xGetLas
36db0 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20  tError() method 
36dc0 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 72  is designed to r
36dd0 65 74 75 72 6e 20 61 20 62 65 74 74 65 72 0a 2a  eturn a better.*
36de0 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  * low-level erro
36df0 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 6f  r message when o
36e00 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20  perating-system 
36e10 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70  problems come up
36e20 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74  .** during SQLit
36e30 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4f 6e  e operation.  On
36e40 6c 79 20 74 68 65 20 69 6e 74 65 67 65 72 20 72  ly the integer r
36e50 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 63 75  eturn code is cu
36e60 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64 2e  rrently.** used.
36e70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
36e80 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  nixGetLastError(
36e90 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
36ea0 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
36eb0 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65  d2, char *NotUse
36ec0 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d3){.  UNUSED_PA
36ed0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
36ee0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
36ef0 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a  ETER(NotUsed2);.
36f00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
36f10 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20  ER(NotUsed3);.  
36f20 72 65 74 75 72 6e 20 65 72 72 6e 6f 3b 0a 7d 0a  return errno;.}.
36f30 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*.***********
36f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
36f50 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
36f60 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
36f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36f80 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
36f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36fd0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
36fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37020 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
37030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37040 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63   Begin Proxy Loc
37050 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
37060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37070 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  *****.**.** Prox
37080 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22  y locking is a "
37090 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74  uber-locking-met
370a0 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e  hod" in this sen
370b0 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 65  se:  It uses the
370c0 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
370d0 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63  g methods on sec
370e0 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65  ondary lock file
370f0 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  s.  Proxy lockin
37100 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c  g is a.** meta-l
37110 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66  ayer over top of
37120 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
37130 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
37140 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a  ed above.  For.*
37150 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74  * this reason, t
37160 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74  he division that
37170 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70   implements of p
37180 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
37190 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69  deferred.** unti
371a0 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69  l late in the fi
371b0 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72 20  le (here) after 
371c0 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72  all of the other
371d0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76   I/O methods hav
371e0 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65  e.** been define
371f0 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20  d - so that the 
37200 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
37210 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76  g methods are av
37220 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65  ailable.** as se
37230 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77  rvices to help w
37240 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ith the implemen
37250 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20  tation of proxy 
37260 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a  locking..**.****
37270 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
37280 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  lt locking schem
37290 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65  es in SQLite use
372a0 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
372b0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  s on the.** data
372c0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f  base file to coo
372d0 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f  rdinate safe, co
372e0 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73 20  ncurrent access 
372f0 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  by multiple read
37300 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  ers.** and write
37310 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74  rs [http://sqlit
37320 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e  e.org/lockingv3.
37330 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65  html].  The five
37340 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
37350 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45   states (UNLOCKE
37360 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52  D, PENDING, SHAR
37370 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58  ED, RESERVED, EX
37380 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d 70  CLUSIVE) are imp
37390 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50  lemented.** as P
373a0 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74  OSIX read & writ
373b0 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78  e locks over fix
373c0 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69  ed set of locati
373d0 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c  ons (via fsctl),
373e0 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53  .** on AFP and S
373f0 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76  MB only exclusiv
37400 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
37410 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ks are available
37420 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69   via fsctl.** wi
37430 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33  th _IOWR('z', 23
37440 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
37450 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72  geLockPB2) to tr
37460 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73  ack the same 5 s
37470 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d  tates..** To sim
37480 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20  ulate a F_RDLCK 
37490 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  on the shared ra
374a0 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61  nge, on AFP a ra
374b0 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a  ndomly selected.
374c0 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74 68  ** address in th
374d0 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  e shared range i
374e0 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48  s taken for a SH
374f0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65  ARED lock, the e
37500 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20  ntire.** shared 
37510 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
37520 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  or an EXCLUSIVE 
37530 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lock):.**.**    
37540 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20    PENDING_BYTE  
37550 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30        0x40000000
37560 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56 45  .**      RESERVE
37570 44 5f 42 59 54 45 20 20 20 20 20 20 20 30 78 34  D_BYTE       0x4
37580 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20  0000001.**      
37590 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20  SHARED_RANGE    
375a0 20 20 20 20 30 78 34 30 30 30 30 30 30 32 20 2d      0x40000002 -
375b0 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a  > 0x40000200.**.
375c0 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65  ** This works we
375d0 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ll on the local 
375e0 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74  file system, but
375f0 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20   shows a nearly 
37600 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e  100x.** slowdown
37610 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d   in read perform
37620 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61  ance on AFP beca
37630 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69 65  use the AFP clie
37640 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74  nt disables.** t
37650 68 65 20 72 65 61 64 20 63 61 63 68 65 20 77 68  he read cache wh
37660 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  en byte-range lo
37670 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e  cks are present.
37680 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72    Enabling the r
37690 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70  ead.** cache exp
376a0 6f 73 65 73 20 61 20 63 61 63 68 65 20 63 6f 68  oses a cache coh
376b0 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74  erency problem t
376c0 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f  hat is present o
376d0 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75  n all OS X.** su
376e0 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20  pported network 
376f0 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e  file systems.  N
37700 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20  FS and AFP both 
37710 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63  observe the.** c
37720 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d  lose-to-open sem
37730 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72  antics for ensur
37740 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72 65  ing cache cohere
37750 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e  ncy.** [http://n
37760 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e  fs.sourceforge.n
37770 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69  et/#faq_a8], whi
37780 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65  ch does not effe
37790 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65  ctively.** addre
377a0 73 73 20 74 68 65 20 72 65 71 75 69 72 65 6d 65  ss the requireme
377b0 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65  nts for concurre
377c0 6e 74 20 64 61 74 61 62 61 73 65 20 61 63 63 65  nt database acce
377d0 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a  ss by multiple.*
377e0 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  * readers and wr
377f0 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f  iters.** [http:/
37800 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f  /www.nabble.com/
37810 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61  SQLite-on-NFS-ca
37820 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64  che-coherency-td
37830 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a  15655701.html]..
37840 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73  **.** To address
37850 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
37860 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72   and cache coher
37870 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f  ency issues, pro
37880 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  xy file locking.
37890 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20 77  ** changes the w
378a0 61 79 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ay database acce
378b0 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64  ss is controlled
378c0 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63   by limiting acc
378d0 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67  ess to a.** sing
378e0 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d  le host at a tim
378f0 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c  e and moving fil
37900 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74  e locks off of t
37910 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37920 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70  .** and onto a p
37930 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65  roxy file on the
37940 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
37950 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  em.  .**.**.** U
37960 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73  sing proxy locks
37970 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
37980 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50  -----.**.** C AP
37990 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65  Is.**.**  sqlite
379a0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
379b0 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
379c0 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b  E_FCNTL_SET_LOCK
379d0 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20  PROXYFILE,.**   
379e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379f0 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e      <proxy_path>
37a00 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a   | ":auto:");.**
37a10 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
37a20 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
37a30 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  e, SQLITE_FCNTL_
37a40 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
37a50 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  E,.**           
37a60 20 20 20 20 20 20 20 20 20 20 20 20 26 3c 70 72              &<pr
37a70 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a  oxy_path>);.**.*
37a80 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73  *.** SQL pragmas
37a90 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  .**.**  PRAGMA [
37aa0 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
37ab0 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79  roxy_file=<proxy
37ac0 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a  _path> | :auto:.
37ad0 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
37ae0 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
37af0 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63  _file.**.** Spec
37b00 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20  ifying ":auto:" 
37b10 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68  means that if th
37b20 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66  ere is a conch f
37b30 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63 68  ile with a match
37b40 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69  ing.** host ID i
37b50 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20  n it, the proxy 
37b60 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  path in the conc
37b70 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
37b80 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a  sed, otherwise.*
37b90 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62  * a proxy path b
37ba0 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72  ased on the user
37bb0 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28  's temp dir.** (
37bc0 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f  via confstr(_CS_
37bd0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
37be0 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20  _DIR,...)) will 
37bf0 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  be used and the.
37c00 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20  ** actual proxy 
37c10 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e  file name is gen
37c20 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
37c30 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66  name and path of
37c40 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
37c50 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d   file.  For exam
37c60 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
37c70 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70 61   For database pa
37c80 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f  th "/Users/me/fo
37c90 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20  o.db" .**       
37ca0 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69  The lock path wi
37cb0 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f  ll be "<tmpdir>/
37cc0 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73  sqliteplocks/_Us
37cd0 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75  ers_me_foo.db:au
37ce0 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  to:").**.** Once
37cf0 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73   a lock proxy is
37d00 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
37d10 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
37d20 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f  ction, it can no
37d30 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c  t.** be removed,
37d40 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20   however it may 
37d50 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20 61  be switched to a
37d60 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79   different proxy
37d70 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65   path via.** the
37d80 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73 73   above APIs (ass
37d90 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20  uming the conch 
37da0 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e  file is not bein
37db0 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65  g held by anothe
37dc0 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  r.** connection 
37dd0 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a  or process). .**
37de0 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79  .**.** How proxy
37df0 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a   locking works.*
37e00 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
37e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
37e20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  Proxy file locki
37e30 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72  ng relies primar
37e40 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73  ily on two new s
37e50 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a  upporting files:
37e60 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e   .**.**   *  con
37e70 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74  ch file to limit
37e80 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
37e90 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
37ea0 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a  a single host.**
37eb0 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a        at a time.
37ec0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79  **.**   *  proxy
37ed0 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20   file to act as 
37ee0 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20  a proxy for the 
37ef0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e  advisory locks n
37f00 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20  ormally.**      
37f10 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
37f20 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  abase.**.** The 
37f30 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20  conch file - to 
37f40 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65  use a proxy file
37f50 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69  , sqlite must fi
37f60 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f  rst "hold the co
37f70 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e  nch".** by takin
37f80 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c  g an sqlite-styl
37f90 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  e shared lock on
37fa0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c   the conch file,
37fb0 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20   reading the.** 
37fc0 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d  contents and com
37fd0 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27  paring the host'
37fe0 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44  s unique host ID
37ff0 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64   (see below) and
38000 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70   lock.** proxy p
38010 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  ath against the 
38020 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
38030 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65   the conch.  The
38040 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a   conch file is.*
38050 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
38060 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
38070 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
38080 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
38090 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74   name.** is patt
380a0 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65 20  erned after the 
380b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
380c0 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73  me as ".<databas
380d0 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a  ename>-conch"..*
380e0 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66  * If the conch f
380f0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
38100 73 74 2c 20 6f 72 20 69 74 73 20 63 6f 6e 74 65  st, or its conte
38110 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
38120 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20   the.** host ID 
38130 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74  and/or proxy pat
38140 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  h, then the lock
38150 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f   is escalated to
38160 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a   an exclusive.**
38170 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f   lock and the co
38180 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74  nch file content
38190 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  s is updated wit
381a0 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  h the host ID an
381b0 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20  d proxy.** path 
381c0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  and the lock is 
381d0 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
381e0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69  shared lock agai
381f0 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68  n.  If the conch
38200 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61  .** is held by a
38210 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28  nother process (
38220 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f  with a shared lo
38230 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69  ck), the exclusi
38240 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20  ve lock.** will 
38250 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f  fail and SQLITE_
38260 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
38270 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ..**.** The prox
38280 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c  y file - a singl
38290 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64  e-byte file used
382a0 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72   for all advisor
382b0 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20  y file locks.** 
382c0 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f  normally taken o
382d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
382e0 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f  ile.   This allo
382f0 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72  ws for safe shar
38300 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ing.** of the da
38310 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
38320 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
38330 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20   and writers on 
38340 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74  the same.** host
38350 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75   (the conch ensu
38360 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c  res that they al
38370 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c  l use the same l
38380 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e  ocal lock file).
38390 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e  .**.** Requestin
383a0 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79  g the lock proxy
383b0 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69   does not immedi
383c0 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63  ately take the c
383d0 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f  onch, it is.** o
383e0 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74  nly taken when t
383f0 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74  he first request
38400 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73   to lock databas
38410 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20  e file is made. 
38420 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65   .** This matche
38430 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20  s the semantics 
38440 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e  of the tradition
38450 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76  al locking behav
38460 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70  ior, where.** op
38470 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69  ening a connecti
38480 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  on to a database
38490 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74   file does not t
384a0 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74  ake a lock on it
384b0 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20  ..** The shared 
384c0 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e  lock and an open
384d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
384e0 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20   are maintained 
384f0 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f  until .** the co
38500 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
38510 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73  database is clos
38520 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ed. .**.** The p
38530 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68  roxy file and th
38540 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20  e lock file are 
38550 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f  never deleted so
38560 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a   they only need.
38570 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ** to be created
38580 20 74 68 65 20 6