/ Hex Artifact Content
Login

Artifact 1f10b35801b6107cbfe10dd093d19e93410e05dcc7e011dcb19847feec15fa01:


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 20 61 6e 64 20 64 65 66  s header and def
1130: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1140: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1150: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1160: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1170: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1180: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1190: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
11a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
11b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
11c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
11d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
11e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1200: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1210: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1220: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1230: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1240: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  /*.** Default pe
1250: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1260: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1270: 78 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64 65  xy dir.*/.#ifnde
1280: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1290: 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
12a0: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
12b0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
12c0: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
12d0: 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a  NS 0755.#endif..
12e0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75  /*.** Maximum su
12f0: 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e  pported path-len
1300: 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  gth..*/.#define 
1310: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32  MAX_PATHNAME 512
1320: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
1330: 73 75 70 70 6f 72 74 65 64 20 73 79 6d 62 6f 6c  supported symbol
1340: 69 63 20 6c 69 6e 6b 73 0a 2a 2f 0a 23 64 65 66  ic links.*/.#def
1350: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ine SQLITE_MAX_S
1360: 59 4d 4c 49 4e 4b 53 20 31 30 30 0a 0a 2f 2a 20  YMLINKS 100../* 
1370: 41 6c 77 61 79 73 20 63 61 73 74 20 74 68 65 20  Always cast the 
1380: 67 65 74 70 69 64 28 29 20 72 65 74 75 72 6e 20  getpid() return 
1390: 74 79 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69  type for compati
13a0: 62 69 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b  bility with.** k
13b0: 65 72 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e  ernel modules in
13c0: 20 56 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65   VxWorks. */.#de
13d0: 66 69 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29  fine osGetpid(X)
13e0: 20 28 70 69 64 5f 74 29 67 65 74 70 69 64 28 29   (pid_t)getpid()
13f0: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74  ../*.** Only set
1400: 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69   the lastErrno i
1410: 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
1420: 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72   is a real error
1430: 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e   and not .** a n
1440: 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72  ormal expected r
1450: 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51  eturn code of SQ
1460: 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c  LITE_BUSY or SQL
1470: 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e  ITE_OK.*/.#defin
1480: 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  e IS_LOCK_ERROR(
1490: 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54  x)  ((x != SQLIT
14a0: 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53  E_OK) && (x != S
14b0: 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a  QLITE_BUSY))../*
14c0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
14d0: 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ces */.typedef s
14e0: 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e  truct unixShm un
14f0: 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  ixShm;          
1500: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1510: 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
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 53 68 6d 4e 6f 64 65 20 75  ct unixShmNode u
1540: 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20  nixShmNode;     
1550: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1560: 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74  ry instance */.t
1570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1580: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78  ixInodeInfo unix
1590: 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20  InodeInfo;   /* 
15a0: 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70  An i-node */.typ
15b0: 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78  edef struct Unix
15c0: 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75  UnusedFd UnixUnu
15d0: 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e  sedFd;     /* An
15e0: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
15f0: 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a  criptor */../*.*
1600: 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74  * Sometimes, aft
1610: 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65  er a file handle
1620: 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51   is closed by SQ
1630: 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64  Lite, the file d
1640: 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e  escriptor.** can
1650: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
1660: 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68  mediately. In th
1670: 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61  ese cases, insta
1680: 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  nces of the foll
1690: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
16a0: 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73  re are used to s
16b0: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65  tore the file de
16c0: 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77  scriptor while w
16d0: 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a  aiting for an.**
16e0: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
16f0: 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20  either close or 
1700: 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72  reuse it..*/.str
1710: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1720: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1740: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1750: 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  r to close */.  
1760: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
1770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1780: 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73  gs this file des
1790: 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e  criptor was open
17a0: 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69  ed with */.  Uni
17b0: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
17c0: 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75  ;      /* Next u
17d0: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
17e0: 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69  iptor on same fi
17f0: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
1800: 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  The unixFile str
1810: 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61  ucture is subcla
1820: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
1830: 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  le specific to t
1840: 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69  he unix.** VFS i
1850: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a  mplementations..
1860: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1870: 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46  t unixFile unixF
1880: 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78  ile;.struct unix
1890: 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  File {.  sqlite3
18a0: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
18b0: 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20  t *pMethod;  /* 
18c0: 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  Always the first
18d0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
18e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61 74 20  /* The VFS that 
1910: 63 72 65 61 74 65 64 20 74 68 69 73 20 75 6e 69  created this uni
1920: 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49  xFile */.  unixI
1930: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1940: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1950: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1960: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1970: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19a0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19b0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
19c0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
19d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19e0: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
19f0: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1a00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  .  unsigned shor
1a10: 74 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b  t int ctrlFlags;
1a20: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1a30: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1a40: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1a50: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1a80: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1a90: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1aa0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1ab0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1ac0: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1ad0: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1ae0: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1af0: 75 73 65 64 46 64 20 2a 70 50 72 65 61 6c 6c 6f  usedFd *pPreallo
1b00: 63 61 74 65 64 55 6e 75 73 65 64 3b 20 20 2f 2a  catedUnused;  /*
1b10: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1b20: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1b40: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1b50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b60: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1b70: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1ba0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1bb0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1bc0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1bf0: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1c00: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1c10: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1c20: 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b    int nFetchOut;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c50: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  of outstanding x
1c60: 46 65 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20  Fetch refs */.  
1c70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1c80: 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  apSize;         
1c90: 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69      /* Usable si
1ca0: 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74  ze of mapping at
1cb0: 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20   pMapRegion */. 
1cc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1cd0: 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20  mapSizeActual;  
1ce0: 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73       /* Actual s
1cf0: 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61  ize of mapping a
1d00: 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  t pMapRegion */.
1d10: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1d20: 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20  mmapSizeMax;    
1d30: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
1d40: 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  red FCNTL_MMAP_S
1d50: 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76  IZE value */.  v
1d60: 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b  oid *pMapRegion;
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
1d90: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65  ped region */.#e
1da0: 6e 64 69 66 0a 20 20 69 6e 74 20 73 65 63 74 6f  ndif.  int secto
1db0: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1dd0: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1de0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1df0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1e10: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1e20: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1e30: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1e40: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1e50: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1e60: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e80: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1e90: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1ea0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1eb0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1ec0: 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  YLE || defined(_
1ed0: 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69  _APPLE__).  unsi
1ee0: 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20  gned fsFlags;   
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69 6c  /* cached detail
1f10: 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20  s from statfs() 
1f20: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
1f30: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
1f40: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
1f50: 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *pId;          /
1f60: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
1f70: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
1f80: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1f90: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f   /* The next gro
1fa0: 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20  up of variables 
1fb0: 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61 63  are used to trac
1fc0: 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  k whether or not
1fd0: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
1fe0: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e  ction counter in
1ff0: 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20   bytes 24-27 of 
2000: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  database files a
2010: 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20  re updated.  ** 
2020: 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72  whenever any par
2030: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
2040: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61  e changes.  An a
2050: 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77  ssertion fault w
2060: 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69  ill.  ** occur i
2070: 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64 61  f a file is upda
2080: 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f  ted without also
2090: 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74 72   updating the tr
20a0: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63  ansaction.  ** c
20b0: 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65  ounter.  This te
20c0: 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76  st is made to av
20d0: 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73  oid new problems
20e0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a   similar to the.
20f0: 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62    ** one describ
2100: 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35  ed by ticket #35
2110: 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69  84. .  */.  unsi
2120: 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73 43  gned char transC
2130: 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72  ntrChng;   /* Tr
2140: 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  ue if the transa
2150: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68  ction counter ch
2160: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  anged */.  unsig
2170: 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61 74  ned char dbUpdat
2180: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  e;        /* Tru
2190: 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  e if any part of
21a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
21b0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
21c0: 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d  gned char inNorm
21d0: 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72  alWrite;   /* Tr
21e0: 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61  ue if in a norma
21f0: 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  l write operatio
2200: 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a 23 69  n */..#endif..#i
2210: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2220: 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f  .  /* In test mo
2230: 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  de, increase the
2240: 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74   size of this st
2250: 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f  ructure a bit so
2260: 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69   that .  ** it i
2270: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
2280: 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69  e struct CrashFi
2290: 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65  le defined in te
22a0: 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68  st6.c..  */.  ch
22b0: 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b  ar aPadding[32];
22c0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 20 54  .#endif.};../* T
22d0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 6f 6c  his variable hol
22e0: 64 73 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  ds the process i
22f0: 64 20 28 70 69 64 29 20 66 72 6f 6d 20 77 68 65  d (pid) from whe
2300: 6e 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  n the xRandomnes
2310: 73 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 77 61  s().** method wa
2320: 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 78 4f  s called.  If xO
2330: 70 65 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  pen() is called 
2340: 66 72 6f 6d 20 61 20 64 69 66 66 65 72 65 6e 74  from a different
2350: 20 70 72 6f 63 65 73 73 20 69 64 2c 0a 2a 2a 20   process id,.** 
2360: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
2370: 61 20 66 6f 72 6b 28 29 20 68 61 73 20 6f 63 63  a fork() has occ
2380: 75 72 72 65 64 2c 20 74 68 65 20 50 52 4e 47 20  urred, the PRNG 
2390: 77 69 6c 6c 20 62 65 20 72 65 73 65 74 2e 0a 2a  will be reset..*
23a0: 2f 0a 73 74 61 74 69 63 20 70 69 64 5f 74 20 72  /.static pid_t r
23b0: 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 30  andomnessPid = 0
23c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
23d0: 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
23e0: 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61  unixFile.ctrlFla
23f0: 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23  gs bitmask:.*/.#
2400: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2410: 45 58 43 4c 20 20 20 20 20 20 20 20 30 78 30 31  EXCL        0x01
2420: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
2430: 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f  ons from one pro
2440: 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  cess only */.#de
2450: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44  fine UNIXFILE_RD
2460: 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20 20  ONLY      0x02  
2470: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
2480: 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f   is read only */
2490: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
24a0: 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78  E_PERSIST_WAL 0x
24b0: 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73  04     /* Persis
24c0: 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f  tent WAL mode */
24d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24e0: 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
24f0: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
2500: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
2510: 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f  8     /* Directo
2520: 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a  ry sync needed *
2530: 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  /.#else.# define
2540: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2550: 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66  C    0x00.#endif
2560: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2570: 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 30 78  E_PSOW        0x
2580: 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  10     /* SQLITE
2590: 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
25a0: 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64  _OVERWRITE */.#d
25b0: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44  efine UNIXFILE_D
25c0: 45 4c 45 54 45 20 20 20 20 20 20 30 78 32 30 20  ELETE      0x20 
25d0: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
25e0: 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e   close */.#defin
25f0: 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20  e UNIXFILE_URI  
2600: 20 20 20 20 20 20 20 30 78 34 30 20 20 20 20 20         0x40     
2610: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68  /* Filename migh
2620: 74 20 68 61 76 65 20 71 75 65 72 79 20 70 61 72  t have query par
2630: 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69  ameters */.#defi
2640: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  ne UNIXFILE_NOLO
2650: 43 4b 20 20 20 20 20 20 30 78 38 30 20 20 20 20  CK      0x80    
2660: 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c   /* Do no file l
2670: 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ocking */../*.**
2680: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
2690: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
26a0: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
26b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
26c0: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
26d0: 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73  * Define various
26e0: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65   macros that are
26f0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
2700: 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  me systems..*/.#
2710: 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49  ifndef O_LARGEFI
2720: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
2730: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2740: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2750: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64  ISABLE_LFS.# und
2760: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2770: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2780: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2790: 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a  ndef O_NOFOLLOW.
27a0: 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c  # define O_NOFOL
27b0: 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  LOW 0.#endif.#if
27c0: 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20  ndef O_BINARY.# 
27d0: 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20  define O_BINARY 
27e0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
27f0: 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63  The threadid mac
2800: 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74  ro resolves to t
2810: 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20  he thread-id or 
2820: 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a  to 0.  Used for.
2830: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  ** testing and d
2840: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
2850: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
2860: 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20  EADSAFE.#define 
2870: 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64  threadid pthread
2880: 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64  _self().#else.#d
2890: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30  efine threadid 0
28a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
28b0: 41 56 45 5f 4d 52 45 4d 41 50 20 64 65 66 61 75  AVE_MREMAP defau
28c0: 6c 74 73 20 74 6f 20 74 72 75 65 20 6f 6e 20 4c  lts to true on L
28d0: 69 6e 75 78 20 61 6e 64 20 66 61 6c 73 65 20 65  inux and false e
28e0: 76 65 72 79 77 68 65 72 65 20 65 6c 73 65 2e 0a  verywhere else..
28f0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2900: 48 41 56 45 5f 4d 52 45 4d 41 50 29 0a 23 20 69  HAVE_MREMAP).# i
2910: 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  f defined(__linu
2920: 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28  x__) && defined(
2930: 5f 47 4e 55 5f 53 4f 55 52 43 45 29 0a 23 20 20  _GNU_SOURCE).#  
2940: 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d  define HAVE_MREM
2950: 41 50 20 31 0a 23 20 65 6c 73 65 0a 23 20 20 64  AP 1.# else.#  d
2960: 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41  efine HAVE_MREMA
2970: 50 20 30 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  P 0.# endif.#end
2980: 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6c 69 63  if../*.** Explic
2990: 69 74 6c 79 20 63 61 6c 6c 20 74 68 65 20 36 34  itly call the 64
29a0: 2d 62 69 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  -bit version of 
29b0: 6c 73 65 65 6b 28 29 20 6f 6e 20 41 6e 64 72 6f  lseek() on Andro
29c0: 69 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c  id. Otherwise, l
29d0: 73 65 65 6b 28 29 0a 2a 2a 20 69 73 20 74 68 65  seek().** is the
29e0: 20 33 32 2d 62 69 74 20 76 65 72 73 69 6f 6e 2c   32-bit version,
29f0: 20 65 76 65 6e 20 69 66 20 5f 46 49 4c 45 5f 4f   even if _FILE_O
2a00: 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69 73  FFSET_BITS=64 is
2a10: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
2a20: 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a  def __ANDROID__.
2a30: 23 20 64 65 66 69 6e 65 20 6c 73 65 65 6b 20 6c  # define lseek l
2a40: 73 65 65 6b 36 34 0a 23 65 6e 64 69 66 0a 0a 23  seek64.#endif..#
2a50: 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a  ifdef __linux__.
2a60: 2f 2a 0a 2a 2a 20 4c 69 6e 75 78 2d 73 70 65 63  /*.** Linux-spec
2a70: 69 66 69 63 20 49 4f 43 54 4c 20 6d 61 67 69 63  ific IOCTL magic
2a80: 20 6e 75 6d 62 65 72 73 20 75 73 65 64 20 66 6f   numbers used fo
2a90: 72 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 46 32  r controlling F2
2aa0: 46 53 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 32  FS.*/.#define F2
2ab0: 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 20 20  FS_IOCTL_MAGIC  
2ac0: 20 20 20 20 20 20 30 78 66 35 0a 23 64 65 66 69        0xf5.#defi
2ad0: 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54 41 52  ne F2FS_IOC_STAR
2ae0: 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 20  T_ATOMIC_WRITE  
2af0: 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54     _IO(F2FS_IOCT
2b00: 4c 5f 4d 41 47 49 43 2c 20 31 29 0a 23 64 65 66  L_MAGIC, 1).#def
2b10: 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 43 4f 4d  ine F2FS_IOC_COM
2b20: 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  MIT_ATOMIC_WRITE
2b30: 20 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43      _IO(F2FS_IOC
2b40: 54 4c 5f 4d 41 47 49 43 2c 20 32 29 0a 23 64 65  TL_MAGIC, 2).#de
2b50: 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54  fine F2FS_IOC_ST
2b60: 41 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52 49  ART_VOLATILE_WRI
2b70: 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f  TE   _IO(F2FS_IO
2b80: 43 54 4c 5f 4d 41 47 49 43 2c 20 33 29 0a 23 64  CTL_MAGIC, 3).#d
2b90: 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 41  efine F2FS_IOC_A
2ba0: 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52  BORT_VOLATILE_WR
2bb0: 49 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f 49  ITE   _IO(F2FS_I
2bc0: 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 35 29 0a 23  OCTL_MAGIC, 5).#
2bd0: 64 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f  define F2FS_IOC_
2be0: 47 45 54 5f 46 45 41 54 55 52 45 53 20 20 20 20  GET_FEATURES    
2bf0: 20 20 20 20 20 20 20 5f 49 4f 52 28 46 32 46 53         _IOR(F2FS
2c00: 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 31 32  _IOCTL_MAGIC, 12
2c10: 2c 20 75 33 32 29 0a 23 64 65 66 69 6e 65 20 46  , u32).#define F
2c20: 32 46 53 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d  2FS_FEATURE_ATOM
2c30: 49 43 5f 57 52 49 54 45 20 30 78 30 30 30 34 0a  IC_WRITE 0x0004.
2c40: 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75  #endif /* __linu
2c50: 78 5f 5f 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 44  x__ */.../*.** D
2c60: 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79  ifferent Unix sy
2c70: 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70  stems declare op
2c80: 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e  en() in differen
2c90: 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73  t ways.  Same us
2ca0: 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20  e.** open(const 
2cb0: 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74  char*,int,mode_t
2cc0: 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f  ).  Others use o
2cd0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
2ce0: 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65  int,...)..** The
2cf0: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69   difference is i
2d00: 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73  mportant when us
2d10: 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
2d20: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   the function..*
2d30: 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20  *.** The safest 
2d40: 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68  way to deal with
2d50: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20   the problem is 
2d60: 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  to always use th
2d70: 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68  is wrapper.** wh
2d80: 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74  ich always has t
2d90: 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66  he same well-def
2da0: 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a  ined interface..
2db0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
2dc0: 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68  sixOpen(const ch
2dd0: 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66  ar *zFile, int f
2de0: 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b  lags, int mode){
2df0: 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a  .  return open(z
2e00: 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64  File, flags, mod
2e10: 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  e);.}../* Forwar
2e20: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
2e30: 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
2e40: 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
2e50: 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74  ar*, int*);.stat
2e60: 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61  ic int unixGetpa
2e70: 67 65 73 69 7a 65 28 76 6f 69 64 29 3b 0a 0a 2f  gesize(void);../
2e80: 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d  *.** Many system
2e90: 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73   calls are acces
2ea0: 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e  sed through poin
2eb0: 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73  ter-to-functions
2ec0: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79   so that.** they
2ed0: 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64   may be overridd
2ee0: 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f  en at runtime to
2ef0: 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c   facilitate faul
2f00: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69  t injection duri
2f10: 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  ng.** testing an
2f20: 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54  d sandboxing.  T
2f30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
2f40: 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  ay holds the nam
2f50: 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a  es and pointers.
2f60: 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69  ** to all overri
2f70: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
2f80: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  lls..*/.static s
2f90: 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61  truct unix_sysca
2fa0: 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ll {.  const cha
2fb0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
2fc0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2fd0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
2fe0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
2ff0: 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e  call_ptr pCurren
3000: 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61  t; /* Current va
3010: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  lue of the syste
3020: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3030: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3040: 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66  pDefault; /* Def
3050: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20  ault value */.} 
3060: 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20  aSyscall[] = {. 
3070: 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20   { "open",      
3080: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3090: 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70 65  all_ptr)posixOpe
30a0: 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e  n,  0  },.#defin
30b0: 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28  e osOpen      ((
30c0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
30d0: 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73  r*,int,int))aSys
30e0: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
30f0: 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20  )..  { "close", 
3100: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3110: 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73  syscall_ptr)clos
3120: 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  e,      0  },.#d
3130: 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20  efine osClose   
3140: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29    ((int(*)(int))
3150: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
3160: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65  rent)..  { "acce
3170: 73 73 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ss",       (sqli
3180: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3190: 61 63 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d  access,     0  }
31a0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65  ,.#define osAcce
31b0: 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  ss    ((int(*)(c
31c0: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29  onst char*,int))
31d0: 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72  aSyscall[2].pCur
31e0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63  rent)..  { "getc
31f0: 77 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  wd",       (sqli
3200: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3210: 67 65 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d  getcwd,     0  }
3220: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63  ,.#define osGetc
3230: 77 64 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29  wd    ((char*(*)
3240: 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61  (char*,size_t))a
3250: 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72  Syscall[3].pCurr
3260: 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22  ent)..  { "stat"
3270: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
3280: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73  e3_syscall_ptr)s
3290: 74 61 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c  tat,       0  },
32a0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20  .#define osStat 
32b0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
32c0: 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74  nst char*,struct
32d0: 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c   stat*))aSyscall
32e0: 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f  [4].pCurrent)../
32f0: 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63  *.** The DJGPP c
3300: 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d  ompiler environm
3310: 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79  ent looks mostly
3320: 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20   like Unix, but 
3330: 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20  it.** lacks the 
3340: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
3350: 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e  all.  So redefin
3360: 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20  e fcntl() to be 
3370: 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61  something.** tha
3380: 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  t always succeed
3390: 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  s.  This means t
33a0: 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73  hat locking does
33b0: 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72   not occur under
33c0: 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20  .** DJGPP.  But 
33d0: 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74  it is DOS - what
33e0: 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f   did you expect?
33f0: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47  .*/.#ifdef __DJG
3400: 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22  PP__.  { "fstat"
3410: 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20  ,        0,     
3420: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 7d              0  }
3430: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61  ,.#define osFsta
3440: 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65  t(a,b,c)    0.#e
3450: 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73  lse     .  { "fs
3460: 74 61 74 22 2c 20 20 20 20 20 20 20 20 28 73 71  tat",        (sq
3470: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3480: 72 29 66 73 74 61 74 2c 20 20 20 20 20 20 30 20  r)fstat,      0 
3490: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73   },.#define osFs
34a0: 74 61 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29  tat     ((int(*)
34b0: 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74  (int,struct stat
34c0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70  *))aSyscall[5].p
34d0: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
34e0: 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22  .  { "ftruncate"
34f0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
3500: 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63  scall_ptr)ftrunc
3510: 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66  ate,  0  },.#def
3520: 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20  ine osFtruncate 
3530: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66  ((int(*)(int,off
3540: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e  _t))aSyscall[6].
3550: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3560: 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28  fcntl",        (
3570: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3580: 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20  ptr)fcntl,      
3590: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
35a0: 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28  Fcntl     ((int(
35b0: 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29  *)(int,int,...))
35c0: 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72  aSyscall[7].pCur
35d0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64  rent)..  { "read
35e0: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
35f0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3600: 72 65 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d  read,       0  }
3610: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64  ,.#define osRead
3620: 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28        ((ssize_t(
3630: 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a  *)(int,void*,siz
3640: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d  e_t))aSyscall[8]
3650: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3660: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
3670: 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  D) || SQLITE_ENA
3680: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
3690: 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20  E.  { "pread",  
36a0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
36b0: 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64  yscall_ptr)pread
36c0: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  ,      0  },.#el
36d0: 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20  se.  { "pread", 
36e0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
36f0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
3700: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
3710: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
3720: 72 65 61 64 20 20 20 20 20 28 28 73 73 69 7a 65  read     ((ssize
3730: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
3740: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53  size_t,off_t))aS
3750: 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65  yscall[9].pCurre
3760: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3770: 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
3780: 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20  { "pread64",    
3790: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
37a0: 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34 2c 20  ll_ptr)pread64, 
37b0: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
37c0: 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20   { "pread64",   
37d0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
37e0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
37f0: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3800: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3810: 36 34 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28  64 ((ssize_t(*)(
3820: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
3830: 2c 6f 66 66 36 34 5f 74 29 29 61 53 79 73 63 61  ,off64_t))aSysca
3840: 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[10].pCurrent)
3850: 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20  ..  { "write",  
3860: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3870: 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69 74 65  yscall_ptr)write
3880: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3890: 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20 20 20  fine osWrite    
38a0: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
38b0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69  t,const void*,si
38c0: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ze_t))aSyscall[1
38d0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
38e0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
38f0: 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  EAD) || SQLITE_E
3900: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
3910: 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74 65 22  YLE.  { "pwrite"
3920: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3930: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3940: 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  ite,     0  },.#
3950: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3960: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3970: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3980: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3990: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
39a0: 73 50 77 72 69 74 65 20 20 20 20 28 28 73 73 69  sPwrite    ((ssi
39b0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
39c0: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
39d0: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
39f0: 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e  call[12].pCurren
3a00: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
3a10: 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b  USE_PREAD64).  {
3a20: 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20   "pwrite64",    
3a30: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3a40: 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34 2c 20  l_ptr)pwrite64, 
3a50: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
3a60: 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20  { "pwrite64",   
3a70: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3a80: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3a90: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
3aa0: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
3ab0: 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29  64  ((ssize_t(*)
3ac0: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3ad0: 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f 74 29  ,size_t,off64_t)
3ae0: 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
3af0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
3b00: 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  13].pCurrent).. 
3b10: 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20   { "fchmod",    
3b20: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3b30: 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20  all_ptr)fchmod, 
3b40: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
3b50: 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20  define osFchmod 
3b60: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
3b70: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
3b80: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
3b90: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
3ba0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
3bb0: 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
3bc0: 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66  FALLOCATE.  { "f
3bd0: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
3be0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3bf0: 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  tr)posix_falloca
3c00: 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  te,  0 },.#else.
3c10: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
3c20: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3c30: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3c40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3c50: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3c60: 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74  sFallocate ((int
3c70: 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66  (*)(int,off_t,of
3c80: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  f_t))aSyscall[15
3c90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3ca0: 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20   "unlink",      
3cb0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3cc0: 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20  l_ptr)unlink,   
3cd0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3ce0: 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20  fine osUnlink   
3cf0: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3d00: 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b  char*))aSyscall[
3d10: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
3d20: 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72   { "openDirector
3d30: 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  y",    (sqlite3_
3d40: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e  syscall_ptr)open
3d50: 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20  Directory,      
3d60: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f  0 },.#define osO
3d70: 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69  penDirectory ((i
3d80: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3d90: 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c  *,int*))aSyscall
3da0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
3db0: 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20    { "mkdir",    
3dc0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3dd0: 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20  call_ptr)mkdir, 
3de0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3df0: 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20  define osMkdir  
3e00: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3e10: 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29  t char*,mode_t))
3e20: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3e30: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64  rrent)..  { "rmd
3e40: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3e50: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3e60: 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20  )rmdir,         
3e70: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3e80: 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74  sRmdir     ((int
3e90: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
3ea0: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
3eb0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3ec0: 69 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57 4e  ined(HAVE_FCHOWN
3ed0: 29 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20  ).  { "fchown", 
3ee0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3ef0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6f 77  yscall_ptr)fchow
3f00: 6e 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  n,          0 },
3f10: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 63 68 6f  .#else.  { "fcho
3f20: 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  wn",       (sqli
3f30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3f40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3f50: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
3f60: 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e 20 20 20  fine osFchown   
3f70: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69   ((int(*)(int,ui
3f80: 64 5f 74 2c 67 69 64 5f 74 29 29 61 53 79 73 63  d_t,gid_t))aSysc
3f90: 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74  all[20].pCurrent
3fa0: 29 0a 0a 20 20 7b 20 22 67 65 74 65 75 69 64 22  )..  { "geteuid"
3fb0: 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ,      (sqlite3_
3fc0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 65  syscall_ptr)gete
3fd0: 75 69 64 2c 20 20 20 20 20 20 20 20 20 30 20 7d  uid,         0 }
3fe0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 65  ,.#define osGete
3ff0: 75 69 64 20 20 20 28 28 75 69 64 5f 74 28 2a 29  uid   ((uid_t(*)
4000: 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b  (void))aSyscall[
4010: 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  21].pCurrent)..#
4020: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4030: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
4040: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
4050: 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61 70  SIZE>0.  { "mmap
4060: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
4070: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
4080: 6d 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mmap,           
4090: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
40a0: 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 20 20  "mmap",         
40b0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
40c0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
40d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
40e0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61 70  f.#define osMmap
40f0: 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64   ((void*(*)(void
4100: 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74  *,size_t,int,int
4110: 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ,int,off_t))aSys
4120: 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e  call[22].pCurren
4130: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
4140: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
4150: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
4160: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b 20  MMAP_SIZE>0.  { 
4170: 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20  "munmap",       
4180: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
4190: 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20  _ptr)munmap,    
41a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
41b0: 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20  .  { "munmap",  
41c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
41d0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
41e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
41f0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
4200: 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMunmap ((void*(
4210: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  *)(void*,size_t)
4220: 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43  )aSyscall[23].pC
4230: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56  urrent)..#if HAV
4240: 45 5f 4d 52 45 4d 41 50 20 26 26 20 28 21 64 65  E_MREMAP && (!de
4250: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
4260: 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
4270: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
4280: 29 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20  ).  { "mremap", 
4290: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
42a0: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61  yscall_ptr)mrema
42b0: 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  p,          0 },
42c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d  .#else.  { "mrem
42d0: 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ap",       (sqli
42e0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
42f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4300: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
4310: 66 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28 28  fine osMremap ((
4320: 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73  void*(*)(void*,s
4330: 69 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74  ize_t,size_t,int
4340: 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32  ,...))aSyscall[2
4350: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
4360: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4370: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
4380: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
4390: 49 5a 45 3e 30 0a 20 20 7b 20 22 67 65 74 70 61  IZE>0.  { "getpa
43a0: 67 65 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74  gesize",  (sqlit
43b0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75  e3_syscall_ptr)u
43c0: 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 2c 20  nixGetpagesize, 
43d0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
43e0: 67 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28  getpagesize",  (
43f0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
4400: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
4410: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4420: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 70 61  .#define osGetpa
4430: 67 65 73 69 7a 65 20 28 28 69 6e 74 28 2a 29 28  gesize ((int(*)(
4440: 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b 32  void))aSyscall[2
4450: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
4460: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52  f defined(HAVE_R
4470: 45 41 44 4c 49 4e 4b 29 0a 20 20 7b 20 22 72 65  EADLINK).  { "re
4480: 61 64 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73 71  adlink",     (sq
4490: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
44a0: 72 29 72 65 61 64 6c 69 6e 6b 2c 20 20 20 20 20  r)readlink,     
44b0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
44c0: 7b 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 20 20  { "readlink",   
44d0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
44e0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
44f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4500: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 52 65  dif.#define osRe
4510: 61 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f 74  adlink ((ssize_t
4520: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
4530: 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53  char*,size_t))aS
4540: 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72  yscall[26].pCurr
4550: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
4560: 64 28 48 41 56 45 5f 4c 53 54 41 54 29 0a 20 20  d(HAVE_LSTAT).  
4570: 7b 20 22 6c 73 74 61 74 22 2c 20 20 20 20 20 20  { "lstat",      
4580: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
4590: 61 6c 6c 5f 70 74 72 29 6c 73 74 61 74 2c 20 20  all_ptr)lstat,  
45a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
45b0: 73 65 0a 20 20 7b 20 22 6c 73 74 61 74 22 2c 20  se.  { "lstat", 
45c0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
45d0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
45f0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
4600: 20 6f 73 4c 73 74 61 74 20 20 20 20 20 20 28 28   osLstat      ((
4610: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
4620: 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  r*,struct stat*)
4630: 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43  )aSyscall[27].pC
4640: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4650: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20  ined(__linux__) 
4660: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
4670: 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41  E_ENABLE_BATCH_A
4680: 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 7b  TOMIC_WRITE).  {
4690: 20 22 69 6f 63 74 6c 22 2c 20 20 20 20 20 20 20   "ioctl",       
46a0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
46b0: 6c 6c 5f 70 74 72 29 69 6f 63 74 6c 2c 20 20 20  ll_ptr)ioctl,   
46c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
46d0: 65 0a 20 20 7b 20 22 69 6f 63 74 6c 22 2c 20 20  e.  { "ioctl",  
46e0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
46f0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
4700: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4710: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
4720: 6f 73 49 6f 63 74 6c 20 28 28 69 6e 74 28 2a 29  osIoctl ((int(*)
4730: 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  (int,int,...))aS
4740: 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72  yscall[28].pCurr
4750: 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20  ent)..}; /* End 
4760: 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61  of the overridea
4770: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
4780: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73   */.../*.** On s
4790: 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c  ome systems, cal
47a0: 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77  ls to fchown() w
47b0: 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65  ill trigger a me
47c0: 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72  ssage in a secur
47d0: 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68  ity.** log if th
47e0: 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e  ey come from non
47f0: 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e  -root processes.
4800: 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69    So avoid calli
4810: 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a  ng fchown() if.*
4820: 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e  * we are not run
4830: 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f  ning as root..*/
4840: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
4850: 73 74 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c  stFchown(int fd,
4860: 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f   uid_t uid, gid_
4870: 74 20 67 69 64 29 7b 0a 23 69 66 20 64 65 66 69  t gid){.#if defi
4880: 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57 4e 29  ned(HAVE_FCHOWN)
4890: 0a 20 20 72 65 74 75 72 6e 20 6f 73 47 65 74 65  .  return osGete
48a0: 75 69 64 28 29 20 3f 20 30 20 3a 20 6f 73 46 63  uid() ? 0 : osFc
48b0: 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29  hown(fd,uid,gid)
48c0: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
48d0: 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
48e0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
48f0: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
4900: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
4910: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
4920: 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20  f the.** "unix" 
4930: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
4940: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
4950: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
4960: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
4970: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
4980: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
4990: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
49a0: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
49b0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
49c0: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
49d0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74  atic int unixSet
49e0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
49f0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
4a00: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
4a10: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
4a20: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
4a30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
4a40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
4a50: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
4a60: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
4a70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
4a80: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
4a90: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
4aa0: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
4ab0: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
4ac0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
4ad0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4ae0: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
4af0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
4b00: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
4b10: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
4b20: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
4b30: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
4b40: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
4b50: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
4b60: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
4b70: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
4b80: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
4b90: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4ba0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4bb0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
4bc0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
4bd0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
4be0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
4bf0: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
4c00: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
4c10: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
4c20: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
4c30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4c40: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4c50: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
4c60: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
4c70: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
4c80: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
4c90: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
4ca0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
4cb0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
4cc0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
4cd0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
4ce0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
4cf0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
4d00: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
4d10: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
4d20: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
4d30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
4d40: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
4d50: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
4d60: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
4d70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
4d80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4d90: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
4da0: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
4db0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
4dc0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
4dd0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4de0: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
4df0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4e00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4e10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4e20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4e30: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
4e40: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
4e50: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
4e60: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
4e70: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
4e80: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
4e90: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
4ea0: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
4eb0: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
4ec0: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
4ed0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
4ee0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e  3_syscall_ptr un
4ef0: 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  ixGetSystemCall(
4f00: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
4f10: 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73  pNotUsed,.  cons
4f20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
4f30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
4f40: 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  i;..  UNUSED_PAR
4f50: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
4f60: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
4f70: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
4f80: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
4f90: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
4fa0: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
4fb0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
4fc0: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
4fd0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4fe0: 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rent;.  }.  retu
4ff0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
5000: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
5010: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
5020: 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e  em call after zN
5030: 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d  ame.  If zName==
5040: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  NULL.** then ret
5050: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
5060: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
5070: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
5080: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20  ULL if zName.** 
5090: 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74  is the last syst
50a0: 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e  em call or if zN
50b0: 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e  ame is not the n
50c0: 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a  ame of a valid.*
50d0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a  * system call..*
50e0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
50f0: 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73  har *unixNextSys
5100: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
5110: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
5120: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
5130: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
5140: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
5150: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
5160: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5170: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
5180: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
5190: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
51a0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
51b0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
51c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
51d0: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
51e0: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
51f0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
5200: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
5210: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
5220: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
5230: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
5240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f  ;.}../*.** Do no
5250: 74 20 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c  t accept any fil
5260: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73  e descriptor les
5270: 73 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  s than this valu
5280: 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  e, in order to a
5290: 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  void.** opening 
52a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
52b0: 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69 70  ing file descrip
52c0: 74 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 6f  tors that are co
52d0: 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  mmonly used for 
52e0: 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70  .** standard inp
52f0: 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20  ut, output, and 
5300: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  error..*/.#ifnde
5310: 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d  f SQLITE_MINIMUM
5320: 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52  _FILE_DESCRIPTOR
5330: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
5340: 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45  _MINIMUM_FILE_DE
5350: 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69  SCRIPTOR 3.#endi
5360: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  f../*.** Invoke 
5370: 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d  open().  Do so m
5380: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75  ultiple times, u
5390: 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20 73  ntil it either s
53a0: 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61  ucceeds or.** fa
53b0: 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61  ils for some rea
53c0: 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45  son other than E
53d0: 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  INTR..**.** If t
53e0: 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  he file creation
53f0: 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74   mode "m" is 0 t
5400: 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68  hen set it to th
5410: 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a  e default for.**
5420: 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65   SQLite.  The de
5430: 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f  fault is SQLITE_
5440: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
5450: 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c  MISSIONS (normal
5460: 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d  ly.** 0644) as m
5470: 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20 73  odified by the s
5480: 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66  ystem umask.  If
5490: 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65   m is not 0, the
54a0: 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69  n.** make the fi
54b0: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
54c0: 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67   be exactly m ig
54d0: 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b  noring the umask
54e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61  ..**.** The m pa
54f0: 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20  rameter will be 
5500: 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68  non-zero only wh
5510: 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c  en creating -wal
5520: 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61  , -journal,.** a
5530: 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20  nd -shm files.  
5540: 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69  We want those fi
5550: 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61  les to have *exa
5560: 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a  ctly* the same.*
5570: 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73  * permissions as
5580: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
5590: 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c  database, unadul
55a0: 74 65 72 61 74 65 64 20 62 79 20 74 68 65 20 75  terated by the u
55b0: 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  mask..** In that
55c0: 20 77 61 79 2c 20 69 66 20 61 20 64 61 74 61 62   way, if a datab
55d0: 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d  ase file is -rw-
55e0: 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d  rw-rw or -rw-rw-
55f0: 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61  r-, and a.** tra
5600: 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73  nsaction crashes
5610: 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69   and leaves behi
5620: 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c  nd hot journals,
5630: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f   then any.** pro
5640: 63 65 73 73 20 74 68 61 74 20 69 73 20 61 62 6c  cess that is abl
5650: 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  e to write to th
5660: 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  e database will 
5670: 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a  also be able to.
5680: 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20 68  ** recover the h
5690: 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a  ot journals..*/.
56a0: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
56b0: 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  t_open(const cha
56c0: 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64  r *z, int f, mod
56d0: 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64  e_t m){.  int fd
56e0: 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20  ;.  mode_t m2 = 
56f0: 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44  m ? m : SQLITE_D
5700: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
5710: 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65  ISSIONS;.  while
5720: 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  (1){.#if defined
5730: 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20  (O_CLOEXEC).    
5740: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c  fd = osOpen(z,f|
5750: 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23  O_CLOEXEC,m2);.#
5760: 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73  else.    fd = os
5770: 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65  Open(z,f,m2);.#e
5780: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c  ndif.    if( fd<
5790: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  0 ){.      if( e
57a0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f  rrno==EINTR ) co
57b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72  ntinue;.      br
57c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
57d0: 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49  f( fd>=SQLITE_MI
57e0: 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52  NIMUM_FILE_DESCR
57f0: 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20  IPTOR ) break;. 
5800: 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a     osClose(fd);.
5810: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
5820: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
5830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5840: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65   "attempt to ope
5850: 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65  n \"%s\" as file
5860: 20 64 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c   descriptor %d",
5870: 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20   z, fd);.    fd 
5880: 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73  = -1;.    if( os
5890: 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22  Open("/dev/null"
58a0: 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61  , f, m)<0 ) brea
58b0: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e  k;.  }.  if( fd>
58c0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21  =0 ){.    if( m!
58d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
58e0: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
58f0: 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
5900: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
5910: 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73  ==0 .       && s
5920: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
5930: 30 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61  0.       && (sta
5940: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37  tbuf.st_mode&077
5950: 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a  7)!=m .      ){.
5960: 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64          osFchmod
5970: 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d  (fd, m);.      }
5980: 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
5990: 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26  ed(FD_CLOEXEC) &
59a0: 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c  & (!defined(O_CL
59b0: 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45  OEXEC) || O_CLOE
59c0: 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63  XEC==0).    osFc
59d0: 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
59e0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
59f0: 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
5a00: 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20  OEXEC);.#endif. 
5a10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a   }.  return fd;.
5a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
5a30: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
5a40: 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
5a50: 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
5a60: 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
5a70: 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
5a80: 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
5a90: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e  unixInodeInfo an
5aa0: 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65  d.** vxworksFile
5ab0: 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  Id objects used 
5ac0: 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  by this file, al
5ad0: 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
5ae0: 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20  e .** shared by 
5af0: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
5b00: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
5b10: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
5b20: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
5b30: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
5b40: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
5b50: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
5b60: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
5b70: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
5b80: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
5b90: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
5ba0: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
5bb0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
5bc0: 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
5bd0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
5be0: 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ) );.**   unixEn
5bf0: 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74  terLeave().*/.st
5c00: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e  atic void unixEn
5c10: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
5c20: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5c30: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
5c40: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
5c50: 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31  UTEX_STATIC_VFS1
5c60: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
5c70: 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78  d unixLeaveMutex
5c80: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
5c90: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
5ca0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
5cb0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
5cc0: 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69  TIC_VFS1));.}.#i
5cd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5ce0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  G.static int uni
5cf0: 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  xMutexHeld(void)
5d00: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
5d10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
5d20: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
5d30: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5d40: 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23  ATIC_VFS1));.}.#
5d50: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
5d60: 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52  QLITE_HAVE_OS_TR
5d70: 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  ACE./*.** Helper
5d80: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72   function for pr
5d90: 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65  inting out trace
5da0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
5db0: 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62  m debugging.** b
5dc0: 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65  inaries. This re
5dd0: 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
5de0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
5df0: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a  of the supplied.
5e00: 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d  ** integer lock-
5e10: 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  type..*/.static 
5e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69  const char *azFi
5e30: 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65  leLock(int eFile
5e40: 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28  Lock){.  switch(
5e50: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
5e60: 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20    case NO_LOCK: 
5e70: 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20  return "NONE";. 
5e80: 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c     case SHARED_L
5e90: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41  OCK: return "SHA
5ea0: 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52  RED";.    case R
5eb0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65  ESERVED_LOCK: re
5ec0: 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b  turn "RESERVED";
5ed0: 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e  .    case PENDIN
5ee0: 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  G_LOCK: return "
5ef0: 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61  PENDING";.    ca
5f00: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
5f10: 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55  K: return "EXCLU
5f20: 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74  SIVE";.  }.  ret
5f30: 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23  urn "ERROR";.}.#
5f40: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
5f50: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
5f60: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20  /*.** Print out 
5f70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
5f80: 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70  t all locking op
5f90: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
5fa0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5fb0: 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65  used for trouble
5fc0: 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f  shooting locks o
5fd0: 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a  n multithreaded.
5fe0: 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45  ** platforms.  E
5ff0: 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69  nable by compili
6000: 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51  ng with the -DSQ
6010: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
6020: 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  ** command-line 
6030: 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f  option on the co
6040: 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f  mpiler.  This co
6050: 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  de is normally.*
6060: 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  * turned off..*/
6070: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
6080: 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e  Trace(int fd, in
6090: 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f  t op, struct flo
60a0: 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  ck *p){.  char *
60b0: 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b  zOpName, *zType;
60c0: 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20  .  int s;.  int 
60d0: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66  savedErrno;.  if
60e0: 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b  ( op==F_GETLK ){
60f0: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
6100: 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  GETLK";.  }else 
6110: 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20  if( op==F_SETLK 
6120: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
6130: 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "SETLK";.  }els
6140: 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e  e{.    s = osFcn
6150: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
6160: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
6170: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b  rintf("fcntl unk
6180: 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22  nown %d %d %d\n"
6190: 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20  , fd, op, s);.  
61a0: 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a    return s;.  }.
61b0: 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d    if( p->l_type=
61c0: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
61d0: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
61e0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
61f0: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
6200: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
6210: 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  WRLCK";.  }else 
6220: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
6230: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _UNLCK ){.    zT
6240: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
6250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
6260: 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61  rt( 0 );.  }.  a
6270: 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e  ssert( p->l_when
6280: 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a  ce==SEEK_SET );.
6290: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
62a0: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
62b0: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
62c0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
62d0: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
62e0: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
62f0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
6300: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
6310: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
6320: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
6330: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
6340: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
6350: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
6360: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
6370: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
6380: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
6390: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
63a0: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
63b0: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
63c0: 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  p;.    osFcntl(f
63d0: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
63e0: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
63f0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
6400: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
6410: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
6420: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
6430: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
6440: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
6450: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
6460: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
6470: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
6480: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
6490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
64a0: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
64b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
64c0: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
64d0: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
64e0: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
64f0: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
6500: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
6510: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
6520: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
6530: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
6540: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
6550: 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63  s;.}.#undef osFc
6560: 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  ntl.#define osFc
6570: 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65  ntl lockTrace.#e
6580: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  ndif /* SQLITE_L
6590: 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  OCK_TRACE */../*
65a0: 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63  .** Retry ftrunc
65b0: 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74  ate() calls that
65c0: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e   fail due to EIN
65d0: 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c  TR.**.** All cal
65e0: 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74 65 28  ls to ftruncate(
65f0: 29 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 69  ) within this fi
6600: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64  le should be mad
6610: 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69  e through.** thi
6620: 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e 20 74  s wrapper.  On t
6630: 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61 74 66  he Android platf
6640: 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67 20 74  orm, bypassing t
6650: 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a  he logic below.*
6660: 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  * could lead to 
6670: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
6680: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
6690: 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  t robust_ftrunca
66a0: 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65  te(int h, sqlite
66b0: 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69  3_int64 sz){.  i
66c0: 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f  nt rc;.#ifdef __
66d0: 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f  ANDROID__.  /* O
66e0: 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e  n Android, ftrun
66f0: 63 61 74 65 28 29 20 61 6c 77 61 79 73 20 75 73  cate() always us
6700: 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73 65 74  es 32-bit offset
6710: 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a  s, even if .  **
6720: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
6730: 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64  TS=64 is defined
6740: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 74 20  . This means it 
6750: 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61 74 74  is unsafe to att
6760: 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75  empt to.  ** tru
6770: 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
6780: 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65 72 20  any size larger 
6790: 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e  than 2GiB. Silen
67a0: 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20  tly ignore any. 
67b0: 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d 70 74   ** such attempt
67c0: 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e  s.  */.  if( sz>
67d0: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30  (sqlite3_int64)0
67e0: 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20 20 20  x7FFFFFFF ){.   
67f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6800: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
6810: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72    do{ rc = osFtr
6820: 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77  uncate(h,sz); }w
6830: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
6840: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
6850: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6860: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6870: 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74   translates a st
6880: 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72  andard POSIX err
6890: 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d  no code into som
68a0: 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c  ething.** useful
68b0: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20   to the clients 
68c0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66  of the sqlite3 f
68d0: 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69  unctions.  Speci
68e0: 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a  fically, it is.*
68f0: 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72  * intended to tr
6900: 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74  anslate a variet
6910: 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22  y of "try again"
6920: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c   errors into SQL
6930: 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20  ITE_BUSY.** and 
6940: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c  a variety of "pl
6950: 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66  ease close the f
6960: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e  ile descriptor N
6970: 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  OW" errors into 
6980: 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
6990: 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64  .** .** Errors d
69a0: 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  uring initializa
69b0: 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f  tion of locks, o
69c0: 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  r file system su
69d0: 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c  pport for locks,
69e0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c  .** should handl
69f0: 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55  e ENOLCK, ENOTSU
6a00: 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65  P, EOPNOTSUPP se
6a10: 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  parately..*/.sta
6a20: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72  tic int sqliteEr
6a30: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
6a40: 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72  r(int posixError
6a50: 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72  , int sqliteIOEr
6a60: 72 29 20 7b 0a 20 20 61 73 73 65 72 74 28 20 28  r) {.  assert( (
6a70: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
6a80: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
6a90: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
6aa0: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6ab0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
6ac0: 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  OCK) || .       
6ad0: 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20     (sqliteIOErr 
6ae0: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
6af0: 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20  RDLOCK) ||.     
6b00: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6b10: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6b20: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
6b30: 4f 43 4b 29 20 29 3b 0a 20 20 73 77 69 74 63 68  OCK) );.  switch
6b40: 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a   (posixError) {.
6b50: 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a    case EACCES: .
6b60: 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20    case EAGAIN:. 
6b70: 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a   case ETIMEDOUT:
6b80: 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20  .  case EBUSY:. 
6b90: 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63   case EINTR:.  c
6ba0: 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20  ase ENOLCK:  .  
6bb0: 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20    /* random NFS 
6bc0: 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c  retry error, unl
6bd0: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
6be0: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
6bf0: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
6c00: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
6c10: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
6c20: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
6c30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6c40: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20  TE_BUSY;.    .  
6c50: 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20  case EPERM: .   
6c60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
6c70: 45 52 4d 3b 0a 20 20 20 20 0a 20 20 64 65 66 61  ERM;.    .  defa
6c80: 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  ult: .    return
6c90: 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20   sqliteIOErr;.  
6ca0: 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}.../*********
6cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cf0: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
6d00: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55  ******** Begin U
6d10: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
6d20: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
6d30: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
6d40: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d  *****.**.** On m
6d50: 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ost versions of 
6d60: 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74  unix, we can get
6d70: 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72   a unique ID for
6d80: 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61   a file by conca
6d90: 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  tenating.** the 
6da0: 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e  device number an
6db0: 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  d the inode numb
6dc0: 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f  er.  But this do
6dd0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
6de0: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78  xWorks..** On Vx
6df0: 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20  Works, a unique 
6e00: 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20  file id must be 
6e10: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e  based on the can
6e20: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
6e30: 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
6e40: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
6e50: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
6e60: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
6e70: 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75  e used as a.** u
6e80: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e  nique file ID in
6e90: 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20   VxWorks.  Each 
6ea0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
6eb0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
6ec0: 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66  ins.** a copy of
6ed0: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
6ee0: 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20  ilename.  There 
6ef0: 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65  is also a refere
6f00: 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20  nce count.  .** 
6f10: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73  The structure is
6f20: 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20   reclaimed when 
6f30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
6f40: 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f  inters to it dro
6f50: 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a  ps to.** zero..*
6f60: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e  *.** There are n
6f70: 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66  ever very many f
6f80: 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65  iles open at one
6f90: 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70   time and lookup
6fa0: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70  s are not.** a p
6fb0: 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69  erformance-criti
6fc0: 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20  cal path, so it 
6fd0: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
6fe0: 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74   put these.** st
6ff0: 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69  ructures on a li
7000: 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  nked list..*/.st
7010: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7020: 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78  Id {.  struct vx
7030: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
7040: 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20  xt;  /* Next in 
7050: 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  a list of them a
7060: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ll */.  int nRef
7070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7080: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7090: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
70a0: 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69   this one */.  i
70b0: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
70d0: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43  Length of the zC
70e0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73  anonicalName[] s
70f0: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
7100: 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b  *zCanonicalName;
7110: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f           /* Cano
7120: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a  nical filename *
7130: 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  /.};..#if OS_VXW
7140: 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20  ORKS./* .** All 
7150: 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73  unique filenames
7160: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c   are held on a l
7170: 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65  inked list heade
7180: 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72  d by this.** var
7190: 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63  iable:.*/.static
71a0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
71b0: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
71c0: 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  leList = 0;../*.
71d0: 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69  ** Simplify a fi
71e0: 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20  lename into its 
71f0: 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a  canonical form.*
7200: 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20  * by making the 
7210: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
7220: 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f  s:.**.**  * remo
7230: 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e  ving any trailin
7240: 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20  g and duplicate 
7250: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
7260: 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  /./ into just /.
7270: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41  **  * convert /A
7280: 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20  /../ where A is 
7290: 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20  any simple name 
72a0: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a  into just /.**.*
72b0: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61  * Changes are ma
72c0: 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65  de in-place.  Re
72d0: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d  turn the new nam
72e0: 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20  e length..**.** 
72f0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  The original fil
7300: 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e  ename is in z[0.
7310: 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74  .n-1].  Return t
7320: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
7330: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
7340: 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d  e simplified nam
7350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
7360: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
7370: 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e  Name(char *z, in
7380: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  t n){.  int i, j
7390: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  ;.  while( n>1 &
73a0: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b  & z[n-1]=='/' ){
73b0: 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d   n--; }.  for(i=
73c0: 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
73d0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f      if( z[i]=='/
73e0: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ' ){.      if( z
73f0: 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
7400: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
7410: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
7420: 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+2<n && z[i+2]=
7430: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
7440: 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i += 1;.        
7450: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7460: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  }.      if( z[i+
7470: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e  1]=='.' && i+3<n
7480: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20   && z[i+2]=='.' 
7490: 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29  && z[i+3]=='/' )
74a0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
74b0: 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d   j>0 && z[j-1]!=
74c0: 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
74d0: 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b        if( j>0 ){
74e0: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
74f0: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
7500: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7510: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b  }.    }.    z[j+
7520: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20  +] = z[i];.  }. 
7530: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74   z[j] = 0;.  ret
7540: 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn j;.}../*.** 
7550: 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69  Find a unique fi
7560: 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69  le ID for the gi
7570: 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74  ven absolute pat
7580: 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a  hname.  Return.*
7590: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
75a0: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
75b0: 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70   object.  This p
75c0: 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e  ointer is the un
75d0: 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e  ique.** file ID.
75e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20  .**.** The nRef 
75f0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77  field of the vxw
7600: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
7610: 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
7620: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f   before.** the o
7630: 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65  bject is returne
7640: 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b  d.  A new vxwork
7650: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
7660: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
7670: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c   added to the gl
7680: 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63  obal list if nec
7690: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
76a0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
76b0: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
76c0: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  s, return NULL..
76d0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
76e0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
76f0: 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
7700: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  d(const char *zA
7710: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20  bsoluteName){.  
7720: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7730: 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20  leId *pNew;     
7740: 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65      /* search ke
7750: 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49  y and new file I
7760: 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  D */.  struct vx
7770: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61  worksFileId *pCa
7780: 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f  ndidate;   /* Fo
7790: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
77a0: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73  xisting file IDs
77b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
77e0: 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65  gth of zAbsolute
77f0: 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a  Name string */..
7800: 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c    assert( zAbsol
7810: 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  uteName[0]=='/' 
7820: 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74  );.  n = (int)st
7830: 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61  rlen(zAbsoluteNa
7840: 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  me);.  pNew = sq
7850: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
7860: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
7870: 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  (n+1) );.  if( p
7880: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
7890: 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  0;.  pNew->zCano
78a0: 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61  nicalName = (cha
78b0: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d  r*)&pNew[1];.  m
78c0: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e  emcpy(pNew->zCan
78d0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73  onicalName, zAbs
78e0: 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b  oluteName, n+1);
78f0: 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69  .  n = vxworksSi
7900: 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d  mplifyName(pNew-
7910: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
7920: 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63   n);..  /* Searc
7930: 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
7940: 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  g entry that mat
7950: 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69  ching the canoni
7960: 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49  cal name..  ** I
7970: 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65  f found, increme
7980: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
7990: 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72   count and retur
79a0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20  n a pointer to. 
79b0: 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67   ** the existing
79c0: 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20   file ID..  */. 
79d0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
79e0: 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64  );.  for(pCandid
79f0: 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ate=vxworksFileL
7a00: 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b  ist; pCandidate;
7a10: 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e   pCandidate=pCan
7a20: 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a  didate->pNext){.
7a30: 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61      if( pCandida
7a40: 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20  te->nName==n .  
7a50: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61     && memcmp(pCa
7a60: 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69  ndidate->zCanoni
7a70: 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  calName, pNew->z
7a80: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
7a90: 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
7aa0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7ab0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43  pNew);.       pC
7ac0: 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b  andidate->nRef++
7ad0: 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61  ;.       unixLea
7ae0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
7af0: 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64    return pCandid
7b00: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ate;.    }.  }..
7b10: 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61    /* No match wa
7b20: 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c  s found.  We wil
7b30: 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c  l make a new fil
7b40: 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  e ID */.  pNew->
7b50: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77  nRef = 1;.  pNew
7b60: 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70  ->nName = n;.  p
7b70: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77  New->pNext = vxw
7b80: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20  orksFileList;.  
7b90: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
7ba0: 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65  = pNew;.  unixLe
7bb0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
7bc0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7bd0: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
7be0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
7bf0: 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69  t on a vxworksFi
7c00: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72  leId object.  Fr
7c10: 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  ee.** the object
7c20: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
7c30: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
7c40: 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  s zero..*/.stati
7c50: 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65  c void vxworksRe
7c60: 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75  leaseFileId(stru
7c70: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7c80: 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e   *pId){.  unixEn
7c90: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
7ca0: 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e  sert( pId->nRef>
7cb0: 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66  0 );.  pId->nRef
7cc0: 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e  --;.  if( pId->n
7cd0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  Ref==0 ){.    st
7ce0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7cf0: 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72  Id **pp;.    for
7d00: 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65  (pp=&vxworksFile
7d10: 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70  List; *pp && *pp
7d20: 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a  !=pId; pp = &((*
7d30: 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20  pp)->pNext)){}. 
7d40: 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d     assert( *pp==
7d50: 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d  pId );.    *pp =
7d60: 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pId->pNext;.   
7d70: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
7d80: 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
7d90: 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65  aveMutex();.}.#e
7da0: 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
7db0: 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  KS */./*********
7dc0: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e  ****** End of Un
7dd0: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
7de0: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
7df0: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
7e00: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
7e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e50: 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
7e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ea0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
7eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ec0: 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f  *** Posix Adviso
7ed0: 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  ry Locking *****
7ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ef0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f  *******.**.** PO
7f00: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
7f10: 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79  ks are broken by
7f20: 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53   design.  ANSI S
7f30: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
7f40: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
7f50: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
7f60: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
7f70: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
7f80: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
7f90: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
7fa0: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
7fb0: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
7fc0: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
7fd0: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
7fe0: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
7ff0: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
8000: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
8010: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
8020: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
8030: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
8040: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
8050: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
8060: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
8070: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
8080: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
8090: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
80a0: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
80b0: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
80c0: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
80d0: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
80e0: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
80f0: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
8100: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
8110: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
8120: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
8130: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
8140: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
8150: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
8160: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
8170: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
8180: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
8190: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
81a0: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
81b0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
81c0: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
81d0: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
81e0: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
81f0: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
8200: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
8210: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
8220: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
8230: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
8240: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
8250: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
8260: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
8270: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
8280: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
8290: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
82a0: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
82b0: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
82c0: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
82d0: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
82e0: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
82f0: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   names..**.** Th
8300: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  is means that we
8310: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
8320: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
8330: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
8340: 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70  ss.** among comp
8350: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
8360: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
8370: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
8380: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
8390: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
83a0: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
83b0: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
83c0: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
83d0: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
83e0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
83f0: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
8400: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
8410: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
8420: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
8430: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
8440: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
8450: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
8460: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
8470: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
8480: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
8490: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
84a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
84b0: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
84c0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
84d0: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
84e0: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
84f0: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
8500: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
8510: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
8520: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
8530: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
8540: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
8550: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
8560: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
8570: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
8580: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
8590: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
85a0: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
85b0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
85c0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
85d0: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
85e0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
85f0: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
8600: 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20  .** (Aside: The 
8610: 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d  use of inode num
8620: 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49  bers as unique I
8630: 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  Ds does not work
8640: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
8650: 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20  For VxWorks, we 
8660: 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20  have to use the 
8670: 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71  alternative uniq
8680: 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73  ue ID system bas
8690: 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63  ed on.** canonic
86a0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  al filename and 
86b0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74  implemented in t
86c0: 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69  he previous divi
86d0: 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  sion.).**.** The
86e0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
86f0: 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49  ructure for POSI
8700: 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a  X is no longer j
8710: 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66  ust an integer f
8720: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
8730: 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20  r.  It is now a 
8740: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
8750: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
8760: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
8770: 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  tor and a pointe
8780: 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65  r to a structure
8790: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
87a0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
87b0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72  locks on the cor
87c0: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65  responding inode
87d0: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
87e0: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
87f0: 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20  e.** per inode, 
8800: 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69  so if the same i
8810: 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74  node is opened t
8820: 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46  wice, both unixF
8830: 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a  ile structures.*
8840: 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  * point to the s
8850: 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ame locking stru
8860: 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b  cture.  The lock
8870: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
8880: 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e  eps.** a referen
8890: 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20  ce count (so we 
88a0: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74  will know when t
88b0: 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64  o delete it) and
88c0: 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c   a "cnt".** fiel
88d0: 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20  d that tells us 
88e0: 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  its internal loc
88f0: 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d  k status.  cnt==
8900: 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66  0 means the.** f
8910: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
8920: 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20    cnt==-1 means 
8930: 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  the file has an 
8940: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a  exclusive lock..
8950: 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74  ** cnt>0 means t
8960: 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61  here are cnt sha
8970: 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  red locks on the
8980: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79   file..**.** Any
8990: 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b   attempt to lock
89a0: 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c   or unlock a fil
89b0: 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74  e first checks t
89c0: 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  he locking.** st
89d0: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63  ructure.  The fc
89e0: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
89f0: 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  l is only invoke
8a00: 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50  d to set a .** P
8a10: 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65  OSIX lock if the
8a20: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
8a30: 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74  tructure transit
8a40: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ions between.** 
8a50: 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20  a locked and an 
8a60: 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a  unlocked state..
8a70: 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20  **.** But wait: 
8a80: 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d   there are yet m
8a90: 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  ore problems wit
8aa0: 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  h POSIX advisory
8ab0: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   locks..**.** If
8ac0: 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c   you close a fil
8ad0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
8ae0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69  t points to a fi
8af0: 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  le that has lock
8b00: 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20  s,.** all locks 
8b10: 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
8b20: 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74  t are owned by t
8b30: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
8b40: 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73  ss are.** releas
8b50: 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  ed.  To work aro
8b60: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
8b70: 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65  , each unixInode
8b80: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d  Info object.** m
8b90: 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74  aintains a count
8ba0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
8bb0: 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  f pending locks 
8bc0: 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a  on tha inode..**
8bd0: 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   When an attempt
8be0: 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73   is made to clos
8bf0: 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69  e an unixFile, i
8c00: 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f  f there are.** o
8c10: 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70  ther unixFile op
8c20: 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69  en on the same i
8c30: 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f  node that are ho
8c40: 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65  lding locks, the
8c50: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73   call.** to clos
8c60: 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73  e() the file des
8c70: 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72  criptor is defer
8c80: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66  red until all of
8c90: 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72   the locks clear
8ca0: 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f  ..** The unixIno
8cb0: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
8cc0: 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66   keeps a list of
8cd0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8ce0: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a  s that need to.*
8cf0: 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  * be closed and 
8d00: 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c  that list is wal
8d10: 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64  ked (and cleared
8d20: 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  ) when the last 
8d30: 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a  lock.** clears..
8d40: 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65  **.** Yet anothe
8d50: 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75  r problem:  Linu
8d60: 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20  xThreads do not 
8d70: 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70  play well with p
8d80: 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  osix locks..**.*
8d90: 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72  * Many older ver
8da0: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75  sions of linux u
8db0: 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65  se the LinuxThre
8dc0: 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63  ads library whic
8dd0: 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69  h is.** not posi
8de0: 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e  x compliant.  Un
8df0: 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  der LinuxThreads
8e00: 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  , a lock created
8e10: 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20   by thread.** A 
8e20: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69  cannot be modifi
8e30: 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e  ed or overridden
8e40: 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20   by a different 
8e50: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c  thread B..** Onl
8e60: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d  y thread A can m
8e70: 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20  odify the lock. 
8e80: 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   Locking behavio
8e90: 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20  r is correct.** 
8ea0: 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f  if the appliatio
8eb0: 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72  n uses the newer
8ec0: 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68   Native Posix Th
8ed0: 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50  read Library (NP
8ee0: 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20  TL).** on linux 
8ef0: 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f  - with NPTL a lo
8f00: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
8f10: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
8f20: 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20  ide locks.** in 
8f30: 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74  thread B.  But t
8f40: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
8f50: 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c  o know at compil
8f60: 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20  e-time which.** 
8f70: 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72  threading librar
8f80: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e  y is being used.
8f90: 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f    So there is no
8fa0: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a   way to know at.
8fb0: 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** compile-time 
8fc0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
8fd0: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
8fe0: 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ride locks on th
8ff0: 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68  read B..** One h
9000: 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74  as to do a run-t
9010: 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73  ime check to dis
9020: 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69  cover the behavi
9030: 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72  or of the.** cur
9040: 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  rent process..**
9050: 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20  .** SQLite used 
9060: 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78  to support Linux
9070: 54 68 72 65 61 64 73 2e 20 20 42 75 74 20 73 75  Threads.  But su
9080: 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54  pport for LinuxT
9090: 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72  hreads.** was dr
90a0: 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20  opped beginning 
90b0: 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37  with version 3.7
90c0: 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c  .0.  SQLite will
90d0: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68   still work with
90e0: 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73  .** LinuxThreads
90f0: 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 28   provided that (
9100: 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  1) there is no m
9110: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e  ore than one con
9120: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20  nection .** per 
9130: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
9140: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
9150: 73 20 61 6e 64 20 28 32 29 20 64 61 74 61 62 61  s and (2) databa
9160: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
9170: 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63  * do not move ac
9180: 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f  ross threads..*/
9190: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
91a0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
91b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
91c0: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
91d0: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
91e0: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
91f0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
9200: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ject..*/.struct 
9210: 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64  unixFileId {.  d
9220: 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20  ev_t dev;       
9230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
9240: 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  vice number */.#
9250: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
9260: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
9270: 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55  leId *pId;  /* U
9280: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f  nique file ID fo
9290: 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65  r vxworks. */.#e
92a0: 6c 73 65 0a 20 20 2f 2a 20 57 65 20 61 72 65 20  lse.  /* We are 
92b0: 74 6f 6c 64 20 74 68 61 74 20 73 6f 6d 65 20 76  told that some v
92c0: 65 72 73 69 6f 6e 73 20 6f 66 20 41 6e 64 72 6f  ersions of Andro
92d0: 69 64 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67  id contain a bug
92e0: 20 74 68 61 74 0a 20 20 2a 2a 20 73 69 7a 65 73   that.  ** sizes
92f0: 20 69 6e 6f 5f 74 20 61 74 20 6f 6e 6c 79 20 33   ino_t at only 3
9300: 32 2d 62 69 74 73 20 69 6e 73 74 65 61 64 20 6f  2-bits instead o
9310: 66 20 36 34 2d 62 69 74 73 2e 20 28 53 65 65 0a  f 64-bits. (See.
9320: 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 61 6e 64    ** https://and
9330: 72 6f 69 64 2d 72 65 76 69 65 77 2e 67 6f 6f 67  roid-review.goog
9340: 6c 65 73 6f 75 72 63 65 2e 63 6f 6d 2f 23 2f 63  lesource.com/#/c
9350: 2f 31 31 35 33 35 31 2f 33 2f 64 69 73 74 2f 73  /115351/3/dist/s
9360: 71 6c 69 74 65 33 2e 63 29 0a 20 20 2a 2a 20 54  qlite3.c).  ** T
9370: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
9380: 69 73 2c 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  is, always alloc
9390: 61 74 65 20 36 34 2d 62 69 74 73 20 66 6f 72 20  ate 64-bits for 
93a0: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
93b0: 2e 20 20 0a 20 20 2a 2a 20 4f 6e 20 73 6d 61 6c  .  .  ** On smal
93c0: 6c 20 6d 61 63 68 69 6e 65 73 20 74 68 61 74 20  l machines that 
93d0: 6f 6e 6c 79 20 68 61 76 65 20 33 32 2d 62 69 74  only have 32-bit
93e0: 20 69 6e 6f 64 65 73 2c 20 74 68 69 73 20 77 61   inodes, this wa
93f0: 73 74 65 73 20 34 20 62 79 74 65 73 2c 0a 20 20  stes 4 bytes,.  
9400: 2a 2a 20 62 75 74 20 74 68 61 74 20 73 68 6f 75  ** but that shou
9410: 6c 64 20 6e 6f 74 20 62 65 20 61 20 62 69 67 20  ld not be a big 
9420: 64 65 61 6c 2e 20 2a 2f 0a 20 20 2f 2a 20 57 41  deal. */.  /* WA
9430: 53 3a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20  S:  ino_t ino;  
9440: 20 2a 2f 0a 20 20 75 36 34 20 69 6e 6f 3b 20 20   */.  u64 ino;  
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9460: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
9470: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
9480: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
9490: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
94a0: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
94b0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
94c0: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e  h open.** inode.
94d0: 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68    Or, on LinuxTh
94e0: 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 20  reads, there is 
94f0: 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72  one of these str
9500: 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65  uctures for.** e
9510: 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64  ach inode opened
9520: 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64 2e   by each thread.
9530: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  .**.** A single 
9540: 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d  inode can have m
9550: 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73  ultiple file des
9560: 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63  criptors, so eac
9570: 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  h unixFile.** st
9580: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
9590: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
95a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
95b0: 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69  s object and thi
95c0: 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70  s.** object keep
95d0: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
95e0: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46   number of unixF
95f0: 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ile pointing to 
9600: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  it..*/.struct un
9610: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20  ixInodeInfo {.  
9620: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
9630: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20  d fileId;       
9640: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
9650: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72  y */.  int nShar
9660: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
9670: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9680: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
9690: 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67   held */.  unsig
96a0: 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f  ned char eFileLo
96b0: 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ck;        /* On
96c0: 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e of SHARED_LOCK
96d0: 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  , RESERVED_LOCK 
96e0: 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  etc. */.  unsign
96f0: 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73 73  ed char bProcess
9700: 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20  Lock;     /* An 
9710: 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73  exclusive proces
9720: 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a  s lock is held *
9730: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
9740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9750: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9760: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
9770: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
9780: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
9790: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
97a0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
97b0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
97c0: 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  h this inode */.
97d0: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
9800: 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20  utstanding file 
9810: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55  locks */.  UnixU
9820: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
9830: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
9840: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
9850: 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a  ptors to close *
9860: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
9870: 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  o *pNext;       
9880: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
9890: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
98a0: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e   objects */.  un
98b0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72  ixInodeInfo *pPr
98c0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ev;           /*
98d0: 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20      .... doubly 
98e0: 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51  linked */.#if SQ
98f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
9900: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69  ING_STYLE.  unsi
9910: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
9920: 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66  haredByte;  /* f
9930: 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64  or AFP simulated
9940: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
9950: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58  #endif.#if OS_VX
9960: 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70  WORKS.  sem_t *p
9970: 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sem;            
9980: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64          /* Named
9990: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
99a0: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e   */.  char aSemN
99b0: 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
99c0: 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  +2];  /* Name of
99d0: 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20   that semaphore 
99e0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
99f0: 20 53 51 4c 49 54 45 5f 53 48 41 52 45 44 5f 4d   SQLITE_SHARED_M
9a00: 41 50 50 49 4e 47 0a 20 20 73 71 6c 69 74 65 33  APPING.  sqlite3
9a10: 5f 69 6e 74 36 34 20 6e 53 68 61 72 65 64 4d 61  _int64 nSharedMa
9a20: 70 70 69 6e 67 3b 20 20 20 2f 2a 20 53 69 7a 65  pping;   /* Size
9a30: 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f   of mapped regio
9a40: 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  n in bytes */.  
9a50: 76 6f 69 64 20 2a 70 53 68 61 72 65 64 4d 61 70  void *pSharedMap
9a60: 70 69 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20  ping;           
9a70: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64  /* Memory mapped
9a80: 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69   region */.#endi
9a90: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  f.};../*.** A li
9aa0: 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  sts of all unixI
9ab0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
9ac0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78  ..*/.static unix
9ad0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65  InodeInfo *inode
9ae0: 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 41 6c  List = 0;  /* Al
9af0: 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  l unixInodeInfo 
9b00: 6f 62 6a 65 63 74 73 20 2a 2f 0a 73 74 61 74 69  objects */.stati
9b10: 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e  c unsigned int n
9b20: 55 6e 75 73 65 64 46 64 20 3d 20 30 3b 20 20 20  UnusedFd = 0;   
9b30: 20 2f 2a 20 54 6f 74 61 6c 20 75 6e 75 73 65 64   /* Total unused
9b40: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9b50: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54  s */../*.**.** T
9b60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75  his function - u
9b70: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
9b80: 65 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65  e(), is only eve
9b90: 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65  r called via the
9ba0: 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f   macro.** unixLo
9bb0: 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  gError()..**.** 
9bc0: 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66  It is invoked af
9bd0: 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ter an error occ
9be0: 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e  urs in an OS fun
9bf0: 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20  ction and errno 
9c00: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e  has been.** set.
9c10: 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61   It logs a messa
9c20: 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ge using sqlite3
9c30: 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e  _log() containin
9c40: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  g the current va
9c50: 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20  lue of.** errno 
9c60: 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  and, if possible
9c70: 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  , the human-read
9c80: 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20  able equivalent 
9c90: 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20  from strerror() 
9ca0: 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  or.** strerror_r
9cb0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
9cc0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
9cd0: 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  sed to the macro
9ce0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65   should be the e
9cf0: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a  rror code that.*
9d00: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  * will be return
9d10: 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e  ed to SQLite (e.
9d20: 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  g. SQLITE_IOERR_
9d30: 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43  DELETE, SQLITE_C
9d40: 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68  ANTOPEN). .** Th
9d50: 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74  e two subsequent
9d60: 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c   arguments shoul
9d70: 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  d be the name of
9d80: 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e   the OS function
9d90: 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20   that.** failed 
9da0: 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20  (e.g. "unlink", 
9db0: 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20  "open") and the 
9dc0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
9dd0: 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20  system path,.** 
9de0: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69  if any..*/.#defi
9df0: 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ne unixLogError(
9e00: 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c  a,b,c)     unixL
9e10: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c  ogErrorAtLine(a,
9e20: 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74  b,c,__LINE__).st
9e30: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67  atic int unixLog
9e40: 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69  ErrorAtLine(.  i
9e50: 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20  nt errcode,     
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9e70: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
9e80: 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
9e90: 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20  har *zFunc,     
9ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
9eb0: 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   of OS function 
9ec0: 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20  that failed */. 
9ed0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
9ee0: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
9ef0: 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73   /* File path as
9f00: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72  sociated with er
9f10: 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ror */.  int iLi
9f20: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
9f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
9f40: 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77  ce line number w
9f50: 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72  here error occur
9f60: 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  red */.){.  char
9f70: 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20   *zErr;         
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
9f90: 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65  essage from stre
9fa0: 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61  rror() or equiva
9fb0: 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45  lent */.  int iE
9fc0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20  rrno = errno;   
9fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76            /* Sav
9fe0: 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72  ed syscall error
9ff0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a   number */..  /*
a000: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
a010: 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69  a threadsafe bui
a020: 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ld (SQLITE_THREA
a030: 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20  DSAFE==0), then 
a040: 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72  use.  ** the str
a050: 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e  error() function
a060: 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68   to obtain the h
a070: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72  uman-readable er
a080: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
a090: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65   equivalent to e
a0a0: 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c  rrno. Otherwise,
a0b0: 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28   use strerror_r(
a0c0: 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c  )..  */ .#if SQL
a0d0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
a0e0: 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53  & defined(HAVE_S
a0f0: 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61  TRERROR_R).  cha
a100: 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65  r aErr[80];.  me
a110: 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69  mset(aErr, 0, si
a120: 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a  zeof(aErr));.  z
a130: 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f  Err = aErr;..  /
a140: 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f  * If STRERROR_R_
a150: 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20 61  CHAR_P (set by a
a160: 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29  utoconf scripts)
a170: 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73   or __USE_GNU is
a180: 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61   defined,.  ** a
a190: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73  ssume that the s
a1a0: 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74  ystem provides t
a1b0: 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f  he GNU version o
a1c0: 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74  f strerror_r() t
a1d0: 68 61 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73  hat.  ** returns
a1e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
a1f0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
a200: 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  g the error mess
a210: 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65  age. That pointe
a220: 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e  r .  ** may poin
a230: 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20  t to aErr[], or 
a240: 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  it may point to 
a250: 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72  some static stor
a260: 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a  age somewhere. .
a270: 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
a280: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
a290: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
a2a0: 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f  the POSIX versio
a2b0: 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72  n of .  ** strer
a2c0: 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61  ror_r(), which a
a2d0: 6c 77 61 79 73 20 77 72 69 74 65 73 20 61 6e 20  lways writes an 
a2e0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
a2f0: 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a  to aErr[]..  **.
a300: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65    ** If the code
a310: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73   incorrectly ass
a320: 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20  umes that it is 
a330: 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f  the POSIX versio
a340: 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61  n that is.  ** a
a350: 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72  vailable, the er
a360: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
a370: 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70   often be an emp
a380: 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61  ty string. Not a
a390: 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c  .  ** huge probl
a3a0: 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20  em. Incorrectly 
a3b0: 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20  concluding that 
a3c0: 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20  the GNU version 
a3d0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20  is available .  
a3e0: 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  ** could lead to
a3f0: 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75   a segfault thou
a400: 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66  gh..  */.#if def
a410: 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f  ined(STRERROR_R_
a420: 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e  CHAR_P) || defin
a430: 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20  ed(__USE_GNU).  
a440: 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a  zErr = .# endif.
a450: 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72    strerror_r(iEr
a460: 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f  rno, aErr, sizeo
a470: 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c  f(aErr)-1);..#el
a480: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
a490: 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69  SAFE.  /* This i
a4a0: 73 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62  s a threadsafe b
a4b0: 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72  uild, but strerr
a4c0: 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76  or_r() is not av
a4d0: 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45  ailable. */.  zE
a4e0: 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20  rr = "";.#else. 
a4f0: 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61   /* Non-threadsa
a500: 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74  fe build, use st
a510: 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a  rerror(). */.  z
a520: 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69  Err = strerror(i
a530: 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a  Errno);.#endif..
a540: 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
a550: 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73   zPath = "";.  s
a560: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
a570: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e  de,.      "os_un
a580: 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73  ix.c:%d: (%d) %s
a590: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20  (%s) - %s",.    
a5a0: 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c    iLine, iErrno,
a5b0: 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a   zFunc, zPath, z
a5c0: 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  Err.  );..  retu
a5d0: 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f  rn errcode;.}../
a5e0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
a5f0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a  e descriptor..**
a600: 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68  .** We assume th
a610: 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73  at close() almos
a620: 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20  t always works, 
a630: 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79  since it is only
a640: 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69   in a.** very si
a650: 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f  ck application o
a660: 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b  r on a very sick
a670: 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69   platform that i
a680: 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a  t might fail..**
a690: 20 49 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c   If it does fail
a6a0: 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68  , simply leak th
a6b0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
a6c0: 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68  r, but do log th
a6d0: 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  e.** error..**.*
a6e0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69  * Note that it i
a6f0: 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65  s not safe to re
a700: 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65  try close() afte
a710: 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68  r EINTR since th
a720: 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  e.** file descri
a730: 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20  ptor might have 
a740: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 75  already been reu
a750: 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74  sed by another t
a760: 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20  hread..** So we 
a770: 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74  don't even try t
a780: 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61  o recover from a
a790: 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c  n EINTR.  Just l
a7a0: 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  og the error.** 
a7b0: 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a  and move on..*/.
a7c0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75  static void robu
a7d0: 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c  st_close(unixFil
a7e0: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c  e *pFile, int h,
a7f0: 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20   int lineno){.  
a800: 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29  if( osClose(h) )
a810: 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  {.    unixLogErr
a820: 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f  orAtLine(SQLITE_
a830: 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c  IOERR_CLOSE, "cl
a840: 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ose",.          
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
a860: 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le ? pFile->zPat
a870: 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a  h : 0, lineno);.
a880: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
a890: 20 74 68 65 20 70 46 69 6c 65 2d 3e 6c 61 73 74   the pFile->last
a8a0: 45 72 72 6e 6f 2e 20 20 44 6f 20 74 68 69 73 20  Errno.  Do this 
a8b0: 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  in a subroutine 
a8c0: 61 73 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  as that provides
a8d0: 0a 2a 2a 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74  .** a convenient
a8e0: 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
a8f0: 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  breakpoint..*/.s
a900: 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65  tatic void store
a910: 4c 61 73 74 45 72 72 6e 6f 28 75 6e 69 78 46 69  LastErrno(unixFi
a920: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65  le *pFile, int e
a930: 72 72 6f 72 29 7b 0a 20 20 70 46 69 6c 65 2d 3e  rror){.  pFile->
a940: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f  lastErrno = erro
a950: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  r;.}../*.** Clos
a960: 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72  e all file descr
a970: 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65  iptors accumuate
a980: 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f  d in the unixIno
a990: 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20  deInfo->pUnused 
a9a0: 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  list..*/ .static
a9b0: 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69   void closePendi
a9c0: 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a  ngFds(unixFile *
a9d0: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
a9e0: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
a9f0: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
aa00: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
aa10: 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  *p;.  UnixUnused
aa20: 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  Fd *pNext;.  for
aa30: 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  (p=pInode->pUnus
aa40: 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  ed; p; p=pNext){
aa50: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
aa60: 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73  pNext;.    robus
aa70: 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
aa80: 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  ->fd, __LINE__);
aa90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
aaa0: 65 28 70 29 3b 0a 20 20 20 20 6e 55 6e 75 73 65  e(p);.    nUnuse
aab0: 64 46 64 2d 2d 3b 0a 20 20 7d 0a 20 20 70 49 6e  dFd--;.  }.  pIn
aac0: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30  ode->pUnused = 0
aad0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
aae0: 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e  se a unixInodeIn
aaf0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72 65  fo structure pre
ab00: 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
ab10: 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e  d by findInodeIn
ab20: 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fo()..**.** The 
ab30: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
ab40: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
ab50: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
ab60: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
ab70: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
ab80: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
ab90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
aba0: 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
abb0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
abc0: 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
abd0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
abe0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
abf0: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
ac00: 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41 4c  ld() );.  if( AL
ac10: 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a  WAYS(pInode) ){.
ac20: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66      pInode->nRef
ac30: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
ac40: 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  de->nRef==0 ){. 
ac50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
ac60: 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30  ode->pShmNode==0
ac70: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
ac80: 45 5f 53 48 41 52 45 44 5f 4d 41 50 50 49 4e 47  E_SHARED_MAPPING
ac90: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
aca0: 65 2d 3e 70 53 68 61 72 65 64 4d 61 70 70 69 6e  e->pSharedMappin
acb0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d  g ){.        osM
acc0: 75 6e 6d 61 70 28 70 49 6e 6f 64 65 2d 3e 70 53  unmap(pInode->pS
acd0: 68 61 72 65 64 4d 61 70 70 69 6e 67 2c 20 70 49  haredMapping, pI
ace0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 4d 61 70  node->nSharedMap
acf0: 70 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 70  ping);.        p
ad00: 49 6e 6f 64 65 2d 3e 70 53 68 61 72 65 64 4d 61  Inode->pSharedMa
ad10: 70 70 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  pping = 0;.     
ad20: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
ad30: 65 64 4d 61 70 70 69 6e 67 20 3d 20 30 3b 0a 20  edMapping = 0;. 
ad40: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
ad50: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
ad60: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
ad70: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50    if( pInode->pP
ad80: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rev ){.        a
ad90: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
ada0: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  Prev->pNext==pIn
adb0: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
adc0: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
add0: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ext = pInode->pN
ade0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
adf0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
ae00: 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e  ( inodeList==pIn
ae10: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ode );.        i
ae20: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
ae30: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
ae40: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  }.      if( pIno
ae50: 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  de->pNext ){.   
ae60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
ae70: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
ae80: 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  v==pInode );.   
ae90: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65       pInode->pNe
aea0: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  xt->pPrev = pIno
aeb0: 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  de->pPrev;.     
aec0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
aed0: 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20  _free(pInode);. 
aee0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
aef0: 74 28 20 69 6e 6f 64 65 4c 69 73 74 21 3d 30 20  t( inodeList!=0 
af00: 7c 7c 20 6e 55 6e 75 73 65 64 46 64 3d 3d 30 20  || nUnusedFd==0 
af10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
af20: 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
af30: 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20  tor, locate the 
af40: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
af50: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73  ject that.** des
af60: 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65  cribes that file
af70: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72   descriptor.  Cr
af80: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
af90: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
afa0: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
afb0: 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69  e might be unini
afc0: 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65  tialized if an e
afd0: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  rror occurs..**.
afe0: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74  ** The mutex ent
aff0: 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75  ered using the u
b000: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
b010: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
b020: 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68   held.** when th
b030: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
b040: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
b050: 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  urn an appropria
b060: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
b070: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
b080: 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e  dInodeInfo(.  un
b090: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b0b0: 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66  Unix file with f
b0c0: 69 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e  ile desc used in
b0d0: 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e   the key */.  un
b0e0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70  ixInodeInfo **pp
b0f0: 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20  Inode        /* 
b100: 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49  Return the unixI
b110: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
b120: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
b130: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
b140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b150: 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72  ystem call retur
b160: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
b170: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
b180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b190: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
b1a0: 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20  r for pFile */. 
b1b0: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
b1c0: 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20  Id fileId;      
b1d0: 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f  /* Lookup key fo
b1e0: 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  r the unixInodeI
b1f0: 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nfo */.  struct 
b200: 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
b210: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c          /* Low-l
b220: 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d  evel file inform
b230: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49  ation */.  unixI
b240: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
b250: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e   = 0;     /* Can
b260: 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65  didate unixInode
b270: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  Info object */..
b280: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
b290: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20  texHeld() );..  
b2a0: 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c  /* Get low-level
b2b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
b2c0: 75 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  ut the file that
b2d0: 20 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a   we can used to.
b2e0: 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e    ** create a un
b2f0: 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  ique name for th
b300: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66  e file..  */.  f
b310: 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
b320: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
b330: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
b340: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73  ( rc!=0 ){.    s
b350: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
b360: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 69 66  ile, errno);.#if
b370: 20 64 65 66 69 6e 65 64 28 45 4f 56 45 52 46 4c   defined(EOVERFL
b380: 4f 57 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  OW) && defined(S
b390: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
b3a0: 53 29 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  S).    if( pFile
b3b0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56  ->lastErrno==EOV
b3c0: 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20  ERFLOW ) return 
b3d0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65  SQLITE_NOLFS;.#e
b3e0: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
b3f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
b400: 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c  }..#ifdef __APPL
b410: 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58  E__.  /* On OS X
b420: 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c   on an msdos fil
b430: 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f  esystem, the ino
b440: 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70  de number is rep
b450: 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72  orted.  ** incor
b460: 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d  rectly for zero-
b470: 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65  size files.  See
b480: 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20   ticket #3260.  
b490: 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f  To work.  ** aro
b4a0: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
b4b0: 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74   (we consider it
b4c0: 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20   a bug in OS X, 
b4d0: 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a  not SQLite).  **
b4e0: 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65   we always incre
b4f0: 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ase the file siz
b500: 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e  e to 1 by writin
b510: 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a  g a single byte.
b520: 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63    ** prior to ac
b530: 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64  cessing the inod
b540: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f  e number.  The o
b550: 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  ne byte written 
b560: 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49  is.  ** an ASCII
b570: 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77   'S' character w
b580: 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e  hich also happen
b590: 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73  s to be the firs
b5a0: 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74  t byte.  ** in t
b5b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65  he header of eve
b5c0: 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ry SQLite databa
b5d0: 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  se.  In this way
b5e0: 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  , if there.  ** 
b5f0: 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
b600: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e  ion such that an
b610: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
b620: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
b630: 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  ed.  ** the firs
b640: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
b650: 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67  tabase, no damag
b660: 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a  e is done..  */.
b670: 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74    if( statbuf.st
b680: 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69  _size==0 && (pFi
b690: 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51  le->fsFlags & SQ
b6a0: 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
b6b0: 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20  MSDOS)!=0 ){.   
b6c0: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74   do{ rc = osWrit
b6d0: 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d  e(fd, "S", 1); }
b6e0: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
b6f0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
b700: 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a     if( rc!=1 ){.
b710: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
b720: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
b730: 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
b740: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
b750: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
b760: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
b770: 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
b780: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  =0 ){.      stor
b790: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
b7a0: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
b7b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
b7c0: 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ERR;.    }.  }.#
b7d0: 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28  endif..  memset(
b7e0: 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65  &fileId, 0, size
b7f0: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66  of(fileId));.  f
b800: 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74  ileId.dev = stat
b810: 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20  buf.st_dev;.#if 
b820: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c  OS_VXWORKS.  fil
b830: 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d  eId.pId = pFile-
b840: 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69  >pId;.#else.  fi
b850: 6c 65 49 64 2e 69 6e 6f 20 3d 20 28 75 36 34 29  leId.ino = (u64)
b860: 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a  statbuf.st_ino;.
b870: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
b880: 20 69 6e 6f 64 65 4c 69 73 74 21 3d 30 20 7c 7c   inodeList!=0 ||
b890: 20 6e 55 6e 75 73 65 64 46 64 3d 3d 30 20 29 3b   nUnusedFd==0 );
b8a0: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64  .  pInode = inod
b8b0: 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  eList;.  while( 
b8c0: 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70  pInode && memcmp
b8d0: 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64  (&fileId, &pInod
b8e0: 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f  e->fileId, sizeo
b8f0: 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20  f(fileId)) ){.  
b900: 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64    pInode = pInod
b910: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  e->pNext;.  }.  
b920: 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b  if( pInode==0 ){
b930: 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71  .    pInode = sq
b940: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
b950: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20  sizeof(*pInode) 
b960: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
b970: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
b980: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b990: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
b9a0: 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c    memset(pInode,
b9b0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f   0, sizeof(*pIno
b9c0: 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  de));.    memcpy
b9d0: 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  (&pInode->fileId
b9e0: 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f  , &fileId, sizeo
b9f0: 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20  f(fileId));.    
ba00: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31  pInode->nRef = 1
ba10: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e  ;.    pInode->pN
ba20: 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ext = inodeList;
ba30: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72  .    pInode->pPr
ba40: 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ev = 0;.    if( 
ba50: 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64  inodeList ) inod
ba60: 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  eList->pPrev = p
ba70: 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65  Inode;.    inode
ba80: 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20  List = pInode;. 
ba90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f   }else{.    pIno
baa0: 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  de->nRef++;.  }.
bab0: 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e    *ppInode = pIn
bac0: 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ode;.  return SQ
bad0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
bae0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
baf0: 20 70 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20   pFile has been 
bb00: 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e  renamed or unlin
bb10: 6b 65 64 20 73 69 6e 63 65 20 69 74 20 77 61 73  ked since it was
bb20: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a   first opened..*
bb30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
bb40: 65 48 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69  eHasMoved(unixFi
bb50: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20  le *pFile){.#if 
bb60: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74  OS_VXWORKS.  ret
bb70: 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  urn pFile->pInod
bb80: 65 21 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70  e!=0 && pFile->p
bb90: 49 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  Id!=pFile->pInod
bba0: 65 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23  e->fileId.pId;.#
bbb0: 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73 74  else.  struct st
bbc0: 61 74 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e  at buf;.  return
bbd0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d   pFile->pInode!=
bbe0: 30 20 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74  0 &&.      (osSt
bbf0: 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  at(pFile->zPath,
bc00: 20 26 62 75 66 29 21 3d 30 20 0a 20 20 20 20 20   &buf)!=0 .     
bc10: 20 20 20 20 7c 7c 20 28 75 36 34 29 62 75 66 2e      || (u64)buf.
bc20: 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70  st_ino!=pFile->p
bc30: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e  Inode->fileId.in
bc40: 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  o);.#endif.}.../
bc50: 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69  *.** Check a uni
bc60: 78 46 69 6c 65 20 74 68 61 74 20 69 73 20 61 20  xFile that is a 
bc70: 64 61 74 61 62 61 73 65 2e 20 20 56 65 72 69 66  database.  Verif
bc80: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  y the following:
bc90: 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65  .**.** (1) There
bca0: 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   is exactly one 
bcb0: 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65  hard link on the
bcc0: 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65   file.** (2) The
bcd0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73   file is not a s
bce0: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20  ymbolic link.** 
bcf0: 28 33 29 20 54 68 65 20 66 69 6c 65 20 68 61 73  (3) The file has
bd00: 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65   not been rename
bd10: 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a  d or unlinked.**
bd20: 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65  .** Issue sqlite
bd30: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
bd40: 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67  NING,...) messag
bd50: 65 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69  es if anything i
bd60: 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a  s not right..*/.
bd70: 73 74 61 74 69 63 20 76 6f 69 64 20 76 65 72 69  static void veri
bd80: 66 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c  fyDbFile(unixFil
bd90: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72  e *pFile){.  str
bda0: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
bdb0: 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
bdc0: 65 73 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ese verification
bdd0: 73 20 6f 63 63 75 72 73 20 66 6f 72 20 74 68 65  s occurs for the
bde0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f   main database o
bdf0: 6e 6c 79 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  nly */.  if( pFi
be00: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
be10: 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20  UNIXFILE_NOLOCK 
be20: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 72 63 20  ) return;..  rc 
be30: 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d  = osFstat(pFile-
be40: 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28  >h, &buf);.  if(
be50: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71   rc!=0 ){.    sq
be60: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
be70: 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f  _WARNING, "canno
be80: 74 20 66 73 74 61 74 20 64 62 20 66 69 6c 65 20  t fstat db file 
be90: 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  %s", pFile->zPat
bea0: 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  h);.    return;.
beb0: 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74    }.  if( buf.st
bec0: 5f 6e 6c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20  _nlink==0 ){.   
bed0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
bee0: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69  ITE_WARNING, "fi
bef0: 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c  le unlinked whil
bf00: 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69  e open: %s", pFi
bf10: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
bf20: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
bf30: 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31  ( buf.st_nlink>1
bf40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
bf50: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
bf60: 4e 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69  NG, "multiple li
bf70: 6e 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22  nks to file: %s"
bf80: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
bf90: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
bfa0: 0a 20 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f  .  if( fileHasMo
bfb0: 76 65 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  ved(pFile) ){.  
bfc0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
bfd0: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66  LITE_WARNING, "f
bfe0: 69 6c 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c  ile renamed whil
bff0: 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69  e open: %s", pFi
c000: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
c010: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a  return;.  }.}...
c020: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c030: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
c040: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
c050: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
c060: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
c070: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
c080: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
c090: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
c0a0: 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
c0b0: 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
c0c0: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
c0d0: 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
c0e0: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
c0f0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
c100: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
c110: 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
c120: 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
c130: 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
c140: 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
c150: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65  atic int unixChe
c160: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
c170: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
c180: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
c190: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c1a0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
c1b0: 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
c1c0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
c1d0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
c1e0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
c1f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
c200: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
c210: 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73  EDLOCK; );..  as
c220: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
c230: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
c240: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
c250: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 75 6e 69 78  D_LOCK );.  unix
c260: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  EnterMutex(); /*
c270: 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   Because pFile->
c280: 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
c290: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20   across threads 
c2a0: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  */..  /* Check i
c2b0: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
c2c0: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
c2d0: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
c2e0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
c2f0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ode->eFileLock>S
c300: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
c310: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
c320: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77    }..  /* Otherw
c330: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
c340: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
c350: 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66  lds it..  */.#if
c360: 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20  ndef __DJGPP__. 
c370: 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 26   if( !reserved &
c380: 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  & !pFile->pInode
c390: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29  ->bProcessLock )
c3a0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
c3b0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63  ck lock;.    loc
c3c0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
c3d0: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
c3e0: 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56  l_start = RESERV
c3f0: 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  ED_BYTE;.    loc
c400: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20  k.l_len = 1;.   
c410: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
c420: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20  _WRLCK;.    if( 
c430: 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  osFcntl(pFile->h
c440: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
c450: 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
c460: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
c470: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a  CKRESERVEDLOCK;.
c480: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
c490: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
c4a0: 6f 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  o);.    } else i
c4b0: 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d  f( lock.l_type!=
c4c0: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
c4d0: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
c4e0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
c4f0: 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
c500: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
c510: 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
c520: 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c  %d %d %d (unix)\
c530: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
c540: 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
c550: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
c560: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
c570: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
c580: 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73  mpt to set a sys
c590: 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  tem-lock on the 
c5a0: 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65  file pFile.  The
c5b0: 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73   lock is .** des
c5c0: 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e  cribed by pLock.
c5d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46  .**.** If the pF
c5e0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72  ile was opened r
c5f0: 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75  ead/write from u
c600: 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74  nix-excl, then t
c610: 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20  he only lock.** 
c620: 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73  ever obtained is
c630: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
c640: 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62  ck, and it is ob
c650: 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f  tained exactly o
c660: 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  nce.** the first
c670: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
c680: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c  s attempted.  Al
c690: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73  l subsequent sys
c6a0: 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  tem locking.** o
c6b0: 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65  perations become
c6c0: 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e   no-ops.  Lockin
c6d0: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69  g operations sti
c6e0: 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e  ll happen intern
c6f0: 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65  ally,.** in orde
c700: 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  r to coordinate 
c710: 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73  access between s
c720: 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65  eparate database
c730: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
c740: 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63  within this proc
c750: 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20  ess, but all of 
c760: 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20  that is handled 
c770: 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68  in memory and th
c780: 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  e.** operating s
c790: 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70  ystem does not p
c7a0: 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a  articipate..**.*
c7b0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c7c0: 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67  is a pass-throug
c7d0: 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54  h to fcntl(F_SET
c7e0: 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20  LK) if pFile is 
c7f0: 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53  using.** any VFS
c800: 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69   other than "uni
c810: 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46  x-excl" or if pF
c820: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ile is opened on
c830: 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20   "unix-excl".** 
c840: 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  and is read-only
c850: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
c860: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
c870: 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73  call completes s
c880: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20  uccessfully, or 
c890: 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20  -1 if a call.** 
c8a0: 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73  to fcntl() fails
c8b0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
c8c0: 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70  errno is set app
c8d0: 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66  ropriately (by f
c8e0: 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  cntl())..*/.stat
c8f0: 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c  ic int unixFileL
c900: 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
c910: 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63  ile, struct floc
c920: 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  k *pLock){.  int
c930: 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65   rc;.  unixInode
c940: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
c950: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
c960: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
c970: 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73  xHeld() );.  ass
c980: 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29  ert( pInode!=0 )
c990: 3b 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  ;.  if( (pFile->
c9a0: 63 74 72 6c 46 6c 61 67 73 20 26 20 28 55 4e 49  ctrlFlags & (UNI
c9b0: 58 46 49 4c 45 5f 45 58 43 4c 7c 55 4e 49 58 46  XFILE_EXCL|UNIXF
c9c0: 49 4c 45 5f 52 44 4f 4e 4c 59 29 29 3d 3d 55 4e  ILE_RDONLY))==UN
c9d0: 49 58 46 49 4c 45 5f 45 58 43 4c 20 29 7b 0a 20  IXFILE_EXCL ){. 
c9e0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62     if( pInode->b
c9f0: 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
ca00: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66  {.      struct f
ca10: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20  lock lock;.     
ca20: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
ca30: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  >nLock==0 );.   
ca40: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
ca50: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
ca60: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
ca70: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
ca80: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
ca90: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
caa0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
cab0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
cac0: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
cad0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
cae0: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  K, &lock);.     
caf0: 20 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75   if( rc<0 ) retu
cb00: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e  rn rc;.      pIn
cb10: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
cb20: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e  k = 1;.      pIn
cb30: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
cb40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
cb50: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 0;.    }.  }
cb60: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f  else{.    rc = o
cb70: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
cb80: 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29   F_SETLK, pLock)
cb90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
cba0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
cbb0: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
cbc0: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
cbd0: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
cbe0: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
cbf0: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
cc00: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
cc10: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
cc20: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
cc30: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
cc40: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
cc50: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
cc60: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
cc70: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
cc80: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
cc90: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
cca0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
ccb0: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
ccc0: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
ccd0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
cce0: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
ccf0: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
cd00: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
cd10: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
cd20: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
cd30: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
cd40: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
cd50: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
cd60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
cd70: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
cd80: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
cd90: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
cda0: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
cdb0: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
cdc0: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
cdd0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
cde0: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
cdf0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
ce00: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
ce10: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
ce20: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
ce30: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
ce40: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
ce50: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
ce60: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
ce70: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
ce80: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
ce90: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
cea0: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
ceb0: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
cec0: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
ced0: 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71   int unixLock(sq
cee0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
cef0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
cf00: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
cf10: 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65  ng describes the
cf20: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
cf30: 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  of the various l
cf40: 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  ocks and.  ** lo
cf50: 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69  ck transitions i
cf60: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50  n terms of the P
cf70: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68  OSIX advisory sh
cf80: 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69  ared and exclusi
cf90: 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69  ve.  ** lock pri
cfa0: 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20  mitives (called 
cfb0: 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77  read-locks and w
cfc0: 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77  rite-locks below
cfd0: 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20  , to avoid.  ** 
cfe0: 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53  confusion with S
cff0: 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73  QLite lock names
d000: 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d  ). The algorithm
d010: 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65  s are complicate
d020: 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20  d.  ** slightly 
d030: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
d040: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 57  ompatible with W
d050: 69 6e 64 6f 77 73 39 35 20 73 79 73 74 65 6d 73  indows95 systems
d060: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a   simultaneously.
d070: 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74    ** accessing t
d080: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
d090: 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74   file, in case t
d0a0: 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75  hat is ever requ
d0b0: 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ired..  **.  ** 
d0c0: 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20  Symbols defined 
d0d0: 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66  in os.h indentif
d0e0: 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  y the 'pending b
d0f0: 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65  yte' and the 're
d100: 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65  served.  ** byte
d110: 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62  ', each single b
d120: 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f  ytes at well kno
d130: 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20  wn offsets, and 
d140: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
d150: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20  .  ** range', a 
d160: 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74  range of 510 byt
d170: 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f  es at a well kno
d180: 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a  wn offset..  **.
d190: 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61    ** To obtain a
d1a0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20   SHARED lock, a 
d1b0: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  read-lock is obt
d1c0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65  ained on the 'pe
d1d0: 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27  nding.  ** byte'
d1e0: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75  .  If this is su
d1f0: 63 63 65 73 73 66 75 6c 2c 20 27 73 68 61 72 65  ccessful, 'share
d200: 64 20 62 79 74 65 20 72 61 6e 67 65 27 20 69 73  d byte range' is
d210: 20 72 65 61 64 2d 6c 6f 63 6b 65 64 0a 20 20 2a   read-locked.  *
d220: 2a 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  * and the lock o
d230: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
d240: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 20 20  yte' released.  
d250: 28 4c 65 67 61 63 79 20 6e 6f 74 65 3a 20 20 57  (Legacy note:  W
d260: 68 65 6e 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20  hen.  ** SQLite 
d270: 77 61 73 20 66 69 72 73 74 20 64 65 76 65 6c 6f  was first develo
d280: 70 65 64 2c 20 57 69 6e 64 6f 77 73 39 35 20 73  ped, Windows95 s
d290: 79 73 74 65 6d 73 20 77 65 72 65 20 73 74 69 6c  ystems were stil
d2a0: 6c 20 76 65 72 79 20 63 6f 6d 6d 6f 6e 2c 0a 20  l very common,. 
d2b0: 20 2a 2a 20 61 6e 64 20 57 69 64 6e 6f 77 73 39   ** and Widnows9
d2c0: 35 20 6c 61 63 6b 73 20 61 20 73 68 61 72 65 64  5 lacks a shared
d2d0: 2d 6c 6f 63 6b 20 63 61 70 61 62 69 6c 69 74 79  -lock capability
d2e0: 2e 20 20 53 6f 20 6f 6e 20 57 69 6e 64 6f 77 73  .  So on Windows
d2f0: 39 35 2c 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c  95, a.  ** singl
d300: 65 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63  e randomly selec
d310: 74 65 64 20 62 79 20 66 72 6f 6d 20 74 68 65 20  ted by from the 
d320: 27 73 68 61 72 65 64 20 62 79 74 65 20 72 61 6e  'shared byte ran
d330: 67 65 27 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20  ge' is locked.. 
d340: 20 2a 2a 20 57 69 6e 64 6f 77 73 39 35 20 69 73   ** Windows95 is
d350: 20 6e 6f 77 20 70 72 65 74 74 79 20 6d 75 63 68   now pretty much
d360: 20 65 78 74 69 6e 63 74 2c 20 62 75 74 20 74 68   extinct, but th
d370: 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 66  is work-around f
d380: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6c 61 63 6b  or the.  ** lack
d390: 20 6f 66 20 73 68 61 72 65 64 2d 6c 6f 63 6b 73   of shared-locks
d3a0: 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35 20 6c 69   on Windows95 li
d3b0: 76 65 73 20 6f 6e 2c 20 66 6f 72 20 62 61 63 6b  ves on, for back
d3c0: 77 61 72 64 73 0a 20 20 2a 2a 20 63 6f 6d 70 61  wards.  ** compa
d3d0: 74 69 62 69 6c 69 74 79 2e 29 0a 20 20 2a 2a 0a  tibility.).  **.
d3e0: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
d3f0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
d400: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
d410: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
d420: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
d430: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
d440: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
d450: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
d460: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
d470: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
d480: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
d490: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
d4a0: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
d4b0: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
d4c0: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
d4d0: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
d4e0: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
d4f0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
d500: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
d510: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
d520: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
d530: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
d540: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
d550: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
d560: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
d570: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
d580: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
d590: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
d5a0: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
d5b0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
d5c0: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
d5d0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
d5e0: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
d5f0: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
d600: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
d610: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
d620: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
d630: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
d640: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
d650: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
d660: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
d670: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
d680: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
d690: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
d6a0: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
d6b0: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
d6c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
d6d0: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
d6e0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
d6f0: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
d700: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
d710: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
d720: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
d730: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
d740: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
d750: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
d760: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
d770: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
d780: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2f 0a  database. .  */.
d790: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d7a0: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
d7b0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
d7c0: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
d7d0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
d7e0: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
d7f0: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72   lock;.  int tEr
d800: 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  rno = 0;..  asse
d810: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
d820: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
d830: 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
d840: 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69  ,%d) pid=%d (uni
d850: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
d860: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
d870: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a  k(eFileLock), az
d880: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
d890: 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  eFileLock),.    
d8a0: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69    azFileLock(pFi
d8b0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
d8c0: 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70  eLock), pFile->p
d8d0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
d8e0: 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30        osGetpid(0
d8f0: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
d900: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
d910: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
d920: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
d930: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
d940: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
d950: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
d960: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
d970: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
d980: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
d990: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
d9a0: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
d9b0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
d9c0: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
d9d0: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
d9e0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
d9f0: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
da00: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
da10: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
da20: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
da30: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
da40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
da50: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
da60: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
da70: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
da80: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
da90: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
daa0: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
dab0: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
dac0: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
dad0: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
dae0: 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
daf0: 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
db00: 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
db10: 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
db20: 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
db30: 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
db40: 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
db50: 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
db60: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
db70: 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
db80: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
db90: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
dba0: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
dbb0: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
dbc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
dbd0: 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
dbe0: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
dbf0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
dc00: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
dc10: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
dc20: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
dc30: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
dc40: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
dc50: 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
dc60: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
dc70: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
dc80: 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
dc90: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
dca0: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
dcb0: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
dcc0: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
dcd0: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
dce0: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
dcf0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
dd00: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
dd10: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
dd20: 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
dd30: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
dd40: 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64            (pInod
dd50: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
dd60: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
dd70: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
dd80: 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
dd90: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
dda0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
ddb0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
ddc0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
ddd0: 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
dde0: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
ddf0: 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
de00: 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
de10: 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
de20: 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
de30: 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
de40: 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
de50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
de60: 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
de70: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
de80: 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28  LOCK && .      (
de90: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
dea0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
deb0: 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
dec0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
ded0: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
dee0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
def0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
df00: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
df10: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
df20: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
df30: 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
df40: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
df50: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
df60: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
df70: 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
df80: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
df90: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
dfa0: 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
dfb0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
dfc0: 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
dfd0: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
dfe0: 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
dff0: 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
e000: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
e010: 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
e020: 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
e030: 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
e040: 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
e050: 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
e060: 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
e070: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
e080: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
e090: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
e0a0: 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
e0b0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
e0c0: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
e0d0: 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
e0e0: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
e0f0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69  ck.l_type = (eFi
e100: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
e110: 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
e120: 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
e130: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
e140: 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75  _BYTE;.    if( u
e150: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
e160: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
e170: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
e180: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
e190: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
e1a0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
e1b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
e1c0: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
e1d0: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
e1e0: 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
e1f0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
e200: 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
e210: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
e220: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ock;.    }.  }..
e230: 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
e240: 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
e250: 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
e260: 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
e270: 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
e280: 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
e290: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
e2a0: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
e2b0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
e2c0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
e2d0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
e2e0: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a  ->nShared==0 );.
e2f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
e300: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  de->eFileLock==0
e310: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e320: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
e330: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74  ..    /* Now get
e340: 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a   the read-lock *
e350: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
e360: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
e370: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  T;.    lock.l_le
e380: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
e390: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
e3a0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
e3b0: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
e3c0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e3d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
e3e0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
e3f0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
e400: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
e410: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70    }..    /* Drop
e420: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
e430: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
e440: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
e450: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
e460: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
e470: 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f   1L;.    lock.l_
e480: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
e490: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
e4a0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
e4b0: 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  k) && rc==SQLITE
e4c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
e4d0: 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65  This could happe
e4e0: 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b  n with a network
e4f0: 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20   mount */.      
e500: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
e510: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e520: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20  E_IOERR_UNLOCK; 
e530: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
e540: 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rc ){.      if( 
e550: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
e560: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
e570: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
e580: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
e590: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
e5a0: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  _lock;.    }else
e5b0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  {.      pFile->e
e5c0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
e5d0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49  D_LOCK;.      pI
e5e0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
e5f0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68       pInode->nSh
e600: 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ared = 1;.    }.
e610: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
e620: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
e630: 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d  _LOCK && pInode-
e640: 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20  >nShared>1 ){.  
e650: 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
e660: 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
e670: 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
e680: 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
e690: 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20  his.    ** same 
e6a0: 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
e6b0: 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
e6c0: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72  d lock. */.    r
e6d0: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
e6e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
e6f0: 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
e700: 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
e710: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
e720: 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
e730: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
e740: 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
e750: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
e760: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
e770: 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
e780: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  */.    assert( 0
e790: 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
e7a0: 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck );.    lock.l
e7b0: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
e7c0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  ..    assert( eF
e7d0: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
e7e0: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  D_LOCK || eFileL
e7f0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
e800: 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65  OCK );.    if( e
e810: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
e820: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
e830: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e840: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
e850: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
e860: 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = 1L;.    }else{
e870: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
e880: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
e890: 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ST;.      lock.l
e8a0: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
e8b0: 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ZE;.    }..    i
e8c0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
e8d0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
e8e0: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
e8f0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
e900: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
e910: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
e920: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
e930: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
e940: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
e950: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  Y ){.        sto
e960: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
e970: 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
e980: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
e990: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e9a0: 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75  DEBUG.  /* Set u
e9b0: 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
e9c0: 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65  n-counter change
e9d0: 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20   checking flags 
e9e0: 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69  when.  ** transi
e9f0: 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53  tioning from a S
ea00: 48 41 52 45 44 20 74 6f 20 61 20 52 45 53 45 52  HARED to a RESER
ea10: 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63  VED lock.  The c
ea20: 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20  hange.  ** from 
ea30: 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56  SHARED to RESERV
ea40: 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67  ED marks the beg
ea50: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d  inning of a norm
ea60: 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70  al.  ** write op
ea70: 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68  eration (not a h
ea80: 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot journal rollb
ea90: 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ack)..  */.  if(
eaa0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
eab0: 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c    && pFile->eFil
eac0: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
ead0: 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f  CK.   && eFileLo
eae0: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
eaf0: 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  K.  ){.    pFile
eb00: 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
eb10: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
eb20: 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  dbUpdate = 0;.  
eb30: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
eb40: 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a  lWrite = 1;.  }.
eb50: 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72  #endif...  if( r
eb60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
eb70: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
eb80: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
eb90: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
eba0: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
ebb0: 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ock;.  }else if(
ebc0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
ebd0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
ebe0: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
ebf0: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
ec00: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  K;.    pInode->e
ec10: 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
ec20: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e  NG_LOCK;.  }..en
ec30: 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65  d_lock:.  unixLe
ec40: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
ec50: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
ec60: 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c  %d %s %s (unix)\
ec70: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
ec80: 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
ec90: 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d  ck), .      rc==
eca0: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
ecb0: 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
ecc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ecd0: 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c  *.** Add the fil
ece0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65  e descriptor use
ecf0: 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65  d by file handle
ed00: 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f   pFile to the co
ed10: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70  rresponding.** p
ed20: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  Unused list..*/.
ed30: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50  static void setP
ed40: 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c  endingFd(unixFil
ed50: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
ed60: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
ed70: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
ed80: 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  de;.  UnixUnused
ed90: 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70  Fd *p = pFile->p
eda0: 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
edb0: 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  ed;.  p->pNext =
edc0: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
edd0: 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  ;.  pInode->pUnu
ede0: 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65  sed = p;.  pFile
edf0: 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c  ->h = -1;.  pFil
ee00: 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  e->pPreallocated
ee10: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 20 20 6e 55  Unused = 0;.  nU
ee20: 6e 75 73 65 64 46 64 2b 2b 3b 0a 7d 0a 0a 2f 2a  nusedFd++;.}../*
ee30: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
ee40: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
ee50: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
ee60: 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
ee70: 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
ee80: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
ee90: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
eea0: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
eeb0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
eec0: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
eed0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
eee0: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
eef0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
ef00: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
ef10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
ef20: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a   a no-op..** .**
ef30: 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c   If handleNFSUnl
ef40: 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65  ock is true, the
ef50: 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67  n on downgrading
ef60: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   an EXCLUSIVE_LO
ef70: 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20  CK to SHARED.** 
ef80: 74 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69  the byte range i
ef90: 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32  s divided into 2
efa0: 20 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66   parts and the f
efb0: 69 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c  irst part is unl
efc0: 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65  ocked then.** se
efd0: 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b  t to a read lock
efe0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72  , then the other
eff0: 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20   part is simply 
f000: 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20  unlocked.  This 
f010: 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64  works .** around
f020: 20 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46   a bug in BSD NF
f030: 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65  S lockd (also se
f040: 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e  en on MacOSX 10.
f050: 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74  3+) that fails t
f060: 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o .** remove the
f070: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61   write lock on a
f080: 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72   region when a r
f090: 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e  ead lock is set.
f0a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
f0b0: 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  osixUnlock(sqlit
f0c0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
f0d0: 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20   eFileLock, int 
f0e0: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29  handleNFSUnlock)
f0f0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
f100: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
f110: 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
f120: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
f130: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
f140: 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  k;.  int rc = SQ
f150: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
f160: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
f170: 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
f180: 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64   %d %d was %d(%d
f190: 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69  ,%d) pid=%d (uni
f1a0: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
f1b0: 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
f1c0: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
f1d0: 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
f1e0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
f1f0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
f200: 61 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65  ared,.      osGe
f210: 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73  tpid(0)));..  as
f220: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
f230: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
f240: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
f250: 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
f260: 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
f270: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
f280: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
f290: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
f2a0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
f2b0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
f2c0: 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69  Shared!=0 );.  i
f2d0: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
f2e0: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
f2f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f300: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
f310: 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ==pFile->eFileLo
f320: 63 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ck );..#ifdef SQ
f330: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
f340: 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
f350: 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
f360: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
f370: 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
f380: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
f390: 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
f3a0: 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
f3b0: 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
f3c0: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
f3d0: 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
f3e0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
f3f0: 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
f400: 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
f410: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
f420: 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
f430: 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
f440: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
f450: 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
f460: 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
f470: 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
f480: 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
f490: 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
f4a0: 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
f4b0: 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
f4c0: 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
f4d0: 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
f4e0: 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
f4f0: 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
f500: 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
f510: 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
f520: 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
f530: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e  dif..    /* down
f540: 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61  grading to a sha
f550: 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20  red lock on NFS 
f560: 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e  involves clearin
f570: 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  g the write lock
f580: 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65  .    ** before e
f590: 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20  stablishing the 
f5a0: 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76  readlock - to av
f5b0: 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69  oid a race condi
f5c0: 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64  tion we downgrad
f5d0: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  e.    ** the loc
f5e0: 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73  k in 2 blocks, s
f5f0: 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74  o that part of t
f600: 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65  he range will be
f610: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20   covered by a . 
f620: 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b     ** write lock
f630: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20   until the rest 
f640: 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20  is covered by a 
f650: 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a  read lock:.    *
f660: 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a  *  1:   [WWWWW].
f670: 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e      **  2:   [..
f680: 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20  ..W].    **  3: 
f690: 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a    [RRRRW].    **
f6a0: 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20    4:   [RRRR.]. 
f6b0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46     */.    if( eF
f6c0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
f6d0: 4c 4f 43 4b 20 29 7b 0a 23 69 66 20 21 64 65 66  LOCK ){.#if !def
f6e0: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
f6f0: 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c  || !SQLITE_ENABL
f700: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
f710: 20 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64        (void)hand
f720: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20  leNFSUnlock;.   
f730: 20 20 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c     assert( handl
f740: 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b  eNFSUnlock==0 );
f750: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
f760: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
f770: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
f780: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
f790: 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46      if( handleNF
f7a0: 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  SUnlock ){.     
f7b0: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20     int tErrno;  
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f7d0: 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
f7e0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f  system call erro
f7f0: 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66  rs */.        of
f800: 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48  f_t divSize = SH
f810: 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20  ARED_SIZE - 1;. 
f820: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
f830: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
f840: 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  UNLCK;.        l
f850: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
f860: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
f870: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
f880: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
f890: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
f8a0: 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20   = divSize;.    
f8b0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
f8c0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
f8d0: 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
f8e0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
f8f0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
f900: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
f910: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
f920: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
f930: 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
f940: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
f950: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
f960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f970: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
f980: 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  RDLCK;.        l
f990: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
f9a0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
f9b0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
f9c0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
f9d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
f9e0: 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20   = divSize;.    
f9f0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
fa00: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
fa10: 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
fa20: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
fa30: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
fa40: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
fa50: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
fa60: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
fa70: 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_RDLOCK);.   
fa80: 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
fa90: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72              stor
fab0: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
fac0: 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
fad0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
fae0: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
faf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fb00: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
fb10: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
fb20: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
fb30: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
fb40: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
fb50: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
fb60: 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  +divSize;.      
fb70: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
fb80: 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69  HARED_SIZE-divSi
fb90: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
fba0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
fbb0: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
fbc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
fbd0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
fbe0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
fbf0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
fc00: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72  ;.          stor
fc10: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
fc20: 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
fc30: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
fc40: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
fc50: 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
fc60: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
fc70: 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
fc80: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
fc90: 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20  G_STYLE */.     
fca0: 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   {.        lock.
fcb0: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
fcc0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
fcd0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
fce0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
fcf0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
fd00: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
fd10: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
fd20: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
fd30: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
fd40: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
fd50: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
fd60: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65  * In theory, the
fd70: 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c   call to unixFil
fd80: 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66  eLock() cannot f
fd90: 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74  ail because anot
fda0: 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  her.          **
fdb0: 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
fdc0: 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69  ing an incompati
fdd0: 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  ble lock. If it 
fde0: 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20  does, this .    
fdf0: 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74        ** indicat
fe00: 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68 65  es that the othe
fe10: 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74  r process is not
fe20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
fe30: 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20  ocking.         
fe40: 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66   ** protocol. If
fe50: 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72   this happens, r
fe60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
fe70: 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72  RR_RDLOCK. Retur
fe80: 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  ning.          *
fe90: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f  * SQLITE_BUSY wo
fea0: 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20  uld confuse the 
feb0: 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20  upper layer (in 
fec0: 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75 73  practice it caus
fed0: 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  es .          **
fee0: 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61   an assert to fa
fef0: 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20  il). */ .       
ff00: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
ff10: 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20  OERR_RDLOCK;.   
ff20: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
ff30: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
ff40: 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  no);.          g
ff50: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
ff60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ff70: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b  }.    }.    lock
ff80: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
ff90: 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  K;.    lock.l_wh
ffa0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
ffb0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
ffc0: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
ffd0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
ffe0: 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20   = 2L;  assert( 
fff0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d  PENDING_BYTE+1==
10000 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b  RESERVED_BYTE );
10010 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
10020 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
10030 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)==0 ){.      
10040 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
10050 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
10060 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10070 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
10080 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
10090 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
100a0 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
100b0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
100c0 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  nlock;.    }.  }
100d0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
100e0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ==NO_LOCK ){.   
100f0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
10100 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
10110 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
10120 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
10130 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
10140 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
10150 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
10160 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
10170 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
10180 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
10190 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  /.    pInode->nS
101a0 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28  hared--;.    if(
101b0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
101c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  ==0 ){.      loc
101d0 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
101e0 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  CK;.      lock.l
101f0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
10200 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
10210 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f  _start = lock.l_
10220 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20  len = 0L;.      
10230 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
10240 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
10250 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  0 ){.        pIn
10260 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
10270 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
10280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
10290 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
102a0 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
102b0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
102c0 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
102d0 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65         pInode->e
102e0 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
102f0 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  CK;.        pFil
10300 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
10310 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  O_LOCK;.      }.
10320 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
10330 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e  crement the coun
10340 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e  t of locks again
10350 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c  st this same fil
10360 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20  e.  When the.   
10370 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65   ** count reache
10380 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e  s zero, close an
10390 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  y other file des
103a0 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63  criptors whose c
103b0 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20  lose.    ** was 
103c0 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65  deferred because
103d0 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
103e0 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  locks..    */.  
103f0 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d    pInode->nLock-
10400 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
10410 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  Inode->nLock>=0 
10420 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
10430 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  e->nLock==0 ){. 
10440 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e       closePendin
10450 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
10460 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f   }.  }..end_unlo
10470 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
10480 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
10490 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46  ==SQLITE_OK ) pF
104a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
104b0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
104c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
104d0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
104e0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
104f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
10500 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
10510 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
10520 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
10530 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
10540 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
10550 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
10560 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
10570 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
10580 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
10590 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
105a0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
105b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
105c0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
105d0 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b  c int unixUnlock
105e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
105f0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
10600 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
10610 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
10620 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
10630 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
10640 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69  | ((unixFile *)i
10650 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  d)->nFetchOut==0
10660 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   );.#endif.  ret
10670 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  urn posixUnlock(
10680 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30  id, eFileLock, 0
10690 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  );.}..#if SQLITE
106a0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
106b0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
106c0 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  Mapfile(unixFile
106d0 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65   *pFd, i64 nByte
106e0 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  );.static void u
106f0 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69  nixUnmapfile(uni
10700 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e  xFile *pFd);.#en
10710 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
10720 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
10730 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20 74  s the parts of t
10740 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20  he "close file" 
10750 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f  operation .** co
10760 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
10770 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20  ing schemes. It 
10780 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65 63  closes the direc
10790 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a  tory and file.**
107a0 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65   handles, if the
107b0 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64  y are valid, and
107c0 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73   sets all fields
107d0 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
107e0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f  .** structure to
107f0 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20   0..**.** It is 
10800 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20  *not* necessary 
10810 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
10820 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  x when this rout
10830 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  ine is called,.*
10840 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b  * even on VxWork
10850 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c  s.  A mutex will
10860 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20   be acquired on 
10870 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a  VxWorks by the.*
10880 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  * vxworksRelease
10890 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65  FileId() routine
108a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
108b0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71  closeUnixFile(sq
108c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
108d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
108e0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
108f0 69 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  id;.#if SQLITE_M
10900 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
10910 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70   unixUnmapfile(p
10920 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  File);.#endif.  
10930 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
10940 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  ){.    robust_cl
10950 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65  ose(pFile, pFile
10960 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
10970 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d      pFile->h = -
10980 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58  1;.  }.#if OS_VX
10990 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c  WORKS.  if( pFil
109a0 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66  e->pId ){.    if
109b0 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
109c0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45  gs & UNIXFILE_DE
109d0 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73  LETE ){.      os
109e0 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49  Unlink(pFile->pI
109f0 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
10a00 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78  e);.    }.    vx
10a10 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
10a20 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a  Id(pFile->pId);.
10a30 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d      pFile->pId =
10a40 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   0;.  }.#endif.#
10a50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c  ifdef SQLITE_UNL
10a60 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a  INK_AFTER_CLOSE.
10a70 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72    if( pFile->ctr
10a80 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
10a90 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
10aa0 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e  osUnlink(pFile->
10ab0 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  zPath);.    sqli
10ac0 74 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a  te3_free(*(char*
10ad0 2a 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  *)&pFile->zPath)
10ae0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61  ;.    pFile->zPa
10af0 74 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  th = 0;.  }.#end
10b00 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43  if.  OSTRACE(("C
10b10 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
10b20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70  pFile->h));.  Op
10b30 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
10b40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
10b50 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74  ile->pPreallocat
10b60 65 64 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d  edUnused);.  mem
10b70 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
10b80 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
10b90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10ba0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
10bb0 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
10bc0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c  tatic int unixCl
10bd0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
10be0 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20   *id){.  int rc 
10bf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
10c00 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
10c10 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
10c20 0a 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28  .  verifyDbFile(
10c30 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e  pFile);.  unixUn
10c40 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
10c50 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
10c60 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69  tex();..  /* uni
10c70 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20  xFile.pInode is 
10c80 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68 65 72  always valid her
10c90 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  e. Otherwise, a 
10ca0 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a  different close.
10cb0 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e    ** routine (e.
10cc0 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29  g. nolockClose()
10cd0 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65  ) would be calle
10ce0 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a  d instead..  */.
10cf0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
10d00 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30  >pInode->nLock>0
10d10 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   || pFile->pInod
10d20 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
10d30 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  =0 );.  if( ALWA
10d40 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  YS(pFile->pInode
10d50 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ) && pFile->pIno
10d60 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
10d70 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
10d80 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
10d90 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
10da0 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
10db0 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79  le just.    ** y
10dc0 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
10dd0 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
10de0 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
10df0 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
10e00 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
10e10 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  r to pInode->pUn
10e20 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77  used list.  It w
10e30 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
10e40 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20  ally closed .   
10e50 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73   ** when the las
10e60 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
10e70 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65  d..    */.    se
10e80 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
10e90 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
10ea0 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
10eb0 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e  ;.  rc = closeUn
10ec0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e  ixFile(id);.  un
10ed0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
10ee0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10ef0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  /************** 
10f00 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78  End of the posix
10f10 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69   advisory lock i
10f20 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
10f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
10f90 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
10fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fe0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
10ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
11000 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a  No-op Locking **
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11030 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61  .**.** Of the va
11040 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d  rious locking im
11050 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76  plementations av
11060 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73  ailable, this is
11070 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73   by far the.** s
11080 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e  implest:  lockin
11090 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e  g is ignored.  N
110a0 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  o attempt is mad
110b0 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61  e to lock the da
110c0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66  tabase.** file f
110d0 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  or reading or wr
110e0 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  iting..**.** Thi
110f0 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
11100 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
11110 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e  r use on read-on
11120 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  ly databases.** 
11130 28 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74  (ex: databases t
11140 68 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69  hat are burned i
11150 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20  nto CD-ROM, for 
11160 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61  example.)  It ca
11170 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65  n.** also be use
11180 64 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61  d if the applica
11190 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d  tion employs som
111a0 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61  e external mecha
111b0 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65  nism to.** preve
111c0 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  nt simultaneous 
111d0 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61  access of the sa
111e0 6d 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  me database by t
111f0 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61  wo or more.** da
11200 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
11210 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69  ns.  But there i
11220 73 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b  s a serious risk
11230 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20   of database.** 
11240 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68  corruption if th
11250 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  is locking mode 
11260 69 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61  is used in situa
11270 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74  tions where mult
11280 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  iple.** database
11290 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
112a0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
112b0 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
112c0 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a  e at the same.**
112d0 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72   time and one or
112e0 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63   more of those c
112f0 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77  onnections are w
11300 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74  riting..*/..stat
11310 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65  ic int nolockChe
11320 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
11330 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
11340 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f  Used, int *pResO
11350 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
11360 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
11370 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30  ;.  *pResOut = 0
11380 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11390 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  E_OK;.}.static i
113a0 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71  nt nolockLock(sq
113b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
113c0 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
113d0 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
113e0 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
113f0 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
11400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11410 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
11420 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
11430 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
11440 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
11450 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
11460 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
11470 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
11480 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11490 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66  *.** Close the f
114a0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
114b0 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73  nt nolockClose(s
114c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
114d0 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   {.#ifdef SQLITE
114e0 5f 53 48 41 52 45 44 5f 4d 41 50 50 49 4e 47 0a  _SHARED_MAPPING.
114f0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20    unixFile *pFd 
11500 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11510 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 49 6e 6f  .  if( pFd->pIno
11520 64 65 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e  de ){.    unixEn
11530 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
11540 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
11550 28 70 46 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c  (pFd);.    unixL
11560 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
11570 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
11580 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
11590 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  d);.}../********
115a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
115b0 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
115c0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
115d0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
115e0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
115f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11630 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
11640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11680 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
11690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
116a0 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
116b0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
116c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
116d0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
116e0 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
116f0 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
11700 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65   uses the existe
11710 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
11720 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72  lock.** files (r
11730 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
11740 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  y) to control ac
11750 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
11760 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b  base.  This work
11770 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f  s.** on just abo
11780 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73  ut every filesys
11790 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20  tem imaginable. 
117a0 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73   But there are s
117b0 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73  erious downsides
117c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
117d0 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f  There is zero co
117e0 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69  ncurrency.  A si
117f0 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63  ngle reader bloc
11800 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20  ks all other.** 
11810 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
11820 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ons from reading
11830 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
11840 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
11850 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69     (2)  An appli
11860 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20  cation crash or 
11870 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c  power loss can l
11880 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  eave stale lock 
11890 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  files.**        
118a0 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20   sitting around 
118b0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
118c0 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79  cleared manually
118d0 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65  ..**.** Neverthe
118e0 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20  less, a dotlock 
118f0 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  is an appropriat
11900 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66  e locking mode f
11910 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20  or use if no.** 
11920 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74  other locking st
11930 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61  rategy is availa
11940 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69  ble..**.** Dotfi
11950 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  le locking works
11960 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73   by creating a s
11970 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74  ubdirectory in t
11980 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
11990 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  y as.** the data
119a0 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
119b0 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
119c0 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
119d0 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
119e0 2a 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65  ** The existence
119f0 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63   of a lock direc
11a00 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20  tory implies an 
11a10 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
11a20 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f   All other.** lo
11a30 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ck types (SHARED
11a40 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
11a50 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
11a60 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
11a70 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
11a80 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
11a90 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
11aa0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
11ab0 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
11ac0 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  .** lock directo
11ad0 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  ry..*/.#define D
11ae0 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e  OTLOCK_SUFFIX ".
11af0 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lock"../*.** Thi
11b00 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
11b10 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
11b20 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
11b30 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
11b40 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
11b50 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
11b60 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
11b70 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
11b80 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
11b90 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
11ba0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
11bb0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
11bc0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
11bd0 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
11be0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
11bf0 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
11c00 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
11c10 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
11c20 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69  ..**.** In dotfi
11c30 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68  le locking, eith
11c40 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73  er a lock exists
11c50 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   or it does not.
11c60 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20    So in this.** 
11c70 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65  variation of Che
11c80 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
11c90 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  , *pResOut is se
11ca0 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79  t to true if any
11cb0 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64   lock.** is held
11cc0 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
11cd0 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69   false if the fi
11ce0 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a  le is unlocked..
11cf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
11d00 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
11d10 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
11d20 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
11d30 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
11d40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11d50 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
11d60 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
11d70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
11d80 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
11d90 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
11da0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
11db0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
11dc0 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
11dd0 20 70 46 69 6c 65 20 29 3b 0a 20 20 72 65 73 65   pFile );.  rese
11de0 72 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28  rved = osAccess(
11df0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69  (const char*)pFi
11e00 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
11e10 78 74 2c 20 30 29 3d 3d 30 3b 0a 20 20 4f 53 54  xt, 0)==0;.  OST
11e20 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
11e30 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f  OCK %d %d %d (do
11e40 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  tlock)\n", pFile
11e50 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
11e60 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20  d));.  *pResOut 
11e70 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
11e80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11e90 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
11ea0 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
11eb0 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
11ec0 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
11ed0 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
11ee0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
11ef0 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
11f00 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
11f10 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
11f20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
11f30 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
11f40 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
11f50 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
11f60 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
11f70 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
11f80 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
11f90 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
11fa0 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
11fb0 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
11fc0 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
11fd0 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
11fe0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
11ff0 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
12000 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
12010 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
12020 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
12030 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
12040 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
12050 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
12060 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
12070 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
12080 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
12090 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
120a0 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
120b0 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
120c0 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
120d0 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
120e0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
120f0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
12100 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
12110 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
12120 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
12130 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
12140 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12150 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
12160 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
12170 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
12180 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
12190 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
121a0 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a  cking level..**.
121b0 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20  ** With dotfile 
121c0 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c  locking, we real
121d0 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  ly only support 
121e0 73 74 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55  state (4): EXCLU
121f0 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20  SIVE..** But we 
12200 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20  track the other 
12210 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69  locking levels i
12220 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74  nternally..*/.st
12230 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
12240 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
12250 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
12260 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
12270 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
12280 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61  xFile*)id;.  cha
12290 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
122a0 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
122b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
122c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
122d0 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65  OK;...  /* If we
122e0 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20   have any lock, 
122f0 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69  then the lock fi
12300 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
12310 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a  s.  All we have.
12320 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64    ** to do is ad
12330 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61  just our interna
12340 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  l record of the 
12350 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f  lock level..  */
12360 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
12370 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
12380 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
12390 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
123a0 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c  eLock;.    /* Al
123b0 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20  ways update the 
123c0 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65  timestamp on the
123d0 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66   old file */.#if
123e0 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20  def HAVE_UTIME. 
123f0 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69     utime(zLockFi
12400 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65  le, NULL);.#else
12410 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63  .    utimes(zLoc
12420 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
12430 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
12440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
12450 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
12460 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
12470 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28  .  rc = osMkdir(
12480 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29  zLockFile, 0777)
12490 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a  ;.  if( rc<0 ){.
124a0 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f      /* failed to
124b0 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65   open/create the
124c0 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20   lock directory 
124d0 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  */.    int tErrn
124e0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
124f0 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72  f( EEXIST == tEr
12500 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rno ){.      rc 
12510 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
12520 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
12530 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
12540 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
12550 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
12560 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
12570 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12580 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
12590 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
125a0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
125b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
125c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
125d0 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69  } .  .  /* got i
125e0 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
125f0 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
12600 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
12610 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
12620 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12630 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
12640 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
12650 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
12660 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
12670 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
12680 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
12690 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
126a0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
126b0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
126c0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
126d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
126e0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
126f0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
12700 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
12710 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
12720 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
12730 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b  ** When the lock
12740 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65  ing level reache
12750 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74  s NO_LOCK, delet
12760 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e  e the lock file.
12770 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
12780 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  otlockUnlock(sql
12790 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
127a0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
127b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
127c0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
127d0 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
127e0 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
127f0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
12800 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  text;.  int rc;.
12810 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12820 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
12830 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
12840 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74  s %d pid=%d (dot
12850 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
12860 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
12870 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
12880 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65  >eFileLock, osGe
12890 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73  tpid(0)));.  ass
128a0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
128b0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
128c0 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
128d0 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
128e0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
128f0 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
12900 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12910 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
12920 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f   To downgrade to
12930 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20   shared, simply 
12940 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72  update our inter
12950 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68  nal notion of th
12960 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  e.  ** lock stat
12970 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d  e.  No need to m
12980 65 73 73 20 77 69 74 68 20 74 68 65 20 66 69 6c  ess with the fil
12990 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  e on disk..  */.
129a0 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
129b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
129c0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
129d0 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
129e0 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
129f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
12a00 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75  .  /* To fully u
12a10 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
12a20 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  se, delete the l
12a30 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73  ock file */.  as
12a40 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
12a50 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63  =NO_LOCK );.  rc
12a60 20 3d 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b   = osRmdir(zLock
12a70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c  File);.  if( rc<
12a80 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  0 ){.    int tEr
12a90 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
12aa0 20 69 66 28 20 74 45 72 72 6e 6f 3d 3d 45 4e 4f   if( tErrno==ENO
12ab0 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ENT ){.      rc 
12ac0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
12ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
12ae0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
12af0 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74  UNLOCK;.      st
12b00 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
12b10 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
12b20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
12b30 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  ; .  }.  pFile->
12b40 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
12b50 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OCK;.  return SQ
12b60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12b70 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20  * Close a file. 
12b80 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
12b90 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c  ock has been rel
12ba0 65 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f  eased before clo
12bb0 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sing..*/.static 
12bc0 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  int dotlockClose
12bd0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12be0 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  d) {.  unixFile 
12bf0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12c00 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74  le*)id;.  assert
12c10 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 64 6f 74  ( id!=0 );.  dot
12c20 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  lockUnlock(id, N
12c30 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74  O_LOCK);.  sqlit
12c40 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
12c50 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
12c60 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
12c70 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 2f 2a  ixFile(id);.}./*
12c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c90 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74  * End of the dot
12ca0 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  -file lock imple
12cb0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
12cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
12cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
12d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
12d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
12d90 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a  flock Locking **
12da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
12dc0 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f  *.** Use the flo
12dd0 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  ck() system call
12de0 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b   to do file lock
12df0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  ing..**.** flock
12e00 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  () locking is li
12e10 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  ke dot-file lock
12e20 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20  ing in that the 
12e30 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d  various.** fine-
12e40 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65  grain locking le
12e50 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62  vels supported b
12e60 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c  y SQLite are col
12e70 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61  lapsed into.** a
12e80 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76   single exclusiv
12e90 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65  e lock.  In othe
12ea0 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c  r words, SHARED,
12eb0 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a   RESERVED, and.*
12ec0 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20  * PENDING locks 
12ed0 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69  are the same thi
12ee0 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49  ng as an EXCLUSI
12ef0 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65  VE lock.  SQLite
12f00 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20  .** still works 
12f10 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73  when you do this
12f20 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63  , but concurrenc
12f30 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e  y is reduced sin
12f40 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  ce.** only a sin
12f50 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
12f60 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  be reading the d
12f70 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d  atabase at a tim
12f80 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68  e..**.** Omit th
12f90 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51  is section if SQ
12fa0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
12fb0 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72  ING_STYLE is tur
12fc0 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 53  ned off.*/.#if S
12fd0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
12fe0 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a  KING_STYLE../*.*
12ff0 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20  * Retry flock() 
13000 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20  calls that fail 
13010 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69  with EINTR.*/.#i
13020 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69  fdef EINTR.stati
13030 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f  c int robust_flo
13040 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ck(int fd, int o
13050 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
13060 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66  do{ rc = flock(f
13070 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72  d,op); }while( r
13080 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
13090 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NTR );.  return 
130a0 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  rc;.}.#else.# de
130b0 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63  fine robust_floc
130c0 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62  k(a,b) flock(a,b
130d0 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a  ).#endif.     ..
130e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
130f0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
13100 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
13110 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
13120 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
13130 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
13140 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
13150 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
13160 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
13170 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
13180 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
13190 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
131a0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
131b0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
131c0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
131d0 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
131e0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
131f0 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
13200 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
13210 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68  atic int flockCh
13220 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
13230 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13240 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
13250 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13260 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
13270 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
13280 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
13290 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
132a0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
132b0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
132c0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
132d0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
132e0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
132f0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   );.  .  /* Chec
13300 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
13310 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
13320 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
13330 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
13340 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
13350 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
13360 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
13370 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
13380 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
13390 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
133a0 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72   it. */.  if( !r
133b0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f  eserved ){.    /
133c0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74  * attempt to get
133d0 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
133e0 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73   int lrc = robus
133f0 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
13400 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
13410 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c  _NB);.    if( !l
13420 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67  rc ){.      /* g
13430 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c  ot the lock, unl
13440 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ock it */.      
13450 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
13460 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
13470 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20  K_UN);.      if 
13480 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20  ( lrc ) {.      
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 20 20 20 20 2f 2a  rrno;.        /*
134b0 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77   unlock failed w
134c0 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ith an error */.
134d0 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51          lrc = SQ
134e0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
134f0 4b 3b 20 0a 20 20 20 20 20 20 20 20 73 74 6f 72  K; .        stor
13500 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
13510 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
13520 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
13530 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
13540 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
13550 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
13560 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
13570 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
13580 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65   else might have
13590 20 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a   it reserved */.
135a0 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69        lrc = sqli
135b0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
135c0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
135d0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
135e0 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  ; .      if( IS_
135f0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
13600 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
13610 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
13620 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
13630 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
13640 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
13650 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
13660 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
13670 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
13680 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
13690 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ed));..#ifdef SQ
136a0 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
136b0 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
136c0 69 66 28 20 28 72 63 20 26 20 30 78 66 66 29 20  if( (rc & 0xff) 
136d0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
136e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
136f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72  TE_OK;.    reser
13700 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  ved=1;.  }.#endi
13710 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
13720 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
13730 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f  RORS */.  *pResO
13740 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
13750 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13760 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
13770 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
13780 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
13790 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
137a0 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
137b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
137c0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
137d0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
137e0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
137f0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
13800 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
13810 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
13820 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
13830 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
13840 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
13850 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
13860 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
13870 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
13880 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
13890 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
138a0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
138b0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
138c0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
138d0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
138e0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
138f0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
13900 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
13910 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
13920 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
13930 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
13940 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
13950 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
13960 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
13970 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
13980 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
13990 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
139a0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
139b0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
139c0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
139d0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
139e0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
139f0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
13a00 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
13a10 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  E.**.** flock() 
13a20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
13a30 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
13a40 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
13a50 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
13a60 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
13a70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
13a80 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
13a90 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
13aa0 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
13ab0 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
13ac0 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
13ad0 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
13ae0 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
13af0 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
13b00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13b10 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
13b20 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
13b30 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
13b40 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
13b50 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
13b60 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
13b70 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
13b80 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
13b90 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
13ba0 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63  Lock) {.  int rc
13bb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13bc0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
13bd0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
13be0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
13bf0 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  e );..  /* if we
13c00 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
13c10 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
13c20 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
13c30 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
13c40 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
13c50 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
13c60 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
13c70 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
13c80 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13c90 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
13ca0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13cb0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
13cc0 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
13cd0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a  sive lock */.  .
13ce0 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f    if (robust_flo
13cf0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
13d00 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29  K_EX | LOCK_NB))
13d10 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e   {.    int tErrn
13d20 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f  o = errno;.    /
13d30 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75  * didn't get, mu
13d40 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20  st be busy */.  
13d50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
13d60 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
13d70 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
13d80 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
13d90 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
13da0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
13db0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
13dc0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
13dd0 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a     }.  } else {.
13de0 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73      /* got it, s
13df0 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
13e00 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20  return ok */.   
13e10 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13e20 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
13e30 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c   }.  OSTRACE(("L
13e40 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
13e50 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
13e60 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
13e70 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
13e80 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
13e90 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
13ea0 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64  "failed"));.#ifd
13eb0 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
13ec0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
13ed0 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 30  RS.  if( (rc & 0
13ee0 78 66 66 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  xff) == SQLITE_I
13ef0 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d  OERR ){.    rc =
13f00 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
13f10 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
13f20 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
13f30 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
13f40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
13f50 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
13f60 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
13f70 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
13f80 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
13f90 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
13fa0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
13fb0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
13fc0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
13fd0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
13fe0 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
13ff0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
14000 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
14010 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
14020 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
14030 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
14040 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
14050 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55  tatic int flockU
14060 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
14070 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
14080 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
14090 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
140a0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
140b0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
140c0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
140d0 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
140e0 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b  %d pid=%d (flock
140f0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
14100 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
14110 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
14120 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64  leLock, osGetpid
14130 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (0)));.  assert(
14140 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
14150 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
14160 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
14170 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
14180 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
14190 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
141a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
141b0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
141c0 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
141d0 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
141e0 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
141f0 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
14200 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
14210 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
14220 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14230 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
14240 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14250 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
14260 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c   no, really, unl
14270 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f  ock. */.  if( ro
14280 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
14290 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b  ->h, LOCK_UN) ){
142a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
142b0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
142c0 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75  _ERRORS.    retu
142d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
142e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
142f0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
14300 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72  _ERRORS */.    r
14310 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
14320 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c  RR_UNLOCK;.  }el
14330 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  se{.    pFile->e
14340 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
14350 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
14360 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
14370 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
14380 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
14390 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  nt flockClose(sq
143a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
143b0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  {.  assert( id!=
143c0 30 20 29 3b 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f  0 );.  flockUnlo
143d0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
143e0 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
143f0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
14400 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14410 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
14420 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
14430 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORK */../*******
14440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
14450 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f   of the flock lo
14460 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
14470 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
14480 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
14490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144d0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
144e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14520 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
14530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14540 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65  * Begin Named Se
14550 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20  maphore Locking 
14560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14570 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e  ********.**.** N
14580 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
14590 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73  ocking is only s
145a0 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f  upported on VxWo
145b0 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  rks..**.** Semap
145c0 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
145d0 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e  like dot-lock an
145e0 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20  d flock in that 
145f0 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a  it really only.*
14600 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55  * supports EXCLU
14610 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f  SIVE locking.  O
14620 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
14630 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72  cess can read or
14640 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61   write.** the da
14650 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61  tabase file at a
14660 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64   time.  This red
14670 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63  uces potential c
14680 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a  oncurrency, but.
14690 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63  ** makes the loc
146a0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
146b0 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f   much easier..*/
146c0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
146d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
146e0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
146f0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
14700 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
14710 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
14720 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
14730 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
14740 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
14750 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
14760 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
14770 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
14780 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
14790 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
147a0 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
147b0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
147c0 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
147d0 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
147e0 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
147f0 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
14800 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43 68  tatic int semXCh
14810 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
14820 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14830 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
14840 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14850 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
14860 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
14870 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
14880 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
14890 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
148a0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
148b0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
148c0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
148d0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
148e0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
148f0 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
14900 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
14910 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
14920 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
14930 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
14940 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
14950 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
14960 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
14970 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
14980 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
14990 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65  . */.  if( !rese
149a0 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f  rved ){.    sem_
149b0 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
149c0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a  >pInode->pSem;..
149d0 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77      if( sem_tryw
149e0 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
149f0 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
14a00 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
14a10 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74   if( EAGAIN != t
14a20 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  Errno ){.       
14a30 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
14a40 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
14a50 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
14a60 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
14a70 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  EDLOCK);.       
14a80 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
14a90 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
14aa0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
14ab0 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e         /* someon
14ac0 65 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c  e else has the l
14ad0 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20  ock when we are 
14ae0 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20  in NO_LOCK */.  
14af0 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
14b00 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
14b10 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck < SHARED_LOCK
14b20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14b30 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77  else{.      /* w
14b40 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20  e could have it 
14b50 69 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f  if we want it */
14b60 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28  .      sem_post(
14b70 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pSem);.    }.  }
14b80 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
14b90 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
14ba0 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69  %d (sem)\n", pFi
14bb0 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
14bc0 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
14bd0 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
14be0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14bf0 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
14c00 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
14c10 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
14c20 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
14c30 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
14c40 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
14c50 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
14c60 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
14c70 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
14c80 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
14c90 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
14ca0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
14cb0 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
14cc0 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
14cd0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
14ce0 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
14cf0 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
14d00 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
14d10 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
14d20 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
14d30 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
14d40 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
14d50 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
14d60 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
14d70 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
14d80 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
14d90 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
14da0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
14db0 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
14dc0 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
14dd0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
14de0 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
14df0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
14e00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
14e10 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
14e20 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
14e30 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
14e40 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
14e50 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
14e60 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
14e70 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
14e80 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
14e90 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
14ea0 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72  E.**.** Semaphor
14eb0 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61  e locks only rea
14ec0 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
14ed0 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
14ee0 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
14ef0 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
14f00 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
14f10 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
14f20 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
14f30 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
14f40 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
14f50 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
14f60 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
14f70 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
14f80 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
14f90 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
14fa0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
14fb0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
14fc0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
14fd0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
14fe0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
14ff0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
15000 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
15010 6e 74 20 73 65 6d 58 4c 6f 63 6b 28 73 71 6c 69  nt semXLock(sqli
15020 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
15030 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
15040 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
15050 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
15060 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
15070 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
15080 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20  >pSem;.  int rc 
15090 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
150a0 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
150b0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
150c0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
150d0 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
150e0 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
150f0 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
15100 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
15110 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
15120 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
15130 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
15140 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20  ileLock;.    rc 
15150 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
15160 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
15170 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
15180 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e  lock semaphore n
15190 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20  ow but bail out 
151a0 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63  when already loc
151b0 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65  ked. */.  if( se
151c0 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
151d0 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =-1 ){.    rc = 
151e0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
151f0 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
15200 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f  ck;.  }..  /* go
15210 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
15220 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
15230 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69   */.  pFile->eFi
15240 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
15250 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f  ck;.. sem_end_lo
15260 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck:.  return rc;
15270 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
15280 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
15290 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
152a0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
152b0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
152c0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
152d0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
152e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
152f0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
15300 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
15310 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
15320 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
15330 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
15340 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
15350 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
15360 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
15370 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
15380 6d 58 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  mXUnlock(sqlite3
15390 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
153a0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
153b0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
153c0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
153d0 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
153e0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
153f0 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  em;..  assert( p
15400 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  File );.  assert
15410 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52  ( pSem );.  OSTR
15420 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
15430 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
15440 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
15450 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
15460 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
15470 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73  e->eFileLock, os
15480 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61  Getpid(0)));.  a
15490 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
154a0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
154b0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
154c0 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
154d0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
154e0 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
154f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15500 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
15510 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
15520 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
15530 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
15540 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
15550 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  */.  if (eFileLo
15560 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
15570 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
15580 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
15590 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
155a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
155b0 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
155c0 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  y unlock. */.  i
155d0 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65  f ( sem_post(pSe
155e0 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  m)==-1 ) {.    i
155f0 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20  nt rc, tErrno = 
15600 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
15610 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
15620 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
15630 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
15640 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
15650 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
15660 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  ) ){.      store
15670 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
15680 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a   tErrno);.    }.
15690 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
156a0 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69    }.  pFile->eFi
156b0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
156c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
156d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  E_OK;.}../*. ** 
156e0 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a  Close a file.. *
156f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
15700 58 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  XClose(sqlite3_f
15710 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
15720 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
15730 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
15740 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
15750 73 65 6d 58 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  semXUnlock(id, N
15760 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73  O_LOCK);.    ass
15770 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
15780 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
15790 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49  ();.    releaseI
157a0 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
157b0 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
157c0 74 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65  tex();.    close
157d0 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
157e0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
157f0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
15800 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
15810 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d  ./*.** Named sem
15820 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69  aphore locking i
15830 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
15840 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a   on VxWorks..**.
15850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
15860 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  End of the named
15870 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20   semaphore lock 
15880 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
15890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
158a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
158f0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
15900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15940 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
15950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
15960 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20  gin AFP Locking 
15970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15990 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74  *.**.** AFP is t
159a0 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20  he Apple Filing 
159b0 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69  Protocol.  AFP i
159c0 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65  s a network file
159d0 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20  system found.** 
159e0 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f  on Apple Macinto
159f0 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62  sh computers - b
15a00 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e  oth OS9 and OSX.
15a10 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72  .**.** Third-par
15a20 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ty implementatio
15a30 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20 61 76  ns of AFP are av
15a40 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68  ailable.  But th
15a50 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20  is code here.** 
15a60 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53  only works on OS
15a70 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  X..*/..#if defin
15a80 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
15a90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
15aa0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
15ab0 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e  ** The afpLockin
15ac0 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  gContext structu
15ad0 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  re contains all 
15ae0 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  afp lock specifi
15af0 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64  c state.*/.typed
15b00 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63  ef struct afpLoc
15b10 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c  kingContext afpL
15b20 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73  ockingContext;.s
15b30 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67  truct afpLocking
15b40 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20  Context {.  int 
15b50 72 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73  reserved;.  cons
15b60 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20  t char *dbPath; 
15b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15b80 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ame of the open 
15b90 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75  file */.};..stru
15ba0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
15bb0 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  PB2.{.  unsigned
15bc0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
15bd0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66  t;        /* off
15be0 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74  set to first byt
15bf0 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  e to lock */.  u
15c00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
15c10 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20  g length;       
15c20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73   /* nbr of bytes
15c30 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e   to lock */.  un
15c40 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
15c50 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20   retRangeStart; 
15c60 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79  /* nbr of 1st by
15c70 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63  te locked if suc
15c80 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73  cessful */.  uns
15c90 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63  igned char unLoc
15ca0 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f  kFlag;         /
15cb0 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20  * 1 = unlock, 0 
15cc0 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  = lock */.  unsi
15cd0 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74 45  gned char startE
15ce0 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  ndFlag;       /*
15cf0 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66   1=rel to end of
15d00 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20   fork, 0=rel to 
15d10 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66  start */.  int f
15d20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
15d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d40 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73  file desc to ass
15d50 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74  oc this lock wit
15d60 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65  h */.};..#define
15d70 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c   afpfsByteRangeL
15d80 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20  ock2FSCTL       
15d90 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20   _IOWR('z', 23, 
15da0 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
15db0 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20  LockPB2)../*.** 
15dc0 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74  This is a utilit
15dd0 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72  y for setting or
15de0 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d   clearing a bit-
15df0 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e  range lock on an
15e00 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74  .** AFP filesyst
15e10 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72  em..** .** Retur
15e20 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
15e30 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42  uccess, SQLITE_B
15e40 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  USY on failure..
15e50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
15e60 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73  pSetLock(.  cons
15e70 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20  t char *path,   
15e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
15e90 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  me of the file t
15ea0 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75  o be locked or u
15eb0 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69  nlocked */.  uni
15ec0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  xFile *pFile,   
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15ee0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
15ef0 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20  tor on path */. 
15f00 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
15f10 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20  ong offset,     
15f20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 74 6f  /* First byte to
15f30 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20   be locked */.  
15f40 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
15f50 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f  ng length,     /
15f60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
15f70 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  s to lock */.  i
15f80 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20  nt setLockFlag  
15f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15fa0 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63   True to set loc
15fb0 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65  k.  False to cle
15fc0 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ar lock */.){.  
15fd0 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
15fe0 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e  LockPB2 pb;.  in
15ff0 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75  t err;.  .  pb.u
16000 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c  nLockFlag = setL
16010 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b  ockFlag ? 0 : 1;
16020 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c  .  pb.startEndFl
16030 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66  ag = 0;.  pb.off
16040 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20  set = offset;.  
16050 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67  pb.length = leng
16060 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70  th; .  pb.fd = p
16070 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53  File->h;.  .  OS
16080 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f  TRACE(("AFPSETLO
16090 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73  CK [%s] for %d%s
160a0 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25   in range %llx:%
160b0 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65  llx\n", .    (se
160c0 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22  tLockFlag?"ON":"
160d0 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c  OFF"), pFile->h,
160e0 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65   (pb.fd==-1?"[te
160f0 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20  stval-1]":""),. 
16100 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74     offset, lengt
16110 68 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63  h));.  err = fsc
16120 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42 79  tl(path, afpfsBy
16130 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
16140 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66  L, &pb, 0);.  if
16150 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20   ( err==-1 ) {. 
16160 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
16170 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
16180 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  o;.    OSTRACE((
16190 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c  "AFPSETLOCK fail
161a0 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25  ed to fsctl() '%
161b0 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  s' %d %s\n",.   
161c0 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c 20            path, 
161d0 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72  tErrno, strerror
161e0 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64  (tErrno)));.#ifd
161f0 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
16200 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  _AFP_LOCK_ERRORS
16210 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
16220 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20  _BUSY;.#else.   
16230 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
16240 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
16250 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
16260 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 4c              setL
16270 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45  ockFlag ? SQLITE
16280 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51  _IOERR_LOCK : SQ
16290 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
162a0 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  K);.#endif /* SQ
162b0 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f  LITE_IGNORE_AFP_
162c0 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
162d0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
162e0 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
162f0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
16300 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
16310 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
16320 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  n rc;.  } else {
16330 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16340 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
16350 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16360 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
16370 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
16380 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
16390 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
163a0 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
163b0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
163c0 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
163d0 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
163e0 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
163f0 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
16400 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
16410 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
16420 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
16430 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
16440 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
16450 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
16460 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
16470 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
16480 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52  ic int afpCheckR
16490 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
164a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
164b0 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
164c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
164d0 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
164e0 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
164f0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
16500 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c  File*)id;.  afpL
16510 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
16520 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d  ontext;.  .  Sim
16530 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
16540 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
16550 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
16560 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
16570 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
16580 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
16590 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
165a0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
165b0 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e  ntext;.  if( con
165c0 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29  text->reserved )
165d0 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d  {.    *pResOut =
165e0 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
165f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
16600 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
16610 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
16620 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
16630 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
16640 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43  ads */.  .  /* C
16650 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
16660 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
16670 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
16680 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
16690 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
166a0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
166b0 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
166c0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
166d0 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
166e0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
166f0 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
16700 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73     */.  if( !res
16710 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
16720 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45  lock the RESERVE
16730 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e  D byte */.    in
16740 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f  t lrc = afpSetLo
16750 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
16760 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
16770 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20  VED_BYTE, 1,1); 
16780 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45   .    if( SQLITE
16790 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20  _OK==lrc ){.    
167a0 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65    /* if we succe
167b0 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74  eded in taking t
167c0 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
167d0 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72  , unlock it to r
167e0 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  estore.      ** 
167f0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  the original sta
16800 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  te */.      lrc 
16810 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16820 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16830 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
16840 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
16850 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a   else {.      /*
16860 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f   if we failed to
16870 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68   get the lock th
16880 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  en someone else 
16890 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a  must have it */.
168a0 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
168b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
168c0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
168d0 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63  lrc) ){.      rc
168e0 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =lrc;.    }.  }.
168f0 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
16900 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
16910 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
16920 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e  %d %d %d (afp)\n
16930 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
16940 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a   reserved));.  .
16950 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
16960 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
16970 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
16980 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
16990 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
169a0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
169b0 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
169c0 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
169d0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
169e0 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
169f0 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
16a00 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
16a10 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
16a20 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
16a30 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
16a40 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
16a50 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
16a60 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
16a70 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
16a80 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
16a90 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
16aa0 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
16ab0 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
16ac0 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
16ad0 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
16ae0 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
16af0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
16b00 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
16b10 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
16b20 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
16b30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
16b40 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
16b50 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
16b60 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
16b70 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
16b80 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
16b90 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
16ba0 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
16bb0 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
16bc0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
16bd0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
16be0 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
16bf0 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
16c00 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
16c10 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
16c20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
16c30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
16c40 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
16c50 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
16c60 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
16c70 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
16c80 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
16c90 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
16ca0 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71  c int afpLock(sq
16cb0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
16cc0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
16cd0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16ce0 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
16cf0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
16d00 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
16d10 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
16d20 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
16d30 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
16d40 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
16d50 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
16d60 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
16d70 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
16d80 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
16d90 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
16da0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
16db0 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
16dc0 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
16dd0 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
16de0 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
16df0 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c  leLock), azFileL
16e00 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ock(pFile->eFile
16e10 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20  Lock),.         
16e20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e    azFileLock(pIn
16e30 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ode->eFileLock),
16e40 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
16e50 20 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29   , osGetpid(0)))
16e60 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
16e70 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
16e80 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
16e90 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
16ea0 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
16eb0 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  unixFile, do not
16ec0 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
16ed0 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  the afp_end_lock
16ee0 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
16ef0 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
16f00 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
16f10 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
16f20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
16f30 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65  eFileLock>=eFile
16f40 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52  Lock ){.    OSTR
16f50 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
16f60 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
16f70 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20  held) (afp)\n", 
16f80 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
16f90 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
16fa0 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20  eFileLock)));.  
16fb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16fc0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
16fd0 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
16fe0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
16ff0 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31  correct.  **  (1
17000 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
17010 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
17020 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
17030 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
17040 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
17050 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
17060 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
17070 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
17080 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
17090 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
170a0 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
170b0 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
170c0 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
170d0 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
170e0 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
170f0 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
17100 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
17110 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
17120 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
17130 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
17140 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
17150 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
17160 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
17170 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
17180 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
17190 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
171a0 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
171b0 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
171c0 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
171d0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
171e0 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
171f0 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
17200 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
17210 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
17220 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
17230 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
17240 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
17250 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
17260 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
17270 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
17280 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
17290 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
172a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
172b0 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e         (pInode->
172c0 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
172d0 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NG_LOCK || eFile
172e0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
172f0 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72  )).     ){.    r
17300 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
17310 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e  .    goto afp_en
17320 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
17330 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
17340 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
17350 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
17360 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
17370 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
17380 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
17390 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
173a0 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
173b0 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
173c0 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
173d0 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
173e0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
173f0 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
17400 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
17410 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
17420 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65  OCK || pInode->e
17430 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
17440 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
17450 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
17460 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
17470 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
17480 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
17490 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
174a0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
174b0 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
174c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
174d0 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  RED_LOCK;.    pI
174e0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b  node->nShared++;
174f0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
17500 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61  ck++;.    goto a
17510 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
17520 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e  .    .  /* A PEN
17530 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
17540 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
17550 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
17560 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
17570 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
17580 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
17590 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
175a0 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
175b0 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
175c0 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
175d0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
175e0 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
175f0 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    || (eFileLock=
17600 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
17610 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
17620 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ock<PENDING_LOCK
17630 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  ).  ){.    int f
17640 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65  ailed;.    faile
17650 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
17660 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17670 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
17680 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  YTE, 1, 1);.    
17690 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20  if (failed) {.  
176a0 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
176b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
176c0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
176d0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63    }.  .  /* If c
176e0 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
176f0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
17700 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
17710 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
17720 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
17730 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
17740 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
17750 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
17760 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
17770 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31   ){.    int lrc1
17780 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e  , lrc2, lrc1Errn
17790 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20  o = 0;.    long 
177a0 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20  lk, mask;.    . 
177b0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
177c0 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
177d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
177e0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
177f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  0 );.        .  
17800 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66    mask = (sizeof
17810 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52  (long)==8) ? LAR
17820 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37  GEST_INT64 : 0x7
17830 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20  fffffff;.    /* 
17840 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
17850 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43  -lock SHARED_LOC
17860 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65  K */.    /* note
17870 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74   that the qualit
17880 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e  y of the randomn
17890 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ess doesn't matt
178a0 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a  er that much */.
178b0 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28      lk = random(
178c0 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ); .    pInode->
178d0 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b  sharedByte = (lk
178e0 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44   & mask)%(SHARED
178f0 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
17900 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc1 = afpSetLoc
17910 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17920 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
17930 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
17940 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
17950 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
17960 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
17970 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20  OR(lrc1) ){.    
17980 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46    lrc1Errno = pF
17990 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
179a0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
179b0 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
179c0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
179d0 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65      lrc2 = afpSe
179e0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
179f0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
17a00 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
17a10 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
17a20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
17a30 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73 74  c1) ) {.      st
17a40 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
17a50 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b 0a  le, lrc1Errno);.
17a60 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
17a70 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
17a80 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
17a90 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b  else if( IS_LOCK
17aa0 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a  _ERROR(lrc2) ){.
17ab0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b        rc = lrc2;
17ac0 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
17ad0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
17ae0 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d  else if( lrc1 !=
17af0 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20   SQLITE_OK ) {. 
17b00 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
17b10 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
17b20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
17b30 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
17b40 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
17b50 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
17b60 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
17b70 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
17b80 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
17b90 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
17ba0 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
17bb0 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
17bc0 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
17bd0 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
17be0 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
17bf0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
17c00 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
17c10 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
17c20 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
17c30 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
17c40 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
17c50 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
17c60 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
17c70 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
17c80 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
17c90 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
17ca0 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
17cb0 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
17cc0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
17cd0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
17ce0 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
17cf0 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
17d00 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  0;.    assert( 0
17d10 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
17d20 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46  ck );.    if (eF
17d30 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52  ileLock >= RESER
17d40 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  VED_LOCK && pFil
17d50 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52  e->eFileLock < R
17d60 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a  ESERVED_LOCK) {.
17d70 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69          /* Acqui
17d80 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
17d90 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ck */.        fa
17da0 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
17db0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17dc0 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
17dd0 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20  ED_BYTE, 1,1);. 
17de0 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64       if( !failed
17df0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
17e00 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  ext->reserved = 
17e10 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
17e20 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64  .    if (!failed
17e30 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d   && eFileLock ==
17e40 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
17e50 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75   {.      /* Acqu
17e60 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
17e70 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
17e80 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76   .      /* Remov
17e90 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  e the shared loc
17ea0 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20  k before trying 
17eb0 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c  the range.  we'l
17ec0 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20  l need to .     
17ed0 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20   ** reestablish 
17ee0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
17ef0 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20  if we can't get 
17f00 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20  the  afpUnlock. 
17f10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
17f20 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70  ( !(failed = afp
17f30 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17f40 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17f50 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20  SHARED_FIRST +. 
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f70 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
17f80 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30  sharedByte, 1, 0
17f90 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  )) ){.        in
17fa0 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49  t failed2 = SQLI
17fb0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f  TE_OK;.        /
17fc0 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74  * now attemmpt t
17fd0 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73  o get the exclus
17fe0 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a  ive lock range *
17ff0 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
18000 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
18010 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
18020 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
18030 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ST, .           
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18050 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
18060 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
18070 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c   failed && (fail
18080 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  ed2 = afpSetLock
18090 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
180a0 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20  , pFile, .      
180b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180c0 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
180d0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
180e0 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20  te, 1, 1)) ){.  
180f0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74          /* Can't
18100 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
18110 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53   shared lock.  S
18120 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c  qlite can't deal
18130 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20  , this is.      
18140 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61      ** a critica
18150 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20  l I/O error.    
18160 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18170 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64     rc = ((failed
18180 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49   & 0xff) == SQLI
18190 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c  TE_IOERR) ? fail
181a0 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20  ed2 : .         
181b0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45        SQLITE_IOE
181c0 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
181d0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
181e0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20  lock;.        } 
181f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18200 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
18210 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d; .      }.    
18220 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64  }.    if( failed
18230 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
18240 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ailed;.    }.  }
18250 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
18260 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
18270 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
18280 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
18290 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
182a0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
182b0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
182c0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
182d0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
182e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
182f0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
18300 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
18310 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
18320 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65  CK;.  }.  .afp_e
18330 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  nd_lock:.  unixL
18340 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
18350 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
18360 20 25 64 20 25 73 20 25 73 20 28 61 66 70 29 5c   %d %s %s (afp)\
18370 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
18380 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
18390 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72  ck), .         r
183a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
183b0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
183c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
183d0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
183e0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
183f0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
18400 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
18410 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
18420 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
18430 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
18440 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
18450 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
18460 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
18470 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
18480 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
18490 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
184a0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
184b0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
184c0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
184d0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55  .static int afpU
184e0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
184f0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
18500 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72  eLock) {.  int r
18510 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
18520 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
18530 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
18540 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
18550 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  o *pInode;.  afp
18560 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
18570 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
18580 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
18590 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
185a0 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69  ntext;.  int ski
185b0 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66  pShared = 0;.#if
185c0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
185d0 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d    int h = pFile-
185e0 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  >h;.#endif..  as
185f0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
18600 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
18610 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
18620 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61  %d,%d) pid=%d (a
18630 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
18640 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
18650 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
18660 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
18670 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
18680 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
18690 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
186a0 20 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28         osGetpid(
186b0 30 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  0)));..  assert(
186c0 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
186d0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  ED_LOCK );.  if(
186e0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
186f0 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k<=eFileLock ){.
18700 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18710 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  E_OK;.  }.  unix
18720 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
18730 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
18740 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
18750 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
18760 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  d!=0 );.  if( pF
18770 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
18780 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
18790 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
187a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69  ->eFileLock==pFi
187b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
187c0 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
187d0 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
187e0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
187f0 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20  or( h=(-1) ).   
18800 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18810 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a  Benign(0);.    .
18820 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
18830 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  BUG.    /* When 
18840 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20  reducing a lock 
18850 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20  such that other 
18860 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74  processes can st
18870 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  art.    ** readi
18880 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
18890 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65  file again, make
188a0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20   sure that the. 
188b0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
188c0 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  n counter was up
188d0 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72  dated if any par
188e0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
188f0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68  e.    ** file ch
18900 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
18910 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
18920 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65  er is not update
18930 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  d,.    ** other 
18940 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74  connections to t
18950 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67  he same file mig
18960 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74  ht not realize t
18970 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  hat.    ** the f
18980 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20  ile has changed 
18990 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20  and hence might 
189a0 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73  not know to flus
189b0 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63  h their.    ** c
189c0 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f  ache.  The use o
189d0 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20  f a stale cache 
189e0 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
189f0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
18a00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
18a10 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  rt( pFile->inNor
18a20 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20  malWrite==0.    
18a30 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
18a40 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20  >dbUpdate==0.   
18a50 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
18a60 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d  ->transCntrChng=
18a70 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  =1 );.    pFile-
18a80 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
18a90 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a   0;.#endif.    .
18aa0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65      if( pFile->e
18ab0 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
18ac0 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
18ad0 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
18ae0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
18af0 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
18b00 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53  _FIRST, SHARED_S
18b10 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  IZE, 0);.      i
18b20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18b30 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   && (eFileLock==
18b40 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
18b50 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
18b60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
18b70 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73  only re-establis
18b80 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
18b90 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  k if necessary *
18ba0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68  /.        int sh
18bb0 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
18bc0 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
18bd0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
18be0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70          rc = afp
18bf0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18c00 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18c10 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
18c20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65  1, 1);.      } e
18c30 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b  lse {.        sk
18c40 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  ipShared = 1;.  
18c50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
18c60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18c70 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
18c80 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
18c90 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
18ca0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
18cb0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
18cc0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
18cd0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
18ce0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18cf0 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
18d00 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45  >eFileLock>=RESE
18d10 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e  RVED_LOCK && con
18d20 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29  text->reserved )
18d30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
18d40 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18d50 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18d60 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
18d70 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
18d80 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20  !rc ){ .        
18d90 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
18da0 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a  d = 0; .      }.
18db0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
18dc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
18dd0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
18de0 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
18df0 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20  ->nShared>1)){. 
18e00 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
18e10 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
18e20 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
18e30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18e40 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  _OK && eFileLock
18e50 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20  ==NO_LOCK ){..  
18e60 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
18e70 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63  he shared lock c
18e80 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65  ounter.  Release
18e90 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
18ea0 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c  an.    ** OS cal
18eb0 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20  l only when all 
18ec0 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20  threads in this 
18ed0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76  same process hav
18ee0 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
18ef0 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20  * the lock..    
18f00 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
18f10 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
18f20 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45  LockByte = SHARE
18f30 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
18f40 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20  sharedByte;.    
18f50 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d  pInode->nShared-
18f60 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
18f70 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b  e->nShared==0 ){
18f80 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
18f90 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
18fa0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
18fb0 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
18fc0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
18fd0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
18fe0 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70  .      if( !skip
18ff0 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20  Shared ){.      
19000 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
19010 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
19020 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64  h, pFile, shared
19030 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b  LockByte, 1, 0);
19040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
19050 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
19060 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
19070 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
19080 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
19090 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
190a0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
190b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
190c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
190d0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
190e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
190f0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  Inode->nLock>=0 
19100 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
19110 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
19120 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65  .        closePe
19130 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b  ndingFds(pFile);
19140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19150 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76   }.  .  unixLeav
19160 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
19170 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
19180 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
19190 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
191a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
191b0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
191c0 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73   & cleanup AFP s
191d0 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20  pecific locking 
191e0 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74  context .*/.stat
191f0 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28  ic int afpClose(
19200 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
19210 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
19220 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
19230 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
19240 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61  nixFile*)id;.  a
19250 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
19260 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20    afpUnlock(id, 
19270 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78  NO_LOCK);.  unix
19280 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
19290 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
192a0 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  e && pFile->pIno
192b0 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
192c0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
192d0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
192e0 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
192f0 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
19300 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79  le just.    ** y
19310 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
19320 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
19330 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
19340 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
19350 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
19360 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65  r to pInode->aPe
19370 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20  nding.  It will 
19380 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
19390 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20   closed when.   
193a0 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63   ** the last loc
193b0 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
193c0 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64    */.    setPend
193d0 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
193e0 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65  }.  releaseInode
193f0 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 73  Info(pFile);.  s
19400 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
19410 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
19420 74 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65  t);.  rc = close
19430 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
19440 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
19450 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19460 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
19470 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
19480 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
19490 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
194a0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  ./*.** The code 
194b0 61 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50  above is the AFP
194c0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
194d0 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20  tion.  The code 
194e0 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74  is specific.** t
194f0 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65  o MacOSX and doe
19500 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74  s not work on ot
19510 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72  her unix platfor
19520 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74  ms.  No alternat
19530 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  ive.** is availa
19540 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e  ble.  If you don
19550 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61  't compile for a
19560 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22   mac, then the "
19570 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53  unix-afp".** VFS
19580 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
19590 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
195a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
195b0 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  of the AFP lock 
195c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
195d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195e0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
195f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19630 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
19640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19680 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
19690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
196a0 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63  ** Begin NFS Loc
196b0 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
196c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
196d0 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  *****/..#if defi
196e0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
196f0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
19700 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
19710 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  . ** Lower the l
19720 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
19730 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19740 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
19750 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20  ck.  eFileLock. 
19760 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
19770 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
19780 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a  RED_LOCK.. **. *
19790 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
197a0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
197b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
197c0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
197d0 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71  elow. ** the req
197e0 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
197f0 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
19800 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ne is a no-op.. 
19810 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66  */.static int nf
19820 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  sUnlock(sqlite3_
19830 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
19840 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75  ileLock){.  retu
19850 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69  rn posixUnlock(i
19860 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29  d, eFileLock, 1)
19870 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
19880 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
19890 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
198a0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
198b0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
198c0 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
198d0 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
198e0 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
198f0 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
19900 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
19910 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
19920 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
19930 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
19940 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
19950 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a  ilable.  .**.***
19960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19970 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46  ** End of the NF
19980 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  S lock implement
19990 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
199a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
199b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
19a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
19a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
19a60 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74  on-locking sqlit
19a70 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20  e3_file methods 
19a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
19aa0 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76  .** The next div
19ab0 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69  ision contains i
19ac0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66  mplementations f
19ad0 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f  or all methods o
19ae0 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  f the .** sqlite
19af0 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74  3_file object ot
19b00 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63  her than the loc
19b10 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54  king methods.  T
19b20 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65  he locking.** me
19b30 74 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e  thods were defin
19b40 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20  ed in divisions 
19b50 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69  above (one locki
19b60 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a  ng method per.**
19b70 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f   division).  Tho
19b80 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  se methods that 
19b90 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  are common to al
19ba0 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a  l locking modes.
19bb0 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f  ** are gather to
19bc0 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73  gether into this
19bd0 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f   division..*/../
19be0 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
19bf0 20 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61   offset passed a
19c00 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
19c10 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64  ument, then read
19c20 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69   cnt .** bytes i
19c30 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e  nto pBuf. Return
19c40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
19c50 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
19c60 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49  ad..**.** NB:  I
19c70 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45  f you define USE
19c80 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52  _PREAD or USE_PR
19c90 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d  EAD64, then it m
19ca0 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20  ight also.** be 
19cb0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66  necessary to def
19cc0 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43  ine _XOPEN_SOURC
19cd0 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68  E to be 500.  Th
19ce0 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a  is varies from.*
19cf0 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20  * one system to 
19d00 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20  another.  Since 
19d10 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20  SQLite does not 
19d20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
19d30 0a 2a 2a 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20  .** in any form 
19d40 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77  by default, we w
19d50 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
19d60 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
19d70 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20  _SOURCE..** See 
19d80 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e  tickets #2741 an
19d90 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54  d #2681..**.** T
19da0 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
19db0 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
19dc0 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61   on a failed rea
19dd0 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  d the lastErrno 
19de0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
19df0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
19e00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19e10 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78  seekAndRead(unix
19e20 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  File *id, sqlite
19e30 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20  3_int64 offset, 
19e40 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
19e50 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
19e60 0a 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30  .  int prior = 0
19e70 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  ;.#if (!defined(
19e80 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64  USE_PREAD) && !d
19e90 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
19ea0 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66  64)).  i64 newOf
19eb0 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54  fset;.#endif.  T
19ec0 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73  IMER_START;.  as
19ed0 73 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26  sert( cnt==(cnt&
19ee0 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73  0x1ffff) );.  as
19ef0 73 65 72 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b  sert( id->h>2 );
19f00 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e  .  do{.#if defin
19f10 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
19f20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28    got = osPread(
19f30 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
19f40 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53  , offset);.    S
19f50 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
19f60 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69  got = -1 );.#eli
19f70 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
19f80 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d  EAD64).    got =
19f90 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68   osPread64(id->h
19fa0 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
19fb0 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  set);.    Simula
19fc0 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
19fd0 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20   -1 );.#else.   
19fe0 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
19ff0 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
1a000 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20  , SEEK_SET);.   
1a010 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1a020 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 2d 31  ( newOffset = -1
1a030 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f   );.    if( newO
1a040 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 20  ffset<0 ){.     
1a050 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1a060 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65  (unixFile*)id, e
1a070 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74  rrno);.      ret
1a080 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
1a090 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69    got = osRead(i
1a0a0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
1a0b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
1a0c0 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61   got==cnt ) brea
1a0d0 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30  k;.    if( got<0
1a0e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72   ){.      if( er
1a0f0 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f  rno==EINTR ){ go
1a100 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b  t = 1; continue;
1a110 20 7d 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d   }.      prior =
1a120 20 30 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   0;.      storeL
1a130 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69  astErrno((unixFi
1a140 6c 65 2a 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b  le*)id,  errno);
1a150 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a160 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e    }else if( got>
1a170 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d  0 ){.      cnt -
1a180 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66  = got;.      off
1a190 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20  set += got;.    
1a1a0 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a    prior += got;.
1a1b0 20 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f        pBuf = (vo
1a1c0 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72  id*)(got + (char
1a1d0 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  *)pBuf);.    }. 
1a1e0 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29   }while( got>0 )
1a1f0 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  ;.  TIMER_END;. 
1a200 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
1a210 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
1a220 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20  d %llu\n",.     
1a230 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f         id->h, go
1a240 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d  t+prior, offset-
1a250 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41  prior, TIMER_ELA
1a260 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e  PSED));.  return
1a270 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f   got+prior;.}../
1a280 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
1a290 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
1a2a0 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
1a2b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
1a2c0 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
1a2d0 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
1a2e0 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
1a2f0 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
1a300 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
1a310 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1a320 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  xRead(.  sqlite3
1a330 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f  _file *id, .  vo
1a340 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
1a350 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
1a360 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a  int64 offset.){.
1a370 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1a380 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
1a390 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  id;.  int got;. 
1a3a0 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
1a3b0 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
1a3c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1a3d0 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
1a3e0 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
1a3f0 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
1a400 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
1a410 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
1a420 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
1a430 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
1a440 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
1a450 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
1a460 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
1a470 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
1a480 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63  pFile->pPrealloc
1a490 61 74 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20  atedUnused==0.  
1a4a0 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
1a4b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
1a4c0 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1a4d0 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
1a4e0 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
1a4f0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
1a500 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f  _MMAP_SIZE>0.  /
1a510 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d  * Deal with as m
1a520 75 63 68 20 6f 66 20 74 68 69 73 20 72 65 61 64  uch of this read
1a530 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
1a540 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
1a550 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
1a560 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
1a570 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
1a580 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
1a590 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
1a5a0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
1a5b0 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
1a5c0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1a5d0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1a5e0 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70  pBuf, &((u8 *)(p
1a5f0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1a600 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29  ))[offset], amt)
1a610 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1a620 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1a630 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
1a640 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  Copy = pFile->mm
1a650 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  apSize - offset;
1a660 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42  .      memcpy(pB
1a670 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69  uf, &((u8 *)(pFi
1a680 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
1a690 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29  [offset], nCopy)
1a6a0 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
1a6b0 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
1a6c0 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
1a6d0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
1a6e0 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
1a6f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1a700 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e  ..  got = seekAn
1a710 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66  dRead(pFile, off
1a720 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  set, pBuf, amt);
1a730 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
1a740 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1a750 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
1a760 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
1a770 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73    /* lastErrno s
1a780 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61  et by seekAndRea
1a790 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  d */.    return 
1a7a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
1a7b0 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
1a7c0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
1a7d0 46 69 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e  File, 0);   /* n
1a7e0 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
1a7f0 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65  r */.    /* Unre
1a800 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  ad parts of the 
1a810 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a  buffer must be z
1a820 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ero-filled */.  
1a830 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72    memset(&((char
1a840 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c  *)pBuf)[got], 0,
1a850 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72   amt-got);.    r
1a860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1a870 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
1a880 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65   }.}../*.** Atte
1a890 6d 70 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20  mpt to seek the 
1a8a0 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
1a8b0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
1a8c0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a  rst argument to.
1a8d0 2a 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73  ** absolute offs
1a8e0 65 74 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74  et iOff, then at
1a8f0 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e  tempt to write n
1a900 42 75 66 20 62 79 74 65 73 20 6f 66 20 64 61 74  Buf bytes of dat
1a910 61 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74  a from.** pBuf t
1a920 6f 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  o it. If an erro
1a930 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
1a940 20 2d 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45   -1 and set *piE
1a950 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c  rrno. Otherwise,
1a960 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20   .** return the 
1a970 61 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66  actual number of
1a980 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 28   bytes written (
1a990 77 68 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73  which may be les
1a9a0 73 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e  s than.** nBuf).
1a9b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1a9c0 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20  eekAndWriteFd(. 
1a9d0 20 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20   int fd,        
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9f0 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
1aa00 74 6f 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20  tor to write to 
1aa10 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20  */.  i64 iOff,  
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa30 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66       /* File off
1aa40 73 65 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69  set to begin wri
1aa50 74 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e  ting at */.  con
1aa60 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  st void *pBuf,  
1aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aa80 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74  Copy data from t
1aa90 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 74 68  his buffer to th
1aaa0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
1aab0 6e 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  nBuf,           
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1aad0 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 42  ize of buffer pB
1aae0 75 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  uf in bytes */. 
1aaf0 20 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20   int *piErrno   
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab10 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e   /* OUT: Error n
1ab20 75 6d 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f  umber if error o
1ab30 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ccurs */.){.  in
1ab40 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
1ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ab60 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
1ab70 62 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  by system call *
1ab80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75  /..  assert( nBu
1ab90 66 3d 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66  f==(nBuf&0x1ffff
1aba0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ) );.  assert( f
1abb0 64 3e 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>2 );.  assert(
1abc0 20 70 69 45 72 72 6e 6f 21 3d 30 20 29 3b 0a 20   piErrno!=0 );. 
1abd0 20 6e 42 75 66 20 26 3d 20 30 78 31 66 66 66 66   nBuf &= 0x1ffff
1abe0 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  ;.  TIMER_START;
1abf0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
1ac00 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 72  E_PREAD).  do{ r
1ac10 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74  c = (int)osPwrit
1ac20 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  e(fd, pBuf, nBuf
1ac30 2c 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28  , iOff); }while(
1ac40 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
1ac50 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64  EINTR );.#elif d
1ac60 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1ac70 36 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28  64).  do{ rc = (
1ac80 69 6e 74 29 6f 73 50 77 72 69 74 65 36 34 28 66  int)osPwrite64(f
1ac90 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69  d, pBuf, nBuf, i
1aca0 4f 66 66 29 3b 7d 77 68 69 6c 65 28 20 72 63 3c  Off);}while( rc<
1acb0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
1acc0 52 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a  R);.#else.  do{.
1acd0 20 20 20 20 69 36 34 20 69 53 65 65 6b 20 3d 20      i64 iSeek = 
1ace0 6c 73 65 65 6b 28 66 64 2c 20 69 4f 66 66 2c 20  lseek(fd, iOff, 
1acf0 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53  SEEK_SET);.    S
1ad00 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1ad10 69 53 65 65 6b 20 3d 20 2d 31 20 29 3b 0a 20 20  iSeek = -1 );.  
1ad20 20 20 69 66 28 20 69 53 65 65 6b 3c 30 20 29 7b    if( iSeek<0 ){
1ad30 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a  .      rc = -1;.
1ad40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ad50 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 57 72   }.    rc = osWr
1ad60 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42  ite(fd, pBuf, nB
1ad70 75 66 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  uf);.  }while( r
1ad80 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
1ad90 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  NTR );.#endif.. 
1ada0 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53   TIMER_END;.  OS
1adb0 54 52 41 43 45 28 28 22 57 52 49 54 45 20 20 20  TRACE(("WRITE   
1adc0 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
1add0 6c 6c 75 5c 6e 22 2c 20 66 64 2c 20 72 63 2c 20  llu\n", fd, rc, 
1ade0 69 4f 66 66 2c 20 54 49 4d 45 52 5f 45 4c 41 50  iOff, TIMER_ELAP
1adf0 53 45 44 29 29 3b 0a 0a 20 20 69 66 28 20 72 63  SED));..  if( rc
1ae00 3c 30 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20  <0 ) *piErrno = 
1ae10 65 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  errno;.  return 
1ae20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65  rc;.}.../*.** Se
1ae30 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
1ae40 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74   in id->offset t
1ae50 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74  hen read cnt byt
1ae60 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a  es into pBuf..**
1ae70 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1ae80 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
1ae90 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61  ally read.  Upda
1aea0 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a  te the offset..*
1aeb0 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
1aec0 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
1aed0 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
1aee0 65 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73  ed write the las
1aef0 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
1af00 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
1af10 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
1af20 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72  ic int seekAndWr
1af30 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ite(unixFile *id
1af40 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f  , i64 offset, co
1af50 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
1af60 69 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65 74 75  int cnt){.  retu
1af70 72 6e 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46  rn seekAndWriteF
1af80 64 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  d(id->h, offset,
1af90 20 70 42 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d   pBuf, cnt, &id-
1afa0 3e 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a  >lastErrno);.}..
1afb0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74  ./*.** Write dat
1afc0 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
1afd0 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65  into a file.  Re
1afe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1aff0 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
1b000 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
1b010 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65   code on failure
1b020 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b030 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c  unixWrite(.  sql
1b040 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
1b050 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
1b060 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
1b070 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1b080 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69  offset .){.  uni
1b090 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1b0a0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
1b0b0 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20  int wrote = 0;. 
1b0c0 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
1b0d0 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
1b0e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1b0f0 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
1b100 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
1b110 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  l, master-journa
1b120 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66  l or temp.  ** f
1b130 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20  ile), the bytes 
1b140 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
1b150 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  ange should neve
1b160 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  r be read or wri
1b170 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  tten. */.#if 0. 
1b180 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
1b190 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
1b1a0 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  sed==0.       ||
1b1b0 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47   offset>=PENDING
1b1c0 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20  _BYTE+512.      
1b1d0 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d   || offset+amt<=
1b1e0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20  PENDING_BYTE .  
1b1f0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
1b200 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1b210 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
1b220 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69  ing a normal wri
1b230 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  te to a database
1b240 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65   file (as oppose
1b250 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20  d to.  ** doing 
1b260 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
1b270 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
1b280 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
1b290 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a  ther than a.  **
1b2a0 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
1b2b0 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f   file) then reco
1b2c0 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
1b2d0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1b2e0 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ** has changed. 
1b2f0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
1b300 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d  ion counter is m
1b310 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20  odified, record 
1b320 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74  that.  ** fact t
1b330 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  oo..  */.  if( p
1b340 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
1b350 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ite ){.    pFile
1b360 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20  ->dbUpdate = 1; 
1b370 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1b380 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
1b390 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66  ed */.    if( of
1b3a0 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73  fset<=24 && offs
1b3b0 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20  et+amt>=27 ){.  
1b3c0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1b3d0 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34    char oldCntr[4
1b3e0 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  ];.      Simulat
1b3f0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
1b400 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  );.      rc = se
1b410 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
1b420 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29   24, oldCntr, 4)
1b430 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1b440 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1b450 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1b460 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43  4 || memcmp(oldC
1b470 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42  ntr, &((char*)pB
1b480 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20  uf)[24-offset], 
1b490 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)!=0 ){.       
1b4a0 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
1b4b0 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54  rChng = 1;  /* T
1b4c0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1b4d0 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67  ounter has chang
1b4e0 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ed */.      }.  
1b4f0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1b500 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1b510 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54  TE_MMAP_READWRIT
1b520 45 29 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58  E) && SQLITE_MAX
1b530 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f  _MMAP_SIZE>0.  /
1b540 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d  * Deal with as m
1b550 75 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74  uch of this writ
1b560 65 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73  e request as pos
1b570 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65  sible by transfe
1b580 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66  ring.  ** data f
1b590 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d  rom the memory m
1b5a0 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d  apping using mem
1b5b0 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28  cpy().  */.  if(
1b5c0 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d   offset<pFile->m
1b5d0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
1b5e0 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  f( offset+amt <=
1b5f0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1b600 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
1b610 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d  (&((u8 *)(pFile-
1b620 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
1b630 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74  fset], pBuf, amt
1b640 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1b650 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1b660 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
1b670 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d  nCopy = pFile->m
1b680 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  mapSize - offset
1b690 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
1b6a0 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
1b6b0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
1b6c0 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79  et], pBuf, nCopy
1b6d0 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
1b6e0 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
1b6f0 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
1b700 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
1b710 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
1b720 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1b730 66 0a 20 0a 20 20 77 68 69 6c 65 28 20 28 77 72  f. .  while( (wr
1b740 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ote = seekAndWri
1b750 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  te(pFile, offset
1b760 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3c 61 6d  , pBuf, amt))<am
1b770 74 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a  t && wrote>0 ){.
1b780 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65      amt -= wrote
1b790 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  ;.    offset += 
1b7a0 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20  wrote;.    pBuf 
1b7b0 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  = &((char*)pBuf)
1b7c0 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53  [wrote];.  }.  S
1b7d0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28  imulateIOError((
1b7e0 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74   wrote=(-1), amt
1b7f0 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74  =1 ));.  Simulat
1b800 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28  eDiskfullError((
1b810 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20   wrote=0, amt=1 
1b820 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 77  ));..  if( amt>w
1b830 72 6f 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20  rote ){.    if( 
1b840 77 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65  wrote<0 && pFile
1b850 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f  ->lastErrno!=ENO
1b860 53 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  SPC ){.      /* 
1b870 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
1b880 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f   seekAndWrite */
1b890 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1b8a0 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
1b8b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b8c0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
1b8d0 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20  o(pFile, 0); /* 
1b8e0 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72  not a system err
1b8f0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  or */.      retu
1b900 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
1b910 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1b920 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b930 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1b940 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
1b950 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
1b960 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
1b970 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
1b980 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
1b990 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
1b9a0 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
1b9b0 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68   occurring at th
1b9c0 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a  e right times..*
1b9d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  /.int sqlite3_sy
1b9e0 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e  nc_count = 0;.in
1b9f0 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  t sqlite3_fullsy
1ba00 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  nc_count = 0;.#e
1ba10 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64  ndif../*.** We d
1ba20 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74  o not trust syst
1ba30 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61  ems to provide a
1ba40 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79   working fdatasy
1ba50 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a  nc().  Some do..
1ba60 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e  ** Others do no.
1ba70 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65    To be safe, we
1ba80 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68   will stick with
1ba90 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73   the (slightly s
1baa0 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28  lower).** fsync(
1bab0 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74  ). If you know t
1bac0 68 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20  hat your system 
1bad0 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61  does support fda
1bae0 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74  tasync() correct
1baf0 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70  ly,.** then simp
1bb00 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20  ly compile with 
1bb10 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74  -Dfdatasync=fdat
1bb20 61 73 79 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f  async or -DHAVE_
1bb30 46 44 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66  FDATASYNC.*/.#if
1bb40 20 21 64 65 66 69 6e 65 64 28 66 64 61 74 61 73   !defined(fdatas
1bb50 79 6e 63 29 20 26 26 20 21 48 41 56 45 5f 46 44  ync) && !HAVE_FD
1bb60 41 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  ATASYNC.# define
1bb70 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63   fdatasync fsync
1bb80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
1bb90 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
1bba0 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64  SYNC to 0 or 1 d
1bbb0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
1bbc0 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
1bbd0 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61  e F_FULLFSYNC ma
1bbe0 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20  cro is defined. 
1bbf0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20   F_FULLFSYNC is 
1bc00 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c  currently.** onl
1bc10 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d  y available on M
1bc20 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68  ac OS X.  But th
1bc30 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e  at could change.
1bc40 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c  .*/.#ifdef F_FUL
1bc50 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  LFSYNC.# define 
1bc60 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31  HAVE_FULLFSYNC 1
1bc70 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1bc80 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30  HAVE_FULLFSYNC 0
1bc90 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1bca0 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74  The fsync() syst
1bcb0 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74  em call does not
1bcc0 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69   work as adverti
1bcd0 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75  sed on many.** u
1bce0 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68  nix systems.  Th
1bcf0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63  e following proc
1bd00 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65  edure is an atte
1bd10 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69  mpt to make.** i
1bd20 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a  t work better..*
1bd30 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
1bd40 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69  NO_SYNC macro di
1bd50 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63  sables all fsync
1bd60 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ()s.  This is us
1bd70 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74  eful.** for test
1bd80 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74  ing when we want
1bd90 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20   to run through 
1bda0 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71  the test suite q
1bdb0 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61  uickly..** You a
1bdc0 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69  re strongly advi
1bdd0 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70  sed *not* to dep
1bde0 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f  loy with SQLITE_
1bdf0 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c  NO_SYNC.** enabl
1be00 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e  ed, however, sin
1be10 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  ce with SQLITE_N
1be20 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20  O_SYNC enabled, 
1be30 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f  an OS crash.** o
1be40 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  r power failure 
1be50 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72  will likely corr
1be60 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65  upt the database
1be70 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
1be80 69 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74  ite sets the dat
1be90 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68  aOnly flag if th
1bea0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
1beb0 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  le is unchanged.
1bec0 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68  .** The idea beh
1bed0 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20  ind dataOnly is 
1bee0 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f  that it should o
1bef0 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69  nly write the fi
1bf00 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f  le content.** to
1bf10 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69   disk, not the i
1bf20 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73  node.  We only s
1bf30 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74  et dataOnly if t
1bf40 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  he file size is 
1bf50 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69  .** unchanged si
1bf60 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  nce the file siz
1bf70 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
1bf80 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72   inode.  However
1bf90 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74  , .** Ted Ts'o t
1bfa0 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61  ells us that fda
1bfb0 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c  tasync() will al
1bfc0 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f  so write the ino
1bfd0 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c  de if the.** fil
1bfe0 65 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67  e size has chang
1bff0 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65  ed.  The only re
1c000 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  al difference be
1c010 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28  tween fdatasync(
1c020 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29  ).** and fsync()
1c030 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20  , Ted tells us, 
1c040 69 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e  is that fdatasyn
1c050 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75  c() will not flu
1c060 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20  sh the.** inode 
1c070 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20  if the mtime or 
1c080 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69  owner or other i
1c090 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20  node attributes 
1c0a0 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  have changed..**
1c0b0 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62   We only care ab
1c0c0 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a  out the file siz
1c0d0 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72  e, not the other
1c0e0 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73   file attributes
1c0f0 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61  , so.** as far a
1c100 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63  s SQLite is conc
1c110 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73  erned, an fdatas
1c120 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20  ync() is always 
1c130 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c  adequate..** So,
1c140 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66   we always use f
1c150 64 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74  datasync() if it
1c160 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
1c170 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20  egardless of.** 
1c180 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1c190 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a   dataOnly flag..
1c1a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75  */.static int fu
1c1b0 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c  ll_fsync(int fd,
1c1c0 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69   int fullSync, i
1c1d0 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20  nt dataOnly){.  
1c1e0 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
1c1f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64  e following "ifd
1c200 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62  ef/elif/else/" b
1c210 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d  lock has the sam
1c220 65 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20  e structure as. 
1c230 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f   ** the one belo
1c240 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61  w. It is replica
1c250 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20  ted here solely 
1c260 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72  to avoid clutter
1c270 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ing .  ** up the
1c280 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20   real code with 
1c290 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  the UNUSED_PARAM
1c2a0 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20  ETER() macros.. 
1c2b0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1c2c0 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53  E_NO_SYNC.  UNUS
1c2d0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
1c2e0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1c2f0 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a  ETER(fullSync);.
1c300 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1c310 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
1c320 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1c330 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
1c340 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
1c350 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
1c360 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79  PARAMETER(fullSy
1c370 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  nc);.  UNUSED_PA
1c380 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
1c390 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
1c3a0 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
1c3b0 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
1c3c0 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66  we do a normal f
1c3d0 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a  sync() and .  **
1c3e0 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73   FULLSYNC.  This
1c3f0 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
1c400 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66  testing to verif
1c410 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63  y that this proc
1c420 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20  edure.  ** gets 
1c430 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
1c440 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74  correct argument
1c450 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
1c460 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
1c470 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69   fullSync ) sqli
1c480 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
1c490 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt++;.  sqlite3_
1c4a0 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
1c4b0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
1c4c0 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
1c4d0 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
1c4e0 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
1c4f0 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
1c500 6f 2d 6f 70 2e 20 20 42 75 74 20 67 6f 20 61 68  o-op.  But go ah
1c510 65 61 64 20 61 6e 64 20 63 61 6c 6c 20 66 73 74  ead and call fst
1c520 61 74 28 29 20 74 6f 20 76 61 6c 69 64 61 74 65  at() to validate
1c530 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 64   the file.  ** d
1c540 65 73 63 72 69 70 74 6f 72 20 61 73 20 77 65 20  escriptor as we 
1c550 6e 65 65 64 20 61 20 6d 65 74 68 6f 64 20 74 6f  need a method to
1c560 20 70 72 6f 76 6f 6b 65 20 61 20 66 61 69 6c 75   provoke a failu
1c570 72 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 63  re during.  ** c
1c580 6f 76 65 72 61 74 65 20 74 65 73 74 69 6e 67 2e  overate testing.
1c590 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1c5a0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 7b 0a  ITE_NO_SYNC.  {.
1c5b0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
1c5c0 62 75 66 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73  buf;.    rc = os
1c5d0 46 73 74 61 74 28 66 64 2c 20 26 62 75 66 29 3b  Fstat(fd, &buf);
1c5e0 0a 20 20 7d 0a 23 65 6c 69 66 20 48 41 56 45 5f  .  }.#elif HAVE_
1c5f0 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20  FULLFSYNC.  if( 
1c600 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
1c610 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c  rc = osFcntl(fd,
1c620 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
1c630 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1c640 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20  c = 1;.  }.  /* 
1c650 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43  If the FULLFSYNC
1c660 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61   failed, fall ba
1c670 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67  ck to attempting
1c680 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a   an fsync()..  *
1c690 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62  * It shouldn't b
1c6a0 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66  e possible for f
1c6b0 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c  ullfsync to fail
1c6c0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20   on the local . 
1c6d0 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20   ** file system 
1c6e0 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69  (on OSX), so fai
1c6f0 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74  lure indicates t
1c700 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20  hat FULLFSYNC.  
1c710 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74  ** isn't support
1c720 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ed for this file
1c730 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74   system. So, att
1c740 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20  empt an fsync . 
1c750 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77   ** and (for now
1c760 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65  ) ignore the ove
1c770 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72  rhead of a super
1c780 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c  fluous fcntl cal
1c790 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62  l.  .  ** It'd b
1c7a0 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65  e better to dete
1c7b0 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70  ct fullfsync sup
1c7c0 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76  port once and av
1c7d0 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63  oid .  ** the fc
1c7e0 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74  ntl call every t
1c7f0 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c  ime sync is call
1c800 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ed..  */.  if( r
1c810 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66  c ) rc = fsync(f
1c820 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e  d);..#elif defin
1c830 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1c840 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f  /* fdatasync() o
1c850 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79  n HFS+ doesn't y
1c860 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c  et flush the fil
1c870 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61  e size if it cha
1c880 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  nged correctly. 
1c890 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79   ** so currently
1c8a0 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74   we default to t
1c8b0 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65  he macro that re
1c8c0 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e  defines fdatasyn
1c8d0 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a  c to fsync.  */.
1c8e0 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1c8f0 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20  ;.#else .  rc = 
1c900 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23  fdatasync(fd);.#
1c910 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1c920 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72  if( rc==-1 && er
1c930 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a  rno==ENOTSUP ){.
1c940 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66      rc = fsync(f
1c950 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  d);.  }.#endif /
1c960 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1c970 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20  #endif /* ifdef 
1c980 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
1c990 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1c9a0 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f  NC */..  if( OS_
1c9b0 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20  VXWORKS && rc!= 
1c9c0 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  -1 ){.    rc = 0
1c9d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1c9e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
1c9f0 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
1ca00 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  or to the direct
1ca10 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66  ory containing f
1ca20 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a  ile zFilename..*
1ca30 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1ca40 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
1ca50 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20  the opened file 
1ca60 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a  descriptor and.*
1ca70 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1ca80 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
1ca90 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74  rror occurs, eit
1caa0 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  her SQLITE_NOMEM
1cab0 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41  .** or SQLITE_CA
1cac0 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e  NTOPEN is return
1cad0 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73  ed and *pFd is s
1cae0 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e  et to an undefin
1caf0 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a  ed.** value..**.
1cb00 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79  ** The directory
1cb10 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1cb20 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c   is used for onl
1cb30 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f  y one thing - to
1cb40 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69  .** fsync() a di
1cb50 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20  rectory to make 
1cb60 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69  sure file creati
1cb70 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20  on and deletion 
1cb80 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c  events.** are fl
1cb90 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ushed to disk.  
1cba0 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20  Such fsyncs are 
1cbb0 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65  not needed on ne
1cbc0 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e  wer.** journalin
1cbd0 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62  g filesystems, b
1cbe0 75 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ut are required 
1cbf0 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73  on older filesys
1cc00 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tems..**.** This
1cc10 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1cc20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67  overridden using
1cc30 20 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c   the xSetSysCall
1cc40 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54   interface..** T
1cc50 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76  he ability to ov
1cc60 65 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74  erride this rout
1cc70 69 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e  ine was added in
1cc80 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a   support of the.
1cc90 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64  ** chromium sand
1cca0 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20  box.  Opening a 
1ccb0 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73  directory is a s
1ccc0 65 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65  ecurity risk (we
1ccd0 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f   are.** told) so
1cce0 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72   making it overr
1ccf0 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74  ideable allows t
1cd00 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64  he chromium sand
1cd10 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63  box to.** replac
1cd20 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1cd30 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e  ith a harmless n
1cd40 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74  o-op.  To make t
1cd50 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
1cd60 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20   no-op, replace 
1cd70 69 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74  it with a stub t
1cd80 68 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49  hat returns SQLI
1cd90 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73  TE_OK but leaves
1cda0 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20  .** *pFd set to 
1cdb0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
1cdc0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  r..**.** If SQLI
1cdd0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1cde0 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  d, the caller is
1cdf0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1ce00 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20   closing.** the 
1ce10 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1ce20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65  *pFd using close
1ce30 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1ce40 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  t openDirectory(
1ce50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1ce60 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29  ename, int *pFd)
1ce70 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
1ce80 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61  t fd = -1;.  cha
1ce90 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50  r zDirname[MAX_P
1cea0 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73  ATHNAME+1];..  s
1ceb0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1cec0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44  MAX_PATHNAME, zD
1ced0 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46  irname, "%s", zF
1cee0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  ilename);.  for(
1cef0 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  ii=(int)strlen(z
1cf00 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 30 20 26  Dirname); ii>0 &
1cf10 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d  & zDirname[ii]!=
1cf20 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66  '/'; ii--);.  if
1cf30 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44  ( ii>0 ){.    zD
1cf40 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30  irname[ii] = '\0
1cf50 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ';.  }else{.    
1cf60 69 66 28 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 21  if( zDirname[0]!
1cf70 3d 27 2f 27 20 29 20 7a 44 69 72 6e 61 6d 65 5b  ='/' ) zDirname[
1cf80 30 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7a 44  0] = '.';.    zD
1cf90 69 72 6e 61 6d 65 5b 31 5d 20 3d 20 30 3b 0a 20  irname[1] = 0;. 
1cfa0 20 7d 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74   }.  fd = robust
1cfb0 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20  _open(zDirname, 
1cfc0 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52  O_RDONLY|O_BINAR
1cfd0 59 2c 20 30 29 3b 0a 20 20 69 66 28 20 66 64 3e  Y, 0);.  if( fd>
1cfe0 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
1cff0 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64  E(("OPENDIR %-3d
1d000 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72   %s\n", fd, zDir
1d010 6e 61 6d 65 29 29 3b 0a 20 20 7d 0a 20 20 2a 70  name));.  }.  *p
1d020 46 64 20 3d 20 66 64 3b 0a 20 20 69 66 28 20 66  Fd = fd;.  if( f
1d030 64 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  d>=0 ) return SQ
1d040 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72  LITE_OK;.  retur
1d050 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1d060 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
1d070 4b 50 54 2c 20 22 6f 70 65 6e 44 69 72 65 63 74  KPT, "openDirect
1d080 6f 72 79 22 2c 20 7a 44 69 72 6e 61 6d 65 29 3b  ory", zDirname);
1d090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1d0a0 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74  ure all writes t
1d0b0 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66  o a particular f
1d0c0 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65  ile are committe
1d0d0 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
1d0e0 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20   If dataOnly==0 
1d0f0 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69  then both the fi
1d100 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74  le itself and it
1d110 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65  s metadata (file
1d120 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73  .** size, access
1d130 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20   time, etc) are 
1d140 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61  synced.  If data
1d150 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c  Only!=0 then onl
1d160 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61  y the.** file da
1d170 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  ta is synced..**
1d180 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20  .** Under Unix, 
1d190 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  also make sure t
1d1a0 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72  hat the director
1d1b0 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
1d1c0 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e  file.** has been
1d1d0 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e   created by fsyn
1d1e0 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74  c-ing the direct
1d1f0 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ory that contain
1d200 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49  s the file..** I
1d210 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74  f we do not do t
1d220 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75  his and we encou
1d230 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69  nter a power fai
1d240 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74  lure, the direct
1d250 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72  ory.** entry for
1d260 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
1d270 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74  ht not exist aft
1d280 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54  er we reboot.  T
1d290 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74  he next.** SQLit
1d2a0 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  e to access the 
1d2b0 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e  file will not kn
1d2c0 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ow that the jour
1d2d0 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61  nal exists (beca
1d2e0 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  use.** the direc
1d2f0 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74  tory entry for t
1d300 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e  he journal was n
1d310 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e  ever created) an
1d320 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
1d330 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f  n.** will not ro
1d340 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62  ll back - possib
1d350 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61  ly leading to da
1d360 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1d370 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1d380 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65   unixSync(sqlite
1d390 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
1d3a0 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63  flags){.  int rc
1d3b0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
1d3c0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
1d3d0 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61  )id;..  int isDa
1d3e0 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26  taOnly = (flags&
1d3f0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
1d400 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46  ONLY);.  int isF
1d410 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73  ullsync = (flags
1d420 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
1d430 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20  YNC_FULL;..  /* 
1d440 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f  Check that one o
1d450 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  f SQLITE_SYNC_NO
1d460 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73  RMAL or FULL was
1d470 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73   passed */.  ass
1d480 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29  ert((flags&0x0F)
1d490 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  ==SQLITE_SYNC_NO
1d4a0 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66  RMAL.      || (f
1d4b0 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1d4c0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29  TE_SYNC_FULL.  )
1d4d0 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e  ;..  /* Unix can
1d4e0 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79  not, but some sy
1d4f0 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e  stems may return
1d500 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f   SQLITE_FULL fro
1d510 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a  m here. This.  *
1d520 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73  * line is to tes
1d530 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20  t that doing so 
1d540 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61  does not cause a
1d550 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
1d560 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  /.  SimulateDisk
1d570 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72  fullError( retur
1d580 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b  n SQLITE_FULL );
1d590 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
1d5a0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
1d5b0 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22  "SYNC    %-3d\n"
1d5c0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
1d5d0 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28  rc = full_fsync(
1d5e0 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c  pFile->h, isFull
1d5f0 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79  sync, isDataOnly
1d600 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1d610 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
1d620 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74  if( rc ){.    st
1d630 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
1d640 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
1d650 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1d660 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1d670 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73  _FSYNC, "full_fs
1d680 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
1d690 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  th);.  }..  /* A
1d6a0 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69  lso fsync the di
1d6b0 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
1d6c0 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20 74  ng the file if t
1d6d0 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a  he DIRSYNC flag.
1d6e0 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68    ** is set.  Th
1d6f0 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65  is is a one-time
1d700 20 6f 63 63 75 72 72 65 6e 63 65 2e 20 20 4d 61   occurrence.  Ma
1d710 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d  ny systems (exam
1d720 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20  ples: AIX).  ** 
1d730 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73  are unable to fs
1d740 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c  ync a directory,
1d750 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72   so ignore error
1d760 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a  s on the fsync..
1d770 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
1d780 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
1d790 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29  IXFILE_DIRSYNC )
1d7a0 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b  {.    int dirfd;
1d7b0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
1d7c0 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f  IRSYNC %s (have_
1d7d0 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c  fullfsync=%d ful
1d7e0 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46  lsync=%d)\n", pF
1d7f0 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20  ile->zPath,.    
1d800 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c          HAVE_FUL
1d810 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79  LFSYNC, isFullsy
1d820 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f  nc));.    rc = o
1d830 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70  sOpenDirectory(p
1d840 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69  File->zPath, &di
1d850 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rfd);.    if( rc
1d860 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d870 20 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28       full_fsync(
1d880 64 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  dirfd, 0, 0);.  
1d890 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
1d8a0 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f  (pFile, dirfd, _
1d8b0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65  _LINE__);.    }e
1d8c0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1d8d0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  t( rc==SQLITE_CA
1d8e0 4e 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20  NTOPEN );.      
1d8f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d900 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d      }.    pFile-
1d910 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55  >ctrlFlags &= ~U
1d920 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b  NIXFILE_DIRSYNC;
1d930 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1d940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
1d950 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  ate an open file
1d960 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
1d970 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  size.*/.static i
1d980 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28  nt unixTruncate(
1d990 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1d9a0 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
1d9b0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1d9c0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
1d9d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
1d9e0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
1d9f0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1da00 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
1da10 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29  IOERR_TRUNCATE )
1da20 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75  ;..  /* If the u
1da30 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72  ser has configur
1da40 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20  ed a chunk-size 
1da50 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74  for this file, t
1da60 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a  runcate the.  **
1da70 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74   file so that it
1da80 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20   consists of an 
1da90 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
1daa0 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74  f chunks (i.e. t
1dab0 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66  he.  ** actual f
1dac0 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ile size after t
1dad0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79  he operation may
1dae0 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
1daf0 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20  the requested.  
1db00 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20  ** size)..  */. 
1db10 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
1db20 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79  unk>0 ){.    nBy
1db30 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70  te = ((nByte + p
1db40 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20  File->szChunk - 
1db50 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  1)/pFile->szChun
1db60 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
1db70 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  unk;.  }..  rc =
1db80 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
1db90 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  e(pFile->h, nByt
1dba0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
1dbb0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1dbc0 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
1dbd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69  ;.    return uni
1dbe0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1dbf0 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
1dc00 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46   "ftruncate", pF
1dc10 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
1dc20 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
1dc30 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
1dc40 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1dc50 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
1dc60 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
1dc70 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74  le (as opposed t
1dc80 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61  o.    ** doing a
1dc90 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1dca0 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
1dcb0 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
1dcc0 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a  her than a.    *
1dcd0 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
1dce0 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74  e file) and we t
1dcf0 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
1dd00 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c   to zero length,
1dd10 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66  .    ** that eff
1dd20 65 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73  ectively updates
1dd30 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1dd40 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74  ter.  This might
1dd50 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77   happen.    ** w
1dd60 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20  hen restoring a 
1dd70 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74  database using t
1dd80 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72  he backup API fr
1dd90 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  om a zero-length
1dda0 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a  .    ** source..
1ddb0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1ddc0 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
1ddd0 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20  ite && nByte==0 
1dde0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1ddf0 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
1de00 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
1de10 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1de20 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20  MMAP_SIZE>0.    
1de30 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
1de40 61 73 20 6a 75 73 74 20 74 72 75 6e 63 61 74 65  as just truncate
1de50 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c  d to a size smal
1de60 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ler than the cur
1de70 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61  rently.    ** ma
1de80 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64  pped region, red
1de90 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76  uce the effectiv
1dea0 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61  e mapping size a
1deb0 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77  s well. SQLite w
1dec0 69 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20 72  ill.    ** use r
1ded0 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65 28  ead() and write(
1dee0 29 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61  ) to access data
1def0 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69   beyond this poi
1df00 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20  nt from now on. 
1df10 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
1df20 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d   nByte<pFile->mm
1df30 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
1df40 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1df50 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23  = nByte;.    }.#
1df60 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72  endif..    retur
1df70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1df80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
1df90 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
1dfa0 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
1dfb0 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
1dfc0 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69  c int unixFileSi
1dfd0 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1dfe0 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  *id, i64 *pSize)
1dff0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74  {.  int rc;.  st
1e000 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
1e010 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
1e020 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28   rc = osFstat(((
1e030 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
1e040 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c  , &buf);.  Simul
1e050 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
1e060 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20   );.  if( rc!=0 
1e070 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  ){.    storeLast
1e080 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a  Errno((unixFile*
1e090 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  )id, errno);.   
1e0a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1e0b0 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a  OERR_FSTAT;.  }.
1e0c0 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73    *pSize = buf.s
1e0d0 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68  t_size;..  /* Wh
1e0e0 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72  en opening a zer
1e0f0 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c  o-size database,
1e100 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e   the findInodeIn
1e110 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20  fo() procedure. 
1e120 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e   ** writes a sin
1e130 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68  gle byte into th
1e140 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  at file in order
1e150 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
1e160 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68  a bug.  ** in th
1e170 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c  e OS-X msdos fil
1e180 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64  esystem.  In ord
1e190 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62  er to avoid prob
1e1a0 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a  lems with upper.
1e1b0 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20    ** layers, we 
1e1c0 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  need to report t
1e1d0 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73  his file size as
1e1e0 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67   zero even thoug
1e1f0 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61  h it is.  ** rea
1e200 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20  lly 1.   Ticket 
1e210 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  #3260..  */.  if
1e220 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70  ( *pSize==1 ) *p
1e230 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65  Size = 0;...  re
1e240 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e250 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
1e260 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1e270 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
1e280 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48  APPLE__)./*.** H
1e290 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79  andler for proxy
1e2a0 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f  -locking file-co
1e2b0 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65  ntrol verbs.  De
1e2c0 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74  fined below in t
1e2d0 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c  he.** proxying l
1e2e0 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e  ocking division.
1e2f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1e300 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  roxyFileControl(
1e310 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
1e320 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66  t,void*);.#endif
1e330 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75  ../* .** This fu
1e340 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1e350 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53   to handle the S
1e360 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
1e370 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63  _HINT .** file-c
1e380 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e  ontrol operation
1e390 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64  .  Enlarge the d
1e3a0 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65  atabase to nByte
1e3b0 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f  s in size.** (ro
1e3c0 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65 20  unded up to the 
1e3d0 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29  next chunk-size)
1e3e0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1e3f0 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  se is already.**
1e400 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65   nBytes or large
1e410 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
1e420 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1e430 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53  tatic int fcntlS
1e440 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65  izeHint(unixFile
1e450 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79   *pFile, i64 nBy
1e460 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65  te){.  if( pFile
1e470 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
1e480 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20     i64 nSize;   
1e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4a0 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c   /* Required fil
1e4b0 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74  e size */.    st
1e4c0 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 20 20  ruct stat buf;  
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1e4e0 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75  sed to hold retu
1e4f0 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74  rn values of fst
1e500 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20  at() */.   .    
1e510 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c  if( osFstat(pFil
1e520 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20  e->h, &buf) ){. 
1e530 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e540 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
1e550 20 20 20 20 7d 0a 0a 20 20 20 20 6e 53 69 7a 65      }..    nSize
1e560 20 3d 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65   = ((nByte+pFile
1e570 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70  ->szChunk-1) / p
1e580 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a  File->szChunk) *
1e590 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b   pFile->szChunk;
1e5a0 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28  .    if( nSize>(
1e5b0 69 36 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20  i64)buf.st_size 
1e5c0 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ){..#if defined(
1e5d0 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
1e5e0 43 41 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f  CATE) && HAVE_PO
1e5f0 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20  SIX_FALLOCATE.  
1e600 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
1e610 62 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e  below is handlin
1e620 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
1e630 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74  ue of osFallocat
1e640 65 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  e() .      ** co
1e650 72 72 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66  rrectly. posix_f
1e660 61 6c 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65  allocate() is de
1e670 66 69 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e  fined to "return
1e680 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  s zero on succes
1e690 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  s, .      ** or 
1e6a0 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20  an error number 
1e6b0 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65  on  failure". Se
1e6c0 65 20 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f  e the manpage fo
1e6d0 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20  r details. */.  
1e6e0 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20      int err;.   
1e6f0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65     do{.        e
1e700 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65  rr = osFallocate
1e710 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73  (pFile->h, buf.s
1e720 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75  t_size, nSize-bu
1e730 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20  f.st_size);.    
1e740 20 20 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45    }while( err==E
1e750 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66  INTR );.      if
1e760 28 20 65 72 72 20 29 20 72 65 74 75 72 6e 20 53  ( err ) return S
1e770 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
1e780 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f  E;.#else.      /
1e790 2a 20 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73  * If the OS does
1e7a0 20 6e 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f   not have posix_
1e7b0 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b  fallocate(), fak
1e7c0 65 20 69 74 2e 20 57 72 69 74 65 20 61 20 0a 20  e it. Write a . 
1e7d0 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62       ** single b
1e7e0 79 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20  yte to the last 
1e7f0 62 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f  byte in each blo
1e800 63 6b 20 74 68 61 74 20 66 61 6c 6c 73 20 65 6e  ck that falls en
1e810 74 69 72 65 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tirely.      ** 
1e820 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e  within the exten
1e830 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 65 6e  ded region. Then
1e840 2c 20 69 66 20 72 65 71 75 69 72 65 64 2c 20 61  , if required, a
1e850 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 20   single byte.   
1e860 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20     ** at offset 
1e870 28 6e 53 69 7a 65 2d 31 29 2c 20 74 6f 20 73 65  (nSize-1), to se
1e880 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
1e890 65 20 66 69 6c 65 20 63 6f 72 72 65 63 74 6c 79  e file correctly
1e8a0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
1e8b0 69 73 20 61 20 73 69 6d 69 6c 61 72 20 74 65 63  is a similar tec
1e8c0 68 6e 69 71 75 65 20 74 6f 20 74 68 61 74 20 75  hnique to that u
1e8d0 73 65 64 20 62 79 20 67 6c 69 62 63 20 6f 6e 20  sed by glibc on 
1e8e0 73 79 73 74 65 6d 73 0a 20 20 20 20 20 20 2a 2a  systems.      **
1e8f0 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76   that do not hav
1e900 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61  e a real falloca
1e910 74 65 28 29 20 63 61 6c 6c 2e 0a 20 20 20 20 20  te() call..     
1e920 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   */.      int nB
1e930 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73  lk = buf.st_blks
1e940 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79  ize;  /* File-sy
1e950 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20  stem block size 
1e960 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72  */.      int nWr
1e970 69 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ite = 0;        
1e980 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e990 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
1e9a0 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20  by seekAndWrite 
1e9b0 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57 72  */.      i64 iWr
1e9c0 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
1e9d0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66       /* Next off
1e9e0 73 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  set to write to 
1e9f0 2a 2f 0a 0a 20 20 20 20 20 20 69 57 72 69 74 65  */..      iWrite
1ea00 20 3d 20 28 62 75 66 2e 73 74 5f 73 69 7a 65 2f   = (buf.st_size/
1ea10 6e 42 6c 6b 29 2a 6e 42 6c 6b 20 2b 20 6e 42 6c  nBlk)*nBlk + nBl
1ea20 6b 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  k - 1;.      ass
1ea30 65 72 74 28 20 69 57 72 69 74 65 3e 3d 62 75 66  ert( iWrite>=buf
1ea40 2e 73 74 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20  .st_size );.    
1ea50 20 20 61 73 73 65 72 74 28 20 28 28 69 57 72 69    assert( ((iWri
1ea60 74 65 2b 31 29 25 6e 42 6c 6b 29 3d 3d 30 20 29  te+1)%nBlk)==0 )
1ea70 3b 0a 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e 6f  ;.      for(/*no
1ea80 2d 6f 70 2a 2f 3b 20 69 57 72 69 74 65 3c 6e 53  -op*/; iWrite<nS
1ea90 69 7a 65 2b 6e 42 6c 6b 2d 31 3b 20 69 57 72 69  ize+nBlk-1; iWri
1eaa0 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20 20 20  te+=nBlk ){.    
1eab0 20 20 20 20 69 66 28 20 69 57 72 69 74 65 3e 3d      if( iWrite>=
1eac0 6e 53 69 7a 65 20 29 20 69 57 72 69 74 65 20 3d  nSize ) iWrite =
1ead0 20 6e 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20   nSize - 1;.    
1eae0 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73 65 65      nWrite = see
1eaf0 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
1eb00 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29 3b   iWrite, "", 1);
1eb10 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 57 72  .        if( nWr
1eb20 69 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20  ite!=1 ) return 
1eb30 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
1eb40 54 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  TE;.      }.#end
1eb50 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  if.    }.  }..#i
1eb60 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1eb70 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70  P_SIZE>0.  if( p
1eb80 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
1eb90 78 3e 30 20 26 26 20 6e 42 79 74 65 3e 70 46 69  x>0 && nByte>pFi
1eba0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1ebb0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1ebc0 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1ebd0 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  nk<=0 ){.      i
1ebe0 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
1ebf0 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42  ate(pFile->h, nB
1ec00 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  yte) ){.        
1ec10 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
1ec20 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
1ec30 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
1ec40 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1ec50 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
1ec60 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46   "ftruncate", pF
1ec70 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1ec80 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1ec90 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65  rc = unixMapfile
1eca0 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a  (pFile, nByte);.
1ecb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ecc0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
1ecd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1ece0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ../*.** If *pArg
1ecf0 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65   is initially ne
1ed00 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73  gative then this
1ed10 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65   is a query.  Se
1ed20 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20  t *pArg to.** 1 
1ed30 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 0 depending o
1ed40 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
1ed50 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69   bit mask of pFi
1ed60 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73  le->ctrlFlags is
1ed70 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a   set..**.** If *
1ed80 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20  pArg is 0 or 1, 
1ed90 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65  then clear or se
1eda0 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f  t the mask bit o
1edb0 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
1edc0 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  gs..*/.static vo
1edd0 69 64 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75  id unixModeBit(u
1ede0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
1edf0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61  unsigned char ma
1ee00 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a  sk, int *pArg){.
1ee10 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b    if( *pArg<0 ){
1ee20 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46  .    *pArg = (pF
1ee30 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1ee40 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c   mask)!=0;.  }el
1ee50 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d  se if( (*pArg)==
1ee60 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
1ee70 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61  ctrlFlags &= ~ma
1ee80 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sk;.  }else{.   
1ee90 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1eea0 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d  s |= mask;.  }.}
1eeb0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1eec0 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74  laration */.stat
1eed0 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65  ic int unixGetTe
1eee0 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
1eef0 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f   char *zBuf);../
1ef00 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  *.** Information
1ef10 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20   and control of 
1ef20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  an open file han
1ef30 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
1ef40 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72  nt unixFileContr
1ef50 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
1ef60 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
1ef70 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78  d *pArg){.  unix
1ef80 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1ef90 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
1efa0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 23 69 66  witch( op ){.#if
1efb0 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78   defined(__linux
1efc0 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  __) && defined(S
1efd0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54  QLITE_ENABLE_BAT
1efe0 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29  CH_ATOMIC_WRITE)
1eff0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f000 5f 46 43 4e 54 4c 5f 42 45 47 49 4e 5f 41 54 4f  _FCNTL_BEGIN_ATO
1f010 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20  MIC_WRITE: {.   
1f020 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f     int rc = osIo
1f030 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32  ctl(pFile->h, F2
1f040 46 53 5f 49 4f 43 5f 53 54 41 52 54 5f 41 54 4f  FS_IOC_START_ATO
1f050 4d 49 43 5f 57 52 49 54 45 29 3b 0a 20 20 20 20  MIC_WRITE);.    
1f060 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51    return rc ? SQ
1f070 4c 49 54 45 5f 49 4f 45 52 52 5f 42 45 47 49 4e  LITE_IOERR_BEGIN
1f080 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45  _ATOMIC : SQLITE
1f090 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1f0a0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1f0b0 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57  _COMMIT_ATOMIC_W
1f0c0 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RITE: {.      in
1f0d0 74 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70  t rc = osIoctl(p
1f0e0 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f  File->h, F2FS_IO
1f0f0 43 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f  C_COMMIT_ATOMIC_
1f100 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20 72 65  WRITE);.      re
1f110 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45  turn rc ? SQLITE
1f120 5f 49 4f 45 52 52 5f 43 4f 4d 4d 49 54 5f 41 54  _IOERR_COMMIT_AT
1f130 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  OMIC : SQLITE_OK
1f140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f150 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 4f   SQLITE_FCNTL_RO
1f160 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49 43 5f 57 52  LLBACK_ATOMIC_WR
1f170 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ITE: {.      int
1f180 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46   rc = osIoctl(pF
1f190 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43  ile->h, F2FS_IOC
1f1a0 5f 41 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f  _ABORT_VOLATILE_
1f1b0 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20 72 65  WRITE);.      re
1f1c0 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45  turn rc ? SQLITE
1f1d0 5f 49 4f 45 52 52 5f 52 4f 4c 4c 42 41 43 4b 5f  _IOERR_ROLLBACK_
1f1e0 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f  ATOMIC : SQLITE_
1f1f0 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OK;.    }.#endif
1f200 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20 26 26   /* __linux__ &&
1f210 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42   SQLITE_ENABLE_B
1f220 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ATCH_ATOMIC_WRIT
1f230 45 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53  E */..    case S
1f240 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
1f250 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a  STATE: {.      *
1f260 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69  (int*)pArg = pFi
1f270 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  le->eFileLock;. 
1f280 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f290 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1f2a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1f2b0 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TL_LAST_ERRNO: {
1f2c0 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
1f2d0 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  rg = pFile->last
1f2e0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  Errno;.      ret
1f2f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f300 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1f310 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b  LITE_FCNTL_CHUNK
1f320 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70  _SIZE: {.      p
1f330 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20  File->szChunk = 
1f340 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20  *(int *)pArg;.  
1f350 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f360 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1f370 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f380 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20  L_SIZE_HINT: {. 
1f390 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
1f3a0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1f3b0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1f3c0 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a     rc = fcntlSiz
1f3d0 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69  eHint(pFile, *(i
1f3e0 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  64 *)pArg);.    
1f3f0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1f400 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1f410 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f420 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1f430 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
1f440 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e  _WAL: {.      un
1f450 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c  ixModeBit(pFile,
1f460 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
1f470 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72  T_WAL, (int*)pAr
1f480 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
1f490 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f4a0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1f4b0 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
1f4c0 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20  E_OVERWRITE: {. 
1f4d0 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74       unixModeBit
1f4e0 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45  (pFile, UNIXFILE
1f4f0 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72  _PSOW, (int*)pAr
1f500 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
1f510 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f520 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1f530 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a  E_FCNTL_VFSNAME:
1f540 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a   {.      *(char*
1f550 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
1f560 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70  _mprintf("%s", p
1f570 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d  File->pVfs->zNam
1f580 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1f590 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f5a0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1f5b0 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
1f5c0 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68  NAME: {.      ch
1f5d0 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c  ar *zTFile = sql
1f5e0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 70  ite3_malloc64( p
1f5f0 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  File->pVfs->mxPa
1f600 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20  thname );.      
1f610 69 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20  if( zTFile ){.  
1f620 20 20 20 20 20 20 75 6e 69 78 47 65 74 54 65 6d        unixGetTem
1f630 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66  pname(pFile->pVf
1f640 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a  s->mxPathname, z
1f650 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  TFile);.        
1f660 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
1f670 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  zTFile;.      }.
1f680 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f690 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1f6a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1f6b0 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a 20 7b  NTL_HAS_MOVED: {
1f6c0 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
1f6d0 72 67 20 3d 20 66 69 6c 65 48 61 73 4d 6f 76 65  rg = fileHasMove
1f6e0 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  d(pFile);.      
1f6f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f700 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  ;.    }.#if SQLI
1f710 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1f720 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  >0.    case SQLI
1f730 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
1f740 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20  ZE: {.      i64 
1f750 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34  newLimit = *(i64
1f760 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e  *)pArg;.      in
1f770 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f780 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c  ;.      if( newL
1f790 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62  imit>sqlite3Glob
1f7a0 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20  alConfig.mxMmap 
1f7b0 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69  ){.        newLi
1f7c0 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  mit = sqlite3Glo
1f7d0 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
1f7e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1f7f0 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
1f800 20 6e 65 77 4c 69 6d 69 74 20 6d 61 79 20 62 65   newLimit may be
1f810 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 73 74   eventually cast
1f820 20 74 6f 20 28 73 69 7a 65 5f 74 29 20 61 6e 64   to (size_t) and
1f830 20 70 61 73 73 65 64 0a 20 20 20 20 20 20 2a 2a   passed.      **
1f840 20 74 6f 20 6d 6d 61 70 28 29 2e 20 52 65 73 74   to mmap(). Rest
1f850 72 69 63 74 20 69 74 73 20 76 61 6c 75 65 20 74  rict its value t
1f860 6f 20 32 47 42 20 69 66 20 28 73 69 7a 65 5f 74  o 2GB if (size_t
1f870 29 20 69 73 20 6e 6f 74 20 61 74 20 6c 65 61 73  ) is not at leas
1f880 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 36 34 2d  t a.      ** 64-
1f890 62 69 74 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20  bit type. */.   
1f8a0 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
1f8b0 30 20 26 26 20 73 69 7a 65 6f 66 28 73 69 7a 65  0 && sizeof(size
1f8c0 5f 74 29 3c 38 20 29 7b 0a 20 20 20 20 20 20 20  _t)<8 ){.       
1f8d0 20 6e 65 77 4c 69 6d 69 74 20 3d 20 28 6e 65 77   newLimit = (new
1f8e0 4c 69 6d 69 74 20 26 20 30 78 37 46 46 46 46 46  Limit & 0x7FFFFF
1f8f0 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  FF);.      }..  
1f900 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20      *(i64*)pArg 
1f910 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1f920 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20  eMax;.      if( 
1f930 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e  newLimit>=0 && n
1f940 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e  ewLimit!=pFile->
1f950 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70  mmapSizeMax && p
1f960 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  File->nFetchOut=
1f970 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
1f980 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1f990 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 23 69 66   = newLimit;.#if
1f9a0 64 65 66 20 53 51 4c 49 54 45 5f 53 48 41 52 45  def SQLITE_SHARE
1f9b0 44 5f 4d 41 50 50 49 4e 47 0a 20 20 20 20 20 20  D_MAPPING.      
1f9c0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
1f9d0 6f 64 65 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a  ode==0 ).#endif.
1f9e0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c          if( pFil
1f9f0 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b  e->mmapSize>0 ){
1fa00 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 55  .          unixU
1fa10 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
1fa20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1fa30 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c  unixMapfile(pFil
1fa40 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  e, -1);.        
1fa50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1fa60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1fa70 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1fa80 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
1fa90 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c  /* The pager cal
1faa0 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74  ls this method t
1fab0 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74  o signal that it
1fac0 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a   has done.    **
1fad0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20   a rollback and 
1fae0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1faf0 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75  e is therefore u
1fb00 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20  nchanged and.   
1fb10 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20   ** it hence it 
1fb20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72  is OK for the tr
1fb30 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65  ansaction change
1fb40 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20   counter to be. 
1fb50 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e     ** unchanged.
1fb60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1fb70 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
1fb80 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20  _UNCHANGED: {.  
1fb90 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1fba0 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  id)->dbUpdate = 
1fbb0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
1fbc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1fbd0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
1fbe0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1fbf0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1fc00 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1fc10 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1fc20 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_SET_LOCKPROX
1fc30 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  YFILE:.    case 
1fc40 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54  SQLITE_FCNTL_GET
1fc50 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20  _LOCKPROXYFILE: 
1fc60 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1fc70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  roxyFileControl(
1fc80 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20  id,op,pArg);.   
1fc90 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1fca0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1fcb0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1fcc0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a  ned(__APPLE__) *
1fcd0 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  /.  }.  return S
1fce0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
1fcf0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 64 2d  }../*.** If pFd-
1fd00 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 6e  >sectorSize is n
1fd10 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 74 68 69  on-zero when thi
1fd20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1fd30 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 0a 2a 2a  lled, it is a.**
1fd40 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
1fd50 65 2c 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  e, the values of
1fd60 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65   pFd->sectorSize
1fd70 20 61 6e 64 20 0a 2a 2a 20 70 46 64 2d 3e 64 65   and .** pFd->de
1fd80 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1fd90 69 63 73 20 61 72 65 20 73 65 74 20 61 63 63 6f  ics are set acco
1fda0 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 69 6c  rding to the fil
1fdb0 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 63 68 61  e-system .** cha
1fdc0 72 61 63 74 65 72 69 73 74 69 63 73 2e 20 0a 2a  racteristics. .*
1fdd0 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74  *.** There are t
1fde0 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
1fdf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 6e  his function. On
1fe00 65 20 66 6f 72 20 51 4e 58 20 61 6e 64 20 6f 6e  e for QNX and on
1fe10 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6f 74 68  e for all.** oth
1fe20 65 72 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  er systems..*/.#
1fe30 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f  ifndef __QNXNTO_
1fe40 5f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  _.static void se
1fe50 74 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  tDeviceCharacter
1fe60 69 73 74 69 63 73 28 75 6e 69 78 46 69 6c 65 20  istics(unixFile 
1fe70 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74 28  *pFd){.  assert(
1fe80 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72   pFd->deviceChar
1fe90 61 63 74 65 72 69 73 74 69 63 73 3d 3d 30 20 7c  acteristics==0 |
1fea0 7c 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a  | pFd->sectorSiz
1feb0 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  e!=0 );.  if( pF
1fec0 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d 3d 30  d->sectorSize==0
1fed0 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   ){.#if defined(
1fee0 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65  __linux__) && de
1fef0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1ff00 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
1ff10 5f 57 52 49 54 45 29 0a 20 20 20 20 69 6e 74 20  _WRITE).    int 
1ff20 72 65 73 3b 0a 20 20 20 20 75 33 32 20 66 20 3d  res;.    u32 f =
1ff30 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   0;..    /* Chec
1ff40 6b 20 66 6f 72 20 73 75 70 70 6f 72 74 20 66 6f  k for support fo
1ff50 72 20 46 32 46 53 20 61 74 6f 6d 69 63 20 62 61  r F2FS atomic ba
1ff60 74 63 68 20 77 72 69 74 65 73 2e 20 2a 2f 0a 20  tch writes. */. 
1ff70 20 20 20 72 65 73 20 3d 20 6f 73 49 6f 63 74 6c     res = osIoctl
1ff80 28 70 46 64 2d 3e 68 2c 20 46 32 46 53 5f 49 4f  (pFd->h, F2FS_IO
1ff90 43 5f 47 45 54 5f 46 45 41 54 55 52 45 53 2c 20  C_GET_FEATURES, 
1ffa0 26 66 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  &f);.    if( res
1ffb0 3d 3d 30 20 26 26 20 28 66 20 26 20 46 32 46 53  ==0 && (f & F2FS
1ffc0 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d 49 43 5f  _FEATURE_ATOMIC_
1ffd0 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
1ffe0 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61  pFd->deviceChara
1fff0 63 74 65 72 69 73 74 69 63 73 20 3d 20 53 51 4c  cteristics = SQL
20000 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f  ITE_IOCAP_BATCH_
20010 41 54 4f 4d 49 43 3b 0a 20 20 20 20 7d 0a 23 65  ATOMIC;.    }.#e
20020 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f  ndif /* __linux_
20030 5f 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  _ && SQLITE_ENAB
20040 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f  LE_BATCH_ATOMIC_
20050 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20 20 2f 2a  WRITE */..    /*
20060 20 53 65 74 20 74 68 65 20 50 4f 57 45 52 53 41   Set the POWERSA
20070 46 45 5f 4f 56 45 52 57 52 49 54 45 20 66 6c 61  FE_OVERWRITE fla
20080 67 20 69 66 20 72 65 71 75 65 73 74 65 64 2e 20  g if requested. 
20090 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e  */.    if( pFd->
200a0 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
200b0 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20  FILE_PSOW ){.   
200c0 20 20 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68     pFd->deviceCh
200d0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 7c 3d  aracteristics |=
200e0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
200f0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
20100 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46  E;.    }..    pF
20110 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  d->sectorSize = 
20120 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
20130 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
20140 7d 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75 64 65  }.#else.#include
20150 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e 68   <sys/dcmd_blk.h
20160 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
20170 73 74 61 74 76 66 73 2e 68 3e 0a 73 74 61 74 69  statvfs.h>.stati
20180 63 20 76 6f 69 64 20 73 65 74 44 65 76 69 63 65  c void setDevice
20190 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
201a0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
201b0 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  {.  if( pFile->s
201c0 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29  ectorSize == 0 )
201d0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
201e0 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  tvfs fsInfo;.   
201f0 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20      .    /* Set 
20200 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e  defaults for non
20210 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65 73  -supported files
20220 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46  ystems */.    pF
20230 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
20240 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
20250 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
20260 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
20270 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
20280 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74 61   0;.    if( fsta
20290 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26  tvfs(pFile->h, &
202a0 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20  fsInfo) == -1 ) 
202b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
202c0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
202d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
202e0 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
202f0 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70  f_basetype, "tmp
20300 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ") ) {.      pFi
20310 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
20320 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
20330 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
20340 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
20350 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
20360 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
20370 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41  C4K |       /* A
20380 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  ll ram filesyste
20390 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
203a0 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
203b0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
203c0 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
203d0 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
203e0 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
203f0 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
20400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20410 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
20420 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
20430 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
20440 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
20450 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
20460 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
20470 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
20480 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
20490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
204b0 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
204c0 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
204d0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74   }else if( strst
204e0 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  r(fsInfo.f_baset
204f0 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a  ype, "etfs") ){.
20500 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
20510 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
20520 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
20530 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
20540 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
20550 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63         /* etfs c
20560 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74  luster size writ
20570 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
20580 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d  .        (pFile-
20590 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
205a0 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
205b0 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20  _ATOMIC512) |.  
205c0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
205d0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
205e0 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
205f0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
20600 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
20610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20630 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
20640 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
20650 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
20660 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
20670 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
20680 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
20690 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
206a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206c0 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
206d0 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
206e0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
206f0 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
20700 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e  .f_basetype, "qn
20710 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  x6") ){.      pF
20720 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
20730 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
20740 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
20750 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
20760 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
20770 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
20780 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20  IC |         /* 
20790 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77  All filesystem w
207a0 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
207b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
207c0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
207d0 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
207e0 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
207f0 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
20800 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
20810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20820 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
20830 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
20840 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
20850 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
20860 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
20870 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
20880 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
20890 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
208c0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
208d0 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
208e0 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
208f0 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
20900 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20  e, "qnx4") ){.  
20910 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
20920 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
20930 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
20940 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
20950 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
20960 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74       /* full bit
20970 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66  set of atomics f
20980 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73  rom max sector s
20990 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20  ize and smaller 
209a0 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69  */.        ((pFi
209b0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
209c0 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
209d0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c  CAP_ATOMIC512) <
209e0 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20  < 1) - 2 |.     
209f0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
20a00 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
20a10 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
20a20 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
20a30 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
20a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a60 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
20a70 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
20a80 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
20a90 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
20aa0 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22  _basetype, "dos"
20ab0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
20ac0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
20ad0 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
20ae0 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
20af0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
20b00 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
20b10 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
20b20 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
20b30 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
20b40 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
20b50 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
20b60 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
20b70 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
20b80 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
20b90 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
20ba0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
20bb0 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
20bc0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
20bd0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
20be0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c00 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
20c10 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
20c20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
20c30 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
20c40 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
20c50 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
20c60 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
20c70 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20  TOMIC512 |      
20c80 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74  /* blocks are at
20c90 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
20ca0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
20cb0 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
20cc0 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
20cd0 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
20ce0 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
20d10 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
20d20 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ds */.        0;
20d30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
20d40 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69  Last chance veri
20d50 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  fication.  If th
20d60 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
20d70 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  n't a multiple o
20d80 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20  f 512.  ** then 
20d90 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a  it isn't valid.*
20da0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
20db0 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20  ectorSize % 512 
20dc0 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  != 0 ){.    pFil
20dd0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
20de0 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  eristics = 0;.  
20df0 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
20e00 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
20e10 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
20e20 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
20e30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
20e40 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
20e50 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
20e60 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
20e70 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
20e80 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
20e90 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
20ea0 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
20eb0 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
20ec0 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
20ed0 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
20ee0 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
20ef0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
20f00 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
20f10 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
20f20 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
20f30 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
20f40 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
20f50 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
20f60 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
20f70 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
20f80 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
20f90 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
20fa0 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
20fb0 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
20fc0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
20fd0 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
20fe0 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
20ff0 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
21000 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
21010 73 65 74 44 65 76 69 63 65 43 68 61 72 61 63 74  setDeviceCharact
21020 65 72 69 73 74 69 63 73 28 70 46 64 29 3b 0a 20  eristics(pFd);. 
21030 20 72 65 74 75 72 6e 20 70 46 64 2d 3e 73 65 63   return pFd->sec
21040 74 6f 72 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  torSize;.}../*.*
21050 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
21060 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
21070 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ics for the file
21080 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53  ..**.** This VFS
21090 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72 65   is set up to re
210a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41  turn SQLITE_IOCA
210b0 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
210c0 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c 74  WRITE by default
210d0 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68  ..** However, th
210e0 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e  at choice is con
210f0 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63 65  troversial since
21100 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   technically the
21110 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66   underlying.** f
21120 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20  ile system does 
21130 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69  not always provi
21140 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65  de powersafe ove
21150 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74  rwrites.  (In ot
21160 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66  her.** words, af
21170 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73  ter a power-loss
21180 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66   event, parts of
21190 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
211a0 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69  ere never.** wri
211b0 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75  tten might end u
211c0 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e  p being altered.
211d0 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d  )  However, non-
211e0 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73  PSOW behavior is
211f0 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72   very,.** very r
21200 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74  are.  And assert
21210 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61  ing PSOW makes a
21220 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e   large reduction
21230 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a   in the amount.*
21240 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f  * of required I/
21250 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67  O for journaling
21260 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66  , since a lot of
21270 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d   padding is elim
21280 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63  inated..**  Henc
21290 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41  e, while POWERSA
212a0 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20  FE_OVERWRITE is 
212b0 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74  on by default, t
212c0 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63  here is a file-c
212d0 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61  ontrol.** availa
212e0 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f  ble to turn it o
212f0 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72 79  ff and URI query
21300 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c   parameter avail
21310 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
21320 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
21330 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61  nt unixDeviceCha
21340 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
21350 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
21360 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20    unixFile *pFd 
21370 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
21380 0a 20 20 73 65 74 44 65 76 69 63 65 43 68 61 72  .  setDeviceChar
21390 61 63 74 65 72 69 73 74 69 63 73 28 70 46 64 29  acteristics(pFd)
213a0 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 64 2d 3e  ;.  return pFd->
213b0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
213c0 73 74 69 63 73 3b 0a 7d 0a 0a 23 69 66 20 21 64  stics;.}..#if !d
213d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
213e0 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
213f0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
21400 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0../*.** Return 
21410 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65 20  the system page 
21420 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  size..**.** This
21430 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
21440 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 64   not be called d
21450 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65 72  irectly by other
21460 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69   code in this fi
21470 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c  le. .** Instead,
21480 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63 61   it should be ca
21490 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20 6f  lled via macro o
214a0 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e 0a  sGetpagesize()..
214b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
214c0 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
214d0 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  id){.#if OS_VXWO
214e0 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30 32  RKS.  return 102
214f0 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  4;.#elif defined
21500 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20 20  (_BSD_SOURCE).  
21510 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73 69  return getpagesi
21520 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65  ze();.#else.  re
21530 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e  turn (int)syscon
21540 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29 3b  f(_SC_PAGESIZE);
21550 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69  .#endif.}..#endi
21560 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
21570 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
21580 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
21590 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66  P_SIZE>0 */..#if
215a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
215b0 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  _WAL../*.** Obje
215c0 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ct used to repre
215d0 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d  sent an shared m
215e0 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a  emory buffer.  .
215f0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69  **.** When multi
21600 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
21610 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
21620 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61  me wal-index, ea
21630 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73  ch thread.** has
21640 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d   its own unixShm
21650 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65   object, but the
21660 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61  y all point to a
21670 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65   single instance
21680 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78  .** of this unix
21690 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20  ShmNode object. 
216a0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
216b0 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20   each wal-index 
216c0 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c  is opened.** onl
216d0 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
216e0 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75  ss..**.** Each u
216f0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
21700 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  t is connected t
21710 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49  o a single unixI
21720 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
21730 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61  .** We could coa
21740 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63  lesce this objec
21750 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65  t into unixInode
21760 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77  Info, but that w
21770 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65  ould mean.** eve
21780 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61  ry open file tha
21790 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73  t does not use s
217a0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e  hared memory (in
217b0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f   other words, mo
217c0 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73  st.** open files
217d0 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20  ) would have to 
217e0 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69  carry around thi
217f0 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  s extra informat
21800 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20  ion.  So.** the 
21810 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
21820 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  ject contains a 
21830 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
21840 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
21850 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e  ct.** and the un
21860 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
21870 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79   is created only
21880 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a   when needed..**
21890 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
218a0 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
218b0 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
218c0 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
218d0 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
218e0 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
218f0 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
21900 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
21910 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
21920 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
21930 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
21940 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
21950 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
21960 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
21970 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
21980 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
21990 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d  er unixShmNode.m
219a0 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
219b0 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65  d or unixShmNode
219c0 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20  .nRef==0 and.** 
219d0 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
219e0 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
219f0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
21a00 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
21a10 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
21a20 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
21a30 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20  unixShmNode {.  
21a40 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
21a50 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e  Inode;     /* un
21a60 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74  ixInodeInfo that
21a70 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e   owns this SHM n
21a80 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
21a90 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
21aa0 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
21ab0 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65  access this obje
21ac0 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ct */.  char *zF
21ad0 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
21ae0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
21af0 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  e mmapped file *
21b00 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
21b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21b20 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
21b30 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  riptor */.  int 
21b40 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  szRegion;       
21b50 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
21b60 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
21b70 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36  regions */.  u16
21b80 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20   nRegion;       
21b90 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
21ba0 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f  of array apRegio
21bb0 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64  n */.  u8 isRead
21bc0 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  only;           
21bd0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
21be0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72  d-only */.  char
21bf0 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20   **apRegion;    
21c00 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
21c10 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65 64  of mapped shared
21c20 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
21c30 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
21c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69  /* Number of uni
21c60 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  xShm objects poi
21c70 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
21c80 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72  .  unixShm *pFir
21c90 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
21ca0 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a   All unixShm obj
21cb0 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
21cc0 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20   this */.#ifdef 
21cd0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
21ce0 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  8 exclMask;     
21cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
21d00 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
21d10 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
21d20 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  8 sharedMask;   
21d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
21d40 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
21d50 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e  s held */.  u8 n
21d60 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20  extShmId;       
21d70 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
21d80 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d  vailable unixShm
21d90 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  .id value */.#en
21da0 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  dif.};../*.** St
21db0 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
21dc0 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
21dd0 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
21de0 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
21df0 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
21e00 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
21e10 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
21e20 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
21e30 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
21e40 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
21e50 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
21e60 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
21e70 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
21e80 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a   unixShm.pFile.*
21e90 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a  *    unixShm.id.
21ea0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
21eb0 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
21ec0 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78  write.  The unix
21ed0 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78  Shm.pFile->mutex
21ee0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
21ef0 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67   while accessing
21f00 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20   any read/write 
21f10 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63  fields..*/.struc
21f20 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e  t unixShm {.  un
21f30 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
21f40 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ode;     /* The 
21f50 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53  underlying unixS
21f60 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
21f70 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78  .  unixShm *pNex
21f80 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
21f90 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69   Next unixShm wi
21fa0 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78  th the same unix
21fb0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
21fc0 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
21fd0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
21fe0 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75  if holding the u
21ff0 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  nixShmNode mutex
22000 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20   */.  u8 id;    
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22020 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
22030 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e  onnection within
22040 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65   its unixShmNode
22050 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
22060 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
22070 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
22080 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
22090 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
220a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
220b0 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
220c0 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
220d0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
220e0 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
220f0 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
22100 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20   UNIX_SHM_BASE  
22110 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
22120 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
22130 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
22140 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
22150 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20   UNIX_SHM_DMS   
22160 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b   (UNIX_SHM_BASE+
22170 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
22180 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
22190 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
221a0 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73  pply posix advis
221b0 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
221c0 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73  l bytes from ofs
221d0 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e  t through ofst+n
221e0 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20  -1..**.** Locks 
221f0 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73  block if the mas
22200 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49  k is exactly UNI
22210 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20  X_SHM_C and are 
22220 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  non-blocking.** 
22230 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
22240 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
22250 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e  SystemLock(.  un
22260 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
22270 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e       /* Open con
22280 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 57  nection to the W
22290 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  AL file */.  int
222a0 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
222b0 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
222c0 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
222d0 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
222e0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
222f0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
22300 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
22310 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22330 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
22340 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
22350 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
22360 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c  ShmNode; /* Appl
22370 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
22380 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
22390 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
223a0 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20  struct flock f; 
223b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
223c0 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
223d0 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a  king structure *
223e0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
223f0 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
22400 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
22410 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
22420 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
22430 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
22440 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
22450 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
22460 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69    pShmNode = pFi
22470 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  le->pInode->pShm
22480 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
22490 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
224a0 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ld(pShmNode->mut
224b0 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d  ex) || pShmNode-
224c0 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
224d0 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e  * Shared locks n
224e0 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74  ever span more t
224f0 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a  han one byte */.
22500 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
22510 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44  | lockType!=F_RD
22520 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  LCK );..  /* Loc
22530 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ks are within ra
22540 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nge */.  assert(
22550 20 6e 3e 3d 31 20 26 26 20 6e 3c 3d 53 51 4c 49   n>=1 && n<=SQLI
22560 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
22570 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
22580 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >h>=0 ){.    /* 
22590 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
225a0 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
225b0 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  s */.    memset(
225c0 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29  &f, 0, sizeof(f)
225d0 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20  );.    f.l_type 
225e0 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20  = lockType;.    
225f0 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  f.l_whence = SEE
22600 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73  K_SET;.    f.l_s
22610 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20  tart = ofst;.   
22620 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20   f.l_len = n;.. 
22630 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
22640 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53  pShmNode->h, F_S
22650 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72  ETLK, &f);.    r
22660 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f  c = (rc!=(-1)) ?
22670 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
22680 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
22690 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67   /* Update the g
226a0 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  lobal lock state
226b0 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72   and do debug tr
226c0 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20  acing */.#ifdef 
226d0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
226e0 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54   u16 mask;.  OST
226f0 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
22700 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f 66  "));.  mask = of
22710 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66 20 3a  st>31 ? 0xffff :
22720 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d   (1<<(ofst+n)) -
22730 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66   (1<<ofst);.  if
22740 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22750 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  ){.    if( lockT
22760 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
22770 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
22780 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  unlock %d ok", o
22790 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
227a0 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
227b0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
227c0 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
227d0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
227e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63     }else if( loc
227f0 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  kType==F_RDLCK )
22800 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
22810 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f  ("read-lock %d o
22820 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
22830 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
22840 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
22850 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
22860 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
22870 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
22880 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
22890 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
228a0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
228b0 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f  "write-lock %d o
228c0 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
228d0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
228e0 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
228f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
22900 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
22910 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
22920 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  {.    if( lockTy
22930 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
22940 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75       OSTRACE(("u
22950 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  nlock %d failed"
22960 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65  , ofst));.    }e
22970 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
22980 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
22990 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
229a0 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29  d-lock failed"))
229b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
229c0 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54     assert( lockT
229d0 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a  ype==F_WRLCK );.
229e0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
229f0 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61  write-lock %d fa
22a00 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20  iled", ofst));. 
22a10 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
22a20 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61 72  CE((" - afterwar
22a30 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ds %03x,%03x\n",
22a40 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d  .           pShm
22a50 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
22a60 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c  , pShmNode->excl
22a70 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  Mask));.  }.#end
22a80 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
22a90 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a          .}../*.*
22aa0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69 6e  * Return the min
22ab0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 33  imum number of 3
22ac0 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e 73 20  2KB shm regions 
22ad0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 6d  that should be m
22ae0 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20 74 69  apped at.** a ti
22af0 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  me, assuming tha
22b00 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d  t each mapping m
22b10 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65 67 65  ust be an intege
22b20 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
22b30 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 79 73  e.** current sys
22b40 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a 2a  tem page-size..*
22b50 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68  *.** Usually, th
22b60 69 73 20 69 73 20 31 2e 20 54 68 65 20 65 78 63  is is 1. The exc
22b70 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f 20  eption seems to 
22b80 62 65 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  be systems that 
22b90 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a  are configured.*
22ba0 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20 70 61  * to use 64KB pa
22bb0 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20 63 61  ges - in this ca
22bc0 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20  se each mapping 
22bd0 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20 6c 65  must cover at le
22be0 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20 72  ast two.** shm r
22bf0 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  egions..*/.stati
22c00 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52 65 67  c int unixShmReg
22c10 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64 29 7b  ionPerMap(void){
22c20 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20 33  .  int shmsz = 3
22c30 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20 20 20  2*1024;         
22c40 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f 6e     /* SHM region
22c50 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 70   size */.  int p
22c60 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67 65 73  gsz = osGetpages
22c70 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79 73 74  ize();   /* Syst
22c80 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  em page size */.
22c90 20 20 61 73 73 65 72 74 28 20 28 28 70 67 73 7a    assert( ((pgsz
22ca0 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b 20  -1)&pgsz)==0 ); 
22cb0 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6d    /* Page size m
22cc0 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
22cd0 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70 67 73  f 2 */.  if( pgs
22ce0 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75 72 6e  z<shmsz ) return
22cf0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 67 73   1;.  return pgs
22d00 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  z/shmsz;.}../*.*
22d10 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69 78  * Purge the unix
22d20 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
22d30 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
22d40 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  with unixShmNode
22d50 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
22d60 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
22d70 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
22d80 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
22d90 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
22da0 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
22db0 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
22dc0 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
22dd0 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50  ic void unixShmP
22de0 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  urge(unixFile *p
22df0 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  Fd){.  unixShmNo
22e00 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e  de *p = pFd->pIn
22e10 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
22e20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
22e30 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
22e40 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d  ( p && ALWAYS(p-
22e50 3e 6e 52 65 66 3d 3d 30 29 20 29 7b 0a 20 20 20  >nRef==0) ){.   
22e60 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70 20   int nShmPerMap 
22e70 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50  = unixShmRegionP
22e80 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69 6e 74  erMap();.    int
22e90 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
22ea0 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e  p->pInode==pFd->
22eb0 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71  pInode );.    sq
22ec0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
22ed0 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  (p->mutex);.    
22ee0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
22ef0 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65  egion; i+=nShmPe
22f00 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69 66 28  rMap){.      if(
22f10 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
22f20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e      osMunmap(p->
22f30 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e  apRegion[i], p->
22f40 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
22f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22f60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
22f70 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20  apRegion[i]);.  
22f80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
22f90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
22fa0 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69  apRegion);.    i
22fb0 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
22fc0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
22fd0 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49  (pFd, p->h, __LI
22fe0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e  NE__);.      p->
22ff0 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
23000 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68    p->pInode->pSh
23010 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  mNode = 0;.    s
23020 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
23030 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
23040 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  n a shared-memor
23050 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65  y area associate
23060 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61  d with open data
23070 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e  base file pDbFd.
23080 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69    .** This parti
23090 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61  cular implementa
230a0 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65  tion uses mmappe
230b0 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  d files..**.** T
230c0 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20  he file used to 
230d0 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64  implement shared
230e0 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68  -memory is in th
230f0 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
23100 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20  .** as the open 
23110 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
23120 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  d has the same n
23130 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20  ame as the open 
23140 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
23150 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22   with the "-shm"
23160 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20 20   suffix added.  
23170 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
23180 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23190 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75  e.** is "/home/u
231a0 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20  ser1/config.db" 
231b0 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68  then the file th
231c0 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  at is created an
231d0 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72  d mmapped.** for
231e0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
231f0 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f  ill be called "/
23200 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
23210 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a  g.db-shm".  .**.
23220 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f  ** Another appro
23230 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65  ach to is to use
23240 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73   files in /dev/s
23250 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f  hm or /dev/tmp o
23260 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68  r an.** some oth
23270 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20  er tmpfs mount. 
23280 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e  But if a file in
23290 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69 72   a different dir
232a0 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74  ectory.** from t
232b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
232c0 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64   is used, then d
232d0 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73 20  iffering access 
232e0 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f  permissions.** o
232f0 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67  r a chroot() mig
23300 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69 66  ht cause two dif
23310 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73  ferent processes
23320 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
23330 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20  database to end 
23340 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72 65  up using differe
23350 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61  nt files for sha
23360 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a  red memory - .**
23370 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68   meaning that th
23380 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64  eir memory would
23390 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73   not really be s
233a0 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e  hared - resultin
233b0 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65  g.** in database
233c0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65   corruption.  Ne
233d0 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73  vertheless, this
233e0 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67   tmpfs file usag
233f0 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62  e.** can be enab
23400 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
23410 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ime using -DSQLI
23420 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
23430 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f  ="/dev/shm".** o
23440 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  r the equivalent
23450 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74 68  .  The use of th
23460 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
23470 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
23480 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65  ime.** option re
23490 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f  sults in an inco
234a0 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f  mpatible build o
234b0 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64  f SQLite;  build
234c0 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74  s of SQLite.** t
234d0 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72 69  hat with differi
234e0 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ng SQLITE_SHM_DI
234f0 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73  RECTORY settings
23500 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
23510 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61  the.** same data
23520 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
23530 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61   same time, data
23540 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
23550 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
23560 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54  esult. The SQLIT
23570 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
23580 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
23590 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ion is considere
235a0 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65  d.** "unsupporte
235b0 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77  d" and may go aw
235c0 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20 53  ay in a future S
235d0 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a  QLite release..*
235e0 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
235f0 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d  g a new shared-m
23600 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e  emory file, if n
23610 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65  o other instance
23620 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c  s of that.** fil
23630 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
23640 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72  open, in this pr
23650 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65  ocess or in othe
23660 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65  r processes, the
23670 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75  n.** the file mu
23680 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  st be truncated 
23690 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f  to zero length o
236a0 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65  r have its heade
236b0 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  r cleared..**.**
236c0 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
236d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
236e0 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67 20  pDbFd) is using 
236f0 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20  the "unix-excl" 
23700 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e  VFS.** that mean
23710 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73  s that an exclus
23720 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ive lock is held
23730 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
23740 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61   file and.** tha
23750 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
23760 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f  sses are able to
23770 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
23780 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  he database.  In
23790 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77  .** that case, w
237a0 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e do not really 
237b0 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f  need shared memo
237c0 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d  ry.  No shared m
237d0 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73  emory.** file is
237e0 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 73   created.  The s
237f0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
23800 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77  l be simulated w
23810 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e  ith heap memory.
23820 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
23830 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
23840 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
23850 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75  bFd){.  struct u
23860 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20  nixShm *p = 0;  
23870 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
23880 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
23890 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
238a0 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ct unixShmNode *
238b0 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54  pShmNode;   /* T
238c0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
238d0 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
238e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
238f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23900 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
23910 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
23920 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20  o *pInode;      
23930 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65      /* The inode
23940 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72   of fd */.  char
23950 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20   *zShmFilename; 
23960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23970 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
23980 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a  used for SHM */.
23990 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61    int nShmFilena
239a0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
239b0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
239c0 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e   SHM filename in
239d0 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20   bytes */..  /* 
239e0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
239f0 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53  or the new unixS
23a00 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  hm object. */.  
23a10 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
23a20 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 29  oc64( sizeof(*p)
23a30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
23a40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
23a50 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d  OMEM_BKPT;.  mem
23a60 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
23a70 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (*p));.  assert(
23a80 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
23a90 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
23aa0 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78 53  o see if a unixS
23ab0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c  hmNode object al
23ac0 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 52 65  ready exists. Re
23ad0 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
23ae0 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73    ** one if pres
23af0 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65  ent. Create a ne
23b00 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
23b10 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ry..  */.  unixE
23b20 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
23b30 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
23b40 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64  Inode;.  pShmNod
23b50 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  e = pInode->pShm
23b60 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d  Node;.  if( pShm
23b70 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Node==0 ){.    s
23b80 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
23b90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23ba0 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66    /* fstat() inf
23bb0 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  o for database f
23bc0 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ile */.#ifndef S
23bd0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
23be0 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ORY.    const ch
23bf0 61 72 20 2a 7a 42 61 73 65 50 61 74 68 20 3d 20  ar *zBasePath = 
23c00 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a 23 65  pDbFd->zPath;.#e
23c10 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 61 6c  ndif..    /* Cal
23c20 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66 69 67  l fstat() to fig
23c30 75 72 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d  ure out the perm
23c40 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64  issions on the d
23c50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
23c60 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d  .    ** a new *-
23c70 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61  shm file is crea
23c80 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20  ted, an attempt 
23c90 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
23ca0 63 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a 2a  create it.    **
23cb0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70   with the same p
23cc0 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20  ermissions..    
23cd0 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74  */.    if( osFst
23ce0 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53  at(pDbFd->h, &sS
23cf0 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  tat) ){.      rc
23d00 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
23d10 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74  FSTAT;.      got
23d20 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
23d30 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
23d40 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
23d50 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  RY.    nShmFilen
23d60 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c  ame = sizeof(SQL
23d70 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
23d80 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20  Y) + 31;.#else. 
23d90 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
23da0 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72 6c 65  = 6 + (int)strle
23db0 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a 23 65  n(zBasePath);.#e
23dc0 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
23dd0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
23de0 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 53  oc64( sizeof(*pS
23df0 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69  hmNode) + nShmFi
23e00 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66  lename );.    if
23e10 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b  ( pShmNode==0 ){
23e20 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
23e30 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
23e40 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
23e50 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
23e60 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64    memset(pShmNod
23e70 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53  e, 0, sizeof(*pS
23e80 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65  hmNode)+nShmFile
23e90 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d 46  name);.    zShmF
23ea0 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f  ilename = pShmNo
23eb0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  de->zFilename = 
23ec0 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65  (char*)&pShmNode
23ed0 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  [1];.#ifdef SQLI
23ee0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
23ef0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
23f00 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61  rintf(nShmFilena
23f10 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  me, zShmFilename
23f20 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
23f30 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53          SQLITE_S
23f40 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73  HM_DIRECTORY "/s
23f50 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22  qlite-shm-%x-%x"
23f60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23f70 20 20 20 20 20 20 20 28 75 33 32 29 73 53 74 61         (u32)sSta
23f80 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73  t.st_ino, (u32)s
23f90 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65  Stat.st_dev);.#e
23fa0 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  lse.    sqlite3_
23fb0 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c  snprintf(nShmFil
23fc0 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e  ename, zShmFilen
23fd0 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 7a  ame, "%s-shm", z
23fe0 42 61 73 65 50 61 74 68 29 3b 0a 20 20 20 20 73  BasePath);.    s
23ff0 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
24000 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20  3(pDbFd->zPath, 
24010 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23  zShmFilename);.#
24020 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f  endif.    pShmNo
24030 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20  de->h = -1;.    
24040 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
24050 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
24060 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  de;.    pShmNode
24070 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64  ->pInode = pDbFd
24080 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 66  ->pInode;.    if
24090 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
240a0 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
240b0 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f   ){.      pShmNo
240c0 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
240d0 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
240e0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
240f0 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  T);.      if( pS
24100 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30  hmNode->mutex==0
24110 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
24120 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
24130 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  PT;.        goto
24140 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
24150 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
24160 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50    if( pInode->bP
24170 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
24180 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46  .      int openF
24190 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
241a0 4f 5f 43 52 45 41 54 3b 0a 20 20 20 20 20 20 69  O_CREAT;.      i
241b0 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
241c0 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50  oolean(pDbFd->zP
241d0 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73  ath, "readonly_s
241e0 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  hm", 0) ){.     
241f0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f     openFlags = O
24200 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  _RDONLY;.       
24210 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
24220 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  donly = 1;.     
24230 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64   }.      pShmNod
24240 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70  e->h = robust_op
24250 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  en(zShmFilename,
24260 20 6f 70 65 6e 46 6c 61 67 73 2c 20 28 73 53 74   openFlags, (sSt
24270 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29  at.st_mode&0777)
24280 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  );.      if( pSh
24290 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20  mNode->h<0 ){.  
242a0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
242b0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
242c0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
242d0 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  pen", zShmFilena
242e0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
242f0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
24300 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
24310 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73  * If this proces
24320 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20  s is running as 
24330 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65 20  root, make sure 
24340 74 68 61 74 20 74 68 65 20 53 48 4d 20 66 69 6c  that the SHM fil
24350 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 77  e.      ** is ow
24360 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20  ned by the same 
24370 75 73 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74  user that owns t
24380 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
24390 62 61 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  base.  Otherwise
243a0 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f  ,.      ** the o
243b0 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69  riginal owner wi
243c0 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ll not be able t
243d0 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20  o connect..     
243e0 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74   */.      robust
243f0 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d  Fchown(pShmNode-
24400 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64  >h, sStat.st_uid
24410 2c 20 73 53 74 61 74 2e 73 74 5f 67 69 64 29 3b  , sStat.st_gid);
24420 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  .  .      /* Che
24430 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ck to see if ano
24440 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
24450 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64  holding the dead
24460 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20  -man switch..   
24470 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72     ** If not, tr
24480 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
24490 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20  to zero length. 
244a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
244b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
244c0 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 53 68        if( unixSh
244d0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46  mSystemLock(pDbF
244e0 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58  d, F_WRLCK, UNIX
244f0 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51  _SHM_DMS, 1)==SQ
24500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24510 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74     if( robust_ft
24520 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65  runcate(pShmNode
24530 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ->h, 0) ){.     
24540 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
24550 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
24560 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74  ERR_SHMOPEN, "ft
24570 72 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69  runcate", zShmFi
24580 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
24590 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
245a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
245b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
245c0 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
245d0 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44  Lock(pDbFd, F_RD
245e0 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
245f0 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  S, 1);.      }. 
24600 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
24610 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
24620 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
24630 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f   Make the new co
24640 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64  nnection a child
24650 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e   of the unixShmN
24660 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d  ode */.  p->pShm
24670 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
24680 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
24690 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70  EBUG.  p->id = p
246a0 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d  ShmNode->nextShm
246b0 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  Id++;.#endif.  p
246c0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b  ShmNode->nRef++;
246d0 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
246e0 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d   p;.  unixLeaveM
246f0 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68  utex();..  /* Th
24700 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
24710 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61  t on pShmNode ha
24720 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  s already been i
24730 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72  ncremented under
24740 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20  .  ** the cover 
24750 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  of the unixEnter
24760 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e  Mutex() mutex an
24770 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72  d the pointer fr
24780 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20  om the.  ** new 
24790 28 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29  (struct unixShm)
247a0 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70   object to the p
247b0 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e  ShmNode has been
247c0 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69   set. All that i
247d0 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64  s.  ** left to d
247e0 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  o is to link the
247f0 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f   new object into
24800 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
24810 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61   starting.  ** a
24820 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  t pShmNode->pFir
24830 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65  st. This must be
24840 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64   done while hold
24850 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65  ing the pShmNode
24860 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75  ->mutex .  ** mu
24870 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  tex..  */.  sqli
24880 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
24890 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
248a0 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
248b0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
248c0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  .  pShmNode->pFi
248d0 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  rst = p;.  sqlit
248e0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
248f0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
24900 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24910 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
24920 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
24930 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
24940 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67  r:.  unixShmPurg
24950 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20  e(pDbFd);       
24960 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
24970 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72  es pShmNode if r
24980 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c  equired */.  sql
24990 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
249a0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
249b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
249c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
249d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
249e0 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
249f0 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
24a00 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
24a10 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
24a20 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
24a30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24a40 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
24a50 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
24a60 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
24a70 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
24a80 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
24a90 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
24aa0 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
24ab0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
24ac0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
24ad0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
24ae0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
24af0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
24b00 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
24b10 77 69 73 65 2c 20 69 66 20 74 68 65 20 62 45 78  wise, if the bEx
24b20 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  tend parameter i
24b30 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
24b40 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
24b50 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
24b60 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
24b70 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
24b80 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
24b90 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
24ba0 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
24bb0 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
24bc0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
24bd0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
24be0 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78  rned. If .** bEx
24bf0 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  tend is non-zero
24c00 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
24c10 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
24c20 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
24c30 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
24c40 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
24c50 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
24c60 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
24c70 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
24c80 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
24c90 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
24ca0 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
24cb0 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
24cc0 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
24cd0 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
24ce0 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
24cf0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
24d00 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
24d10 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
24d20 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
24d30 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
24d40 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
24d50 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
24d60 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
24d70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
24d80 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  ixShmMap(.  sqli
24d90 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
24da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
24db0 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
24dc0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
24dd0 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
24de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24df0 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
24e00 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
24e10 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
24e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24e30 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
24e40 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c  /.  int bExtend,
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e60 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
24e70 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
24e80 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
24e90 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
24ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24eb0 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
24ec0 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  ry */.){.  unixF
24ed0 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e  ile *pDbFd = (un
24ee0 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e  ixFile*)fd;.  un
24ef0 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78  ixShm *p;.  unix
24f00 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
24f10 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
24f20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
24f30 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78  ShmPerMap = unix
24f40 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28  ShmRegionPerMap(
24f50 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52 65 67  );.  int nReqReg
24f60 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ion;..  /* If th
24f70 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
24f80 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
24f90 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
24fa0 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
24fb0 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  if( pDbFd->pShm=
24fc0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75  =0 ){.    rc = u
24fd0 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
24fe0 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
24ff0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25000 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
25010 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d   }..  p = pDbFd-
25020 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64  >pShm;.  pShmNod
25030 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
25040 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
25050 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
25060 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
25070 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68  t( szRegion==pSh
25080 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
25090 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
250a0 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  gion==0 );.  ass
250b0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
250c0 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
250d0 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
250e0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
250f0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
25100 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
25110 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
25120 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
25130 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
25140 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
25150 29 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  );..  /* Minimum
25160 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 6f   number of regio
25170 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 62  ns required to b
25180 65 20 6d 61 70 70 65 64 2e 20 2a 2f 0a 20 20 6e  e mapped. */.  n
25190 52 65 71 52 65 67 69 6f 6e 20 3d 20 28 28 69 52  ReqRegion = ((iR
251a0 65 67 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61 70  egion+nShmPerMap
251b0 29 20 2f 20 6e 53 68 6d 50 65 72 4d 61 70 29 20  ) / nShmPerMap) 
251c0 2a 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 0a 20  * nShmPerMap;.. 
251d0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
251e0 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f  Region<nReqRegio
251f0 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  n ){.    char **
25200 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
25210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25220 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72  ew apRegion[] ar
25230 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ray */.    int n
25240 42 79 74 65 20 3d 20 6e 52 65 71 52 65 67 69 6f  Byte = nReqRegio
25250 6e 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 20 2f 2a  n*szRegion;   /*
25260 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65   Minimum require
25270 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
25280 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
25290 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
252a0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79        /* Used by
252b0 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20   fstat() */..   
252c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67   pShmNode->szReg
252d0 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a  ion = szRegion;.
252e0 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
252f0 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  e->h>=0 ){.     
25300 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
25310 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
25320 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
25330 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
25340 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20  ss space..      
25350 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
25360 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61  if it has been a
25370 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69  llocated (i.e. i
25380 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
25390 66 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  file is.      **
253a0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
253b0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71   contain the req
253c0 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a  uested region)..
253d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
253e0 66 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e  f( osFstat(pShmN
253f0 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20  ode->h, &sStat) 
25400 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
25410 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
25420 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f  SIZE;.        go
25430 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
25440 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
25450 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69   if( sStat.st_si
25460 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  ze<nByte ){.    
25470 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
25480 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
25490 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
254a0 74 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69 73  t. If bExtend is
254b0 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20   set to.        
254c0 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65  ** false, exit e
254d0 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62  arly. *pp will b
254e0 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  e set to NULL an
254f0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
25500 72 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  rned..        */
25510 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 62 45  .        if( !bE
25520 78 74 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  xtend ){.       
25530 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
25540 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
25550 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72          /* Alter
25560 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78  natively, if bEx
25570 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20 65 78  tend is true, ex
25580 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 44  tend the file. D
25590 6f 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20  o this by.      
255a0 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 61 20 73    ** writing a s
255b0 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68  ingle byte to th
255c0 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 28 4f  e end of each (O
255d0 53 29 20 70 61 67 65 20 62 65 69 6e 67 0a 20 20  S) page being.  
255e0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
255f0 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64 2e 20  ed or extended. 
25600 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20  Technically, we 
25610 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69 74 65 20  need only write 
25620 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
25630 2a 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 6f  * last page in o
25640 72 64 65 72 20 74 6f 20 65 78 74 65 6e 64 20 74  rder to extend t
25650 68 65 20 66 69 6c 65 2e 20 42 75 74 20 77 72 69  he file. But wri
25660 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e 65 77 0a  ting to all new.
25670 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73          ** pages
25680 20 66 6f 72 63 65 73 20 74 68 65 20 4f 53 20 74   forces the OS t
25690 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 20  o allocate them 
256a0 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77 68 69  immediately, whi
256b0 63 68 20 72 65 64 75 63 65 73 0a 20 20 20 20 20  ch reduces.     
256c0 20 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 63 65     ** the chance
256d0 73 20 6f 66 20 53 49 47 42 55 53 20 77 68 69 6c  s of SIGBUS whil
256e0 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
256f0 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6c 61  mapped region la
25700 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20  ter on..        
25710 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c 73 65 7b  */.        else{
25720 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
25730 63 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a  c const int pgsz
25740 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 20 20 20   = 4096;.       
25750 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a 20 20 20     int iPg;..   
25760 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
25770 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  to the last byte
25780 20 6f 66 20 65 61 63 68 20 6e 65 77 6c 79 20 61   of each newly a
25790 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65  llocated or exte
257a0 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  nded page */.   
257b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
257c0 6e 42 79 74 65 20 25 20 70 67 73 7a 29 3d 3d 30  nByte % pgsz)==0
257d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   );.          fo
257e0 72 28 69 50 67 3d 28 73 53 74 61 74 2e 73 74 5f  r(iPg=(sStat.st_
257f0 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69 50 67 3c  size/pgsz); iPg<
25800 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b 20 69 50  (nByte/pgsz); iP
25810 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
25820 20 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20    int x = 0;.   
25830 20 20 20 20 20 20 20 20 20 69 66 28 20 73 65 65           if( see
25840 6b 41 6e 64 57 72 69 74 65 46 64 28 70 53 68 6d  kAndWriteFd(pShm
25850 4e 6f 64 65 2d 3e 68 2c 20 69 50 67 2a 70 67 73  Node->h, iPg*pgs
25860 7a 20 2b 20 70 67 73 7a 2d 31 2c 20 22 22 2c 20  z + pgsz-1, "", 
25870 31 2c 20 26 78 29 21 3d 31 20 29 7b 0a 20 20 20  1, &x)!=1 ){.   
25880 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
25890 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 70   char *zFile = p
258a0 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
258b0 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
258c0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
258d0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
258e0 5f 53 48 4d 53 49 5a 45 2c 20 22 77 72 69 74 65  _SHMSIZE, "write
258f0 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20  ", zFile);.     
25900 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
25910 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
25920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25930 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
25940 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
25950 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71    /* Map the req
25960 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
25970 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70  gion into this p
25980 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
25990 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61   space. */.    a
259a0 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29  pNew = (char **)
259b0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
259c0 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
259d0 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 6e 52 65  e->apRegion, nRe
259e0 71 52 65 67 69 6f 6e 2a 73 69 7a 65 6f 66 28 63  qRegion*sizeof(c
259f0 68 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20  har *).    );.  
25a00 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a    if( !apNew ){.
25a10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25a20 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
25a30 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  PT;.      goto s
25a40 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
25a50 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  }.    pShmNode->
25a60 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77  apRegion = apNew
25a70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68  ;.    while( pSh
25a80 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e  mNode->nRegion<n
25a90 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  ReqRegion ){.   
25aa0 20 20 20 69 6e 74 20 6e 4d 61 70 20 3d 20 73 7a     int nMap = sz
25ab0 52 65 67 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61  Region*nShmPerMa
25ac0 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  p;.      int i;.
25ad0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d        void *pMem
25ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d  ;.      if( pShm
25af0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
25b00 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d        pMem = osM
25b10 6d 61 70 28 30 2c 20 6e 4d 61 70 2c 0a 20 20 20  map(0, nMap,.   
25b20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
25b30 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20  e->isReadonly ? 
25b40 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54  PROT_READ : PROT
25b50 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45  _READ|PROT_WRITE
25b60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d  , .            M
25b70 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e  AP_SHARED, pShmN
25b80 6f 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e  ode->h, szRegion
25b90 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e  *(i64)pShmNode->
25ba0 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20  nRegion.        
25bb0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
25bc0 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20  Mem==MAP_FAILED 
25bd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
25be0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
25bf0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
25c00 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d  AP, "mmap", pShm
25c10 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
25c20 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
25c30 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
25c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
25c50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  lse{.        pMe
25c60 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  m = sqlite3_mall
25c70 6f 63 36 34 28 73 7a 52 65 67 69 6f 6e 29 3b 0a  oc64(szRegion);.
25c80 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d          if( pMem
25c90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
25ca0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
25cb0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
25cc0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
25cd0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
25ce0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d         memset(pM
25cf0 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29  em, 0, szRegion)
25d00 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
25d10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 68 6d   for(i=0; i<nShm
25d20 50 65 72 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20 20  PerMap; i++){.  
25d30 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
25d40 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  apRegion[pShmNod
25d50 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69 5d 20 3d 20  e->nRegion+i] = 
25d60 26 28 28 63 68 61 72 2a 29 70 4d 65 6d 29 5b 73  &((char*)pMem)[s
25d70 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20  zRegion*i];.    
25d80 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f    }.      pShmNo
25d90 64 65 2d 3e 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e  de->nRegion += n
25da0 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 7d  ShmPerMap;.    }
25db0 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75  .  }..shmpage_ou
25dc0 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  t:.  if( pShmNod
25dd0 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69  e->nRegion>iRegi
25de0 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20  on ){.    *pp = 
25df0 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
25e00 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d  on[iRegion];.  }
25e10 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20  else{.    *pp = 
25e20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68  0;.  }.  if( pSh
25e30 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
25e40 79 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  y && rc==SQLITE_
25e50 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  OK ) rc = SQLITE
25e60 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c  _READONLY;.  sql
25e70 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
25e80 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
25e90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
25ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
25eb0 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
25ec0 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
25ed0 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a  ry segment..**.*
25ee0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
25ef0 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74  relationship bet
25f00 77 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20  ween SHAREd and 
25f10 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
25f20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64  is a little.** d
25f30 69 66 66 65 72 65 6e 74 20 68 65 72 65 20 74 68  ifferent here th
25f40 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e  an in posix.  In
25f50 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65   xShmLock(), one
25f60 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c   can go from unl
25f70 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72  ocked.** to shar
25f80 65 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66  ed and back or f
25f90 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
25fa0 65 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61  exclusive and ba
25fb0 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79  ck.  But one may
25fc0 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20  .** not go from 
25fd0 73 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73  shared to exclus
25fe0 69 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c  ive or from excl
25ff0 75 73 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e  usive to shared.
26000 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
26010 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  nixShmLock(.  sq
26020 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
26030 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
26040 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
26050 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
26060 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ory */.  int ofs
26070 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
26080 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63      /* First loc
26090 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  k to acquire or 
260a0 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
260b0 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
260c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
260d0 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63  r of locks to ac
260e0 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
260f0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
26100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26110 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
26120 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  ith the lock */.
26130 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
26140 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  DbFd = (unixFile
26150 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f  *)fd;      /* Co
26160 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67  nnection holding
26170 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
26180 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  /.  unixShm *p =
26190 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20   pDbFd->pShm;   
261a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
261b0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
261c0 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  eing locked */. 
261d0 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20   unixShm *pX;   
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261f0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
26200 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73  oping over all s
26210 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69  iblings */.  uni
26220 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
26230 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
26240 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c  ;  /* The underl
26250 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20  ying file iNode 
26260 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
26270 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
26280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26290 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75  sult code */.  u
262a0 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  16 mask;        
262b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262c0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
262d0 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72  locks to take or
262e0 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61   release */..  a
262f0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d  ssert( pShmNode=
26300 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e  =pDbFd->pInode->
26310 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73  pShmNode );.  as
26320 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
26330 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
26340 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  Inode );.  asser
26350 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66  t( ofst>=0 && of
26360 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d  st+n<=SQLITE_SHM
26370 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  _NLOCK );.  asse
26380 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  rt( n>=1 );.  as
26390 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51  sert( flags==(SQ
263a0 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
263b0 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
263c0 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
263d0 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
263e0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
263f0 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
26400 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
26410 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
26420 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
26430 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
26440 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
26450 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
26460 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
26470 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
26480 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==1 || (flags & 
26490 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
264a0 53 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73  SIVE)!=0 );.  as
264b0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
264c0 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  h>=0 || pDbFd->p
264d0 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
264e0 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ock==1 );.  asse
264f0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c  rt( pShmNode->h<
26500 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
26510 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
26520 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d  ==0 );..  mask =
26530 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d   (1<<(ofst+n)) -
26540 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73   (1<<ofst);.  as
26550 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73  sert( n>1 || mas
26560 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a  k==(1<<ofst) );.
26570 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
26580 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
26590 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c  mutex);.  if( fl
265a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
265b0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  _UNLOCK ){.    u
265c0 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20  16 allMask = 0; 
265d0 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
265e0 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
265f0 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65  s */..    /* See
26600 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73   if any siblings
26610 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20   hold this same 
26620 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28  lock */.    for(
26630 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
26640 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
26650 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
26660 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
26670 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
26680 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
26690 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70  & (p->exclMask|p
266a0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d  ->sharedMask))==
266b0 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61  0 );.      allMa
266c0 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  sk |= pX->shared
266d0 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
266e0 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73   /* Unlock the s
266f0 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
26700 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61  s */.    if( (ma
26710 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30  sk & allMask)==0
26720 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
26730 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
26740 28 70 44 62 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c  (pDbFd, F_UNLCK,
26750 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42   ofst+UNIX_SHM_B
26760 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  ASE, n);.    }el
26770 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
26780 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
26790 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65  .    /* Undo the
267a0 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a   local locks */.
267b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
267c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
267d0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
267e0 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68  ask;.      p->sh
267f0 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
26800 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73  k;.    } .  }els
26810 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
26820 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20  LITE_SHM_SHARED 
26830 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68  ){.    u16 allSh
26840 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e  ared = 0;  /* Un
26850 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ion of locks hel
26860 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d by connections
26870 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20   other than "p" 
26880 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20  */..    /* Find 
26890 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64  out which shared
268a0 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61   locks are alrea
268b0 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69  dy held by sibli
268c0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a  ng connections..
268d0 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69      ** If any si
268e0 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f  bling already ho
268f0 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  lds an exclusive
26900 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20   lock, go ahead 
26910 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a  and return.    *
26920 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  * SQLITE_BUSY.. 
26930 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58     */.    for(pX
26940 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
26950 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
26960 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
26970 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
26980 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
26990 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
269a0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
269b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
269c0 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20     allShared |= 
269d0 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
269e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
269f0 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  t shared locks a
26a00 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
26a10 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  el, if necessary
26a20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
26a30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26a40 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65     if( (allShare
26a50 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a  d & mask)==0 ){.
26a60 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
26a70 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
26a80 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f  DbFd, F_RDLCK, o
26a90 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
26aa0 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  E, n);.      }el
26ab0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
26ac0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
26ad0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
26ae0 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  * Get the local 
26af0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a  shared locks */.
26b00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26b10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
26b20 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
26b30 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
26b40 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  lse{.    /* Make
26b50 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67   sure no sibling
26b60 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c   connections hol
26b70 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c  d locks that wil
26b80 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20  l block this.   
26b90 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e   ** lock.  If an
26ba0 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c  y do, return SQL
26bb0 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61  ITE_BUSY right a
26bc0 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  way..    */.    
26bd0 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
26be0 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
26bf0 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
26c00 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
26c10 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c  ask & mask)!=0 |
26c20 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  | (pX->sharedMas
26c30 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
26c40 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26c50 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
26c60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
26c70 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
26c80 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   Get the exclusi
26c90 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ve locks at the 
26ca0 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54  system level.  T
26cb0 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75  hen if successfu
26cc0 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61  l.    ** also ma
26cd0 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  rk the local con
26ce0 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67  nection as being
26cf0 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a   locked..    */.
26d00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26d10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
26d20 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
26d30 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 57  mLock(pDbFd, F_W
26d40 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f  RLCK, ofst+UNIX_
26d50 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
26d60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26d70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26d80 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61   assert( (p->sha
26d90 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  redMask & mask)=
26da0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
26db0 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
26dc0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
26dd0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
26de0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
26df0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f  ode->mutex);.  O
26e00 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
26e10 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d  K shmid-%d, pid-
26e20 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78  %d got %03x,%03x
26e30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
26e40 70 2d 3e 69 64 2c 20 6f 73 47 65 74 70 69 64 28  p->id, osGetpid(
26e50 30 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73  0), p->sharedMas
26e60 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29  k, p->exclMask))
26e70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
26e80 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
26e90 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69  t a memory barri
26ea0 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e  er or memory fen
26eb0 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d  ce on shared mem
26ec0 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c  ory.  .**.** All
26ed0 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65   loads and store
26ee0 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74  s begun before t
26ef0 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20  he barrier must 
26f00 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a  complete before.
26f10 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73  ** any load or s
26f20 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72  tore begun after
26f30 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f   the barrier..*/
26f40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
26f50 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73  xShmBarrier(.  s
26f60 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
26f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26f80 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
26f90 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
26fa0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
26fb0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
26fc0 45 52 28 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  ER(fd);.  sqlite
26fd0 33 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29  3MemoryBarrier()
26fe0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6d  ;         /* com
26ff0 70 69 6c 65 72 2d 64 65 66 69 6e 65 64 20 6d 65  piler-defined me
27000 6d 6f 72 79 20 62 61 72 72 69 65 72 20 2a 2f 0a  mory barrier */.
27010 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
27020 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ();             
27030 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c    /* Also mutex,
27040 20 66 6f 72 20 72 65 64 75 6e 64 61 6e 63 79 20   for redundancy 
27050 2a 2f 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  */.  unixLeaveMu
27060 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tex();.}../*.** 
27070 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69  Close a connecti
27080 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
27090 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65  ory.  Delete the
270a0 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20   underlying .** 
270b0 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74  storage if delet
270c0 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a  eFlag is true..*
270d0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
270e0 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   no shared memor
270f0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
27100 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  h the connection
27110 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f   then this.** ro
27120 75 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c  utine is a harml
27130 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  ess no-op..*/.st
27140 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
27150 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  Unmap(.  sqlite3
27160 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
27170 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27180 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
27190 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
271a0 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20  t deleteFlag    
271b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
271c0 20 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d   Delete shared-m
271d0 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f  emory if true */
271e0 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70  .){.  unixShm *p
271f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27200 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
27210 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c  nection to be cl
27220 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68  osed */.  unixSh
27230 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
27240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27250 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72   underlying shar
27260 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  ed-memory file *
27270 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70  /.  unixShm **pp
27280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27290 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
272a0 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20  ng over sibling 
272b0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20  connections */. 
272c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
272d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
272e0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
272f0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
27300 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28   */..  pDbFd = (
27310 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
27320 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
27330 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
27340 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27350 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
27360 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73  pShmNode;..  ass
27370 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70  ert( pShmNode==p
27380 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
27390 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  hmNode );.  asse
273a0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
273b0 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
273c0 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d  ode );..  /* Rem
273d0 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ove connection p
273e0 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66   from the set of
273f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73   connections ass
27400 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74  ociated.  ** wit
27410 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  h pShmNode */.  
27420 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
27430 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
27440 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26  tex);.  for(pp=&
27450 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
27460 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d  ; (*pp)!=p; pp =
27470 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b   &(*pp)->pNext){
27480 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65  }.  *pp = p->pNe
27490 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  xt;..  /* Free t
274a0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  he connection p 
274b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
274c0 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70  e(p);.  pDbFd->p
274d0 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Shm = 0;.  sqlit
274e0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
274f0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
27500 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f  ..  /* If pShmNo
27510 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61  de->nRef has rea
27520 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f  ched 0, then clo
27530 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  se the underlyin
27540 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65  g.  ** shared-me
27550 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a  mory file, too *
27560 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
27570 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
27580 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30  pShmNode->nRef>0
27590 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e   );.  pShmNode->
275a0 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53  nRef--;.  if( pS
275b0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
275c0 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74  ){.    if( delet
275d0 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64  eFlag && pShmNod
275e0 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  e->h>=0 ){.     
275f0 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f   osUnlink(pShmNo
27600 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
27610 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 53 68      }.    unixSh
27620 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20  mPurge(pDbFd);. 
27630 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
27640 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e  tex();..  return
27650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
27660 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75  #else.# define u
27670 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a  nixShmMap     0.
27680 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
27690 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69  Lock    0.# defi
276a0 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65  ne unixShmBarrie
276b0 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  r 0.# define uni
276c0 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65  xShmUnmap   0.#e
276d0 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
276e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
276f0 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  */..#if SQLITE_M
27700 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f  AX_MMAP_SIZE>0./
27710 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 63 75  *.** If it is cu
27720 72 72 65 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d  rrently memory m
27730 61 70 70 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c  apped, unmap fil
27740 65 20 70 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pFd..*/.static
27750 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66   void unixUnmapf
27760 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
27770 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46  d){.  assert( pF
27780 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  d->nFetchOut==0 
27790 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
277a0 5f 53 48 41 52 45 44 5f 4d 41 50 50 49 4e 47 0a  _SHARED_MAPPING.
277b0 20 20 69 66 28 20 70 46 64 2d 3e 70 49 6e 6f 64    if( pFd->pInod
277c0 65 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64  e ) return;.#end
277d0 69 66 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 4d  if.  if( pFd->pM
277e0 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  apRegion ){.    
277f0 6f 73 4d 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d  osMunmap(pFd->pM
27800 61 70 52 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d  apRegion, pFd->m
27810 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a  mapSizeActual);.
27820 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67      pFd->pMapReg
27830 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 64  ion = 0;.    pFd
27840 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a  ->mmapSize = 0;.
27850 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
27860 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d  eActual = 0;.  }
27870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
27880 74 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a  t to set the siz
27890 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  e of the memory 
278a0 6d 61 70 70 69 6e 67 20 6d 61 69 6e 74 61 69 6e  mapping maintain
278b0 65 64 20 62 79 20 66 69 6c 65 20 0a 2a 2a 20 64  ed by file .** d
278c0 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 74 6f  escriptor pFd to
278d0 20 6e 4e 65 77 20 62 79 74 65 73 2e 20 41 6e 79   nNew bytes. Any
278e0 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
278f0 67 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 0a  g is discarded..
27900 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
27910 66 75 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ful, this functi
27920 6f 6e 20 73 65 74 73 20 74 68 65 20 66 6f 6c 6c  on sets the foll
27930 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 3a  owing variables:
27940 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69  .**.**       uni
27950 78 46 69 6c 65 2e 70 4d 61 70 52 65 67 69 6f 6e  xFile.pMapRegion
27960 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
27970 6c 65 2e 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20 20  le.mmapSize.**  
27980 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d       unixFile.mm
27990 61 70 53 69 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a  apSizeActual.**.
279a0 2a 2a 20 49 66 20 75 6e 73 75 63 63 65 73 73 66  ** If unsuccessf
279b0 75 6c 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ul, an error mes
279c0 73 61 67 65 20 69 73 20 6c 6f 67 67 65 64 20 76  sage is logged v
279d0 69 61 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ia sqlite3_log()
279e0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 68 72 65   and.** the thre
279f0 65 20 76 61 72 69 61 62 6c 65 73 20 61 62 6f 76  e variables abov
27a00 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 49 6e  e are zeroed. In
27a10 20 74 68 69 73 20 63 61 73 65 20 53 51 4c 69 74   this case SQLit
27a20 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74  e should.** cont
27a30 69 6e 75 65 20 61 63 63 65 73 73 69 6e 67 20 74  inue accessing t
27a40 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  he database usin
27a50 67 20 74 68 65 20 78 52 65 61 64 28 29 20 61 6e  g the xRead() an
27a60 64 20 78 57 72 69 74 65 28 29 0a 2a 2a 20 6d 65  d xWrite().** me
27a70 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
27a80 20 76 6f 69 64 20 75 6e 69 78 52 65 6d 61 70 66   void unixRemapf
27a90 69 6c 65 28 0a 20 20 75 6e 69 78 46 69 6c 65 20  ile(.  unixFile 
27aa0 2a 70 46 64 2c 20 20 20 20 20 20 20 20 20 20 20  *pFd,           
27ab0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
27ac0 65 73 63 72 69 70 74 6f 72 20 6f 62 6a 65 63 74  escriptor object
27ad0 20 2a 2f 0a 20 20 69 36 34 20 6e 4e 65 77 20 20   */.  i64 nNew  
27ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27af0 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65        /* Require
27b00 64 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 2a  d mapping size *
27b10 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
27b20 72 20 2a 7a 45 72 72 20 3d 20 22 6d 6d 61 70 22  r *zErr = "mmap"
27b30 3b 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 64 2d  ;.  int h = pFd-
27b40 3e 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  >h;             
27b50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
27b60 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e   descriptor open
27b70 20 6f 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20   on db file */. 
27b80 20 75 38 20 2a 70 4f 72 69 67 20 3d 20 28 75 38   u8 *pOrig = (u8
27b90 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
27ba0 6f 6e 3b 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  on;   /* Pointer
27bb0 20 74 6f 20 63 75 72 72 65 6e 74 20 66 69 6c 65   to current file
27bc0 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36   mapping */.  i6
27bd0 34 20 6e 4f 72 69 67 20 3d 20 70 46 64 2d 3e 6d  4 nOrig = pFd->m
27be0 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20  mapSizeActual;  
27bf0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4f     /* Size of pO
27c00 72 69 67 20 72 65 67 69 6f 6e 20 69 6e 20 62 79  rig region in by
27c10 74 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70 4e 65  tes */.  u8 *pNe
27c20 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
27c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27c40 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 6e 65 77   Location of new
27c50 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e   mapping */.  in
27c60 74 20 66 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52  t flags = PROT_R
27c70 45 41 44 3b 20 20 20 20 20 20 20 20 20 20 20 20  EAD;            
27c80 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70     /* Flags to p
27c90 61 73 73 20 74 6f 20 6d 6d 61 70 28 29 20 2a 2f  ass to mmap() */
27ca0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ..  assert( pFd-
27cb0 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b  >nFetchOut==0 );
27cc0 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
27cd0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b  pFd->mmapSize );
27ce0 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3c  .  assert( nNew<
27cf0 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  =pFd->mmapSizeMa
27d00 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  x );.  assert( n
27d10 4e 65 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  New>0 );.  asser
27d20 74 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  t( pFd->mmapSize
27d30 41 63 74 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61  Actual>=pFd->mma
27d40 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  pSize );.  asser
27d50 74 28 20 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30  t( MAP_FAILED!=0
27d60 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
27d70 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54  TE_MMAP_READWRIT
27d80 45 0a 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74  E.  if( (pFd->ct
27d90 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
27da0 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20  LE_RDONLY)==0 ) 
27db0 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52  flags |= PROT_WR
27dc0 49 54 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ITE;.#endif..  i
27dd0 66 28 20 70 4f 72 69 67 20 29 7b 0a 23 69 66 20  f( pOrig ){.#if 
27de0 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20  HAVE_MREMAP.    
27df0 69 36 34 20 6e 52 65 75 73 65 20 3d 20 70 46 64  i64 nReuse = pFd
27e00 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 23 65 6c 73  ->mmapSize;.#els
27e10 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  e.    const int 
27e20 73 7a 53 79 73 70 61 67 65 20 3d 20 6f 73 47 65  szSyspage = osGe
27e30 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 20 20 20  tpagesize();.   
27e40 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20 28 70   i64 nReuse = (p
27e50 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 26 20 7e  Fd->mmapSize & ~
27e60 28 73 7a 53 79 73 70 61 67 65 2d 31 29 29 3b 0a  (szSyspage-1));.
27e70 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 70  #endif.    u8 *p
27e80 52 65 71 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65  Req = &pOrig[nRe
27e90 75 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e  use];..    /* Un
27ea0 6d 61 70 20 61 6e 79 20 70 61 67 65 73 20 6f 66  map any pages of
27eb0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
27ec0 70 70 69 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f  pping that canno
27ed0 74 20 62 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a  t be reused. */.
27ee0 20 20 20 20 69 66 28 20 6e 52 65 75 73 65 21 3d      if( nReuse!=
27ef0 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 6f  nOrig ){.      o
27f00 73 4d 75 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f  sMunmap(pReq, nO
27f10 72 69 67 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20  rig-nReuse);.   
27f20 20 7d 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52 45   }..#if HAVE_MRE
27f30 4d 41 50 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f  MAP.    pNew = o
27f40 73 4d 72 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e  sMremap(pOrig, n
27f50 52 65 75 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45  Reuse, nNew, MRE
27f60 4d 41 50 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20  MAP_MAYMOVE);.  
27f70 20 20 7a 45 72 72 20 3d 20 22 6d 72 65 6d 61 70    zErr = "mremap
27f80 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65  ";.#else.    pNe
27f90 77 20 3d 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c  w = osMmap(pReq,
27fa0 20 6e 4e 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c   nNew-nReuse, fl
27fb0 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c  ags, MAP_SHARED,
27fc0 20 68 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20   h, nReuse);.   
27fd0 20 69 66 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46   if( pNew!=MAP_F
27fe0 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 69  AILED ){.      i
27ff0 66 28 20 70 4e 65 77 21 3d 70 52 65 71 20 29 7b  f( pNew!=pReq ){
28000 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61  .        osMunma
28010 70 28 70 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e  p(pNew, nNew - n
28020 52 65 75 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Reuse);.        
28030 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 20 20  pNew = 0;.      
28040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
28050 4e 65 77 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20  New = pOrig;.   
28060 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
28070 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74  f..    /* The at
28080 74 65 6d 70 74 20 74 6f 20 65 78 74 65 6e 64 20  tempt to extend 
28090 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
280a0 70 69 6e 67 20 66 61 69 6c 65 64 2e 20 46 72 65  ping failed. Fre
280b0 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  e it. */.    if(
280c0 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45   pNew==MAP_FAILE
280d0 44 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a  D || pNew==0 ){.
280e0 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
280f0 4f 72 69 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20  Orig, nReuse);. 
28100 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
28110 66 20 70 4e 65 77 20 69 73 20 73 74 69 6c 6c 20  f pNew is still 
28120 4e 55 4c 4c 2c 20 74 72 79 20 74 6f 20 63 72 65  NULL, try to cre
28130 61 74 65 20 61 6e 20 65 6e 74 69 72 65 6c 79 20  ate an entirely 
28140 6e 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a  new mapping. */.
28150 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
28160 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d  .    pNew = osMm
28170 61 70 28 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67  ap(0, nNew, flag
28180 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68  s, MAP_SHARED, h
28190 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  , 0);.  }..  if(
281a0 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45   pNew==MAP_FAILE
281b0 44 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  D ){.    pNew = 
281c0 30 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b  0;.    nNew = 0;
281d0 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f  .    unixLogErro
281e0 72 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72  r(SQLITE_OK, zEr
281f0 72 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  r, pFd->zPath);.
28200 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d  .    /* If the m
28210 6d 61 70 28 29 20 61 62 6f 76 65 20 66 61 69 6c  map() above fail
28220 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ed, assume that 
28230 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 6d  all subsequent m
28240 6d 61 70 28 29 20 63 61 6c 6c 73 0a 20 20 20 20  map() calls.    
28250 2a 2a 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ** will probably
28260 20 66 61 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20   fail too. Fall 
28270 62 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 78 52  back to using xR
28280 65 61 64 2f 78 57 72 69 74 65 20 65 78 63 6c 75  ead/xWrite exclu
28290 73 69 76 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e  sively.    ** in
282a0 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a   this case.  */.
282b0 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
282c0 65 4d 61 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  eMax = 0;.  }.  
282d0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  pFd->pMapRegion 
282e0 3d 20 28 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a  = (void *)pNew;.
282f0 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20    pFd->mmapSize 
28300 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41  = pFd->mmapSizeA
28310 63 74 75 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a  ctual = nNew;.}.
28320 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61  ./*.** Memory ma
28330 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66  p or remap the f
28340 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69  ile opened by fi
28350 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46  le-descriptor pF
28360 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a  d (if the file.*
28370 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70  * is already map
28380 70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e  ped, the existin
28390 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70  g mapping is rep
283a0 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 65 77  laced by the new
283b0 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68  ). Or, if .** th
283c0 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ere already exis
283d0 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72  ts a mapping for
283e0 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20   this file, and 
283f0 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
28400 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  .** outstanding 
28410 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65 6e  xFetch() referen
28420 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20  ces to it, this 
28430 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
28440 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  -op..**.** If pa
28450 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73  rameter nByte is
28460 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74   non-negative, t
28470 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65  hen it is the re
28480 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20  quested size of 
28490 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20  .** the mapping 
284a0 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72  to create. Other
284b0 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69  wise, if nByte i
284c0 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
284d0 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72  , then the .** r
284e0 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69 73  equested size is
284f0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
28500 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54   file on disk. T
28510 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
28520 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64  f the.** created
28530 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74 68   mapping is eith
28540 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64  er the requested
28550 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c   size or the val
28560 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a  ue configured .*
28570 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46  * using SQLITE_F
28580 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c  CNTL_MMAP_LIMIT,
28590 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d   whichever is sm
285a0 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  aller..**.** SQL
285b0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
285c0 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ed if no error o
285d0 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20 74  ccurs (even if t
285e0 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
285f0 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61  t.** recreated a
28600 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75  s a result of ou
28610 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
28620 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69  nces) or an SQLi
28630 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
28640 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
28650 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61  tatic int unixMa
28660 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
28670 70 46 64 2c 20 69 36 34 20 6e 4d 61 70 29 7b 0a  pFd, i64 nMap){.
28680 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d    assert( nMap>=
28690 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68  0 || pFd->nFetch
286a0 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Out==0 );.  asse
286b0 72 74 28 20 6e 4d 61 70 3e 30 20 7c 7c 20 28 70  rt( nMap>0 || (p
286c0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30 20  Fd->mmapSize==0 
286d0 26 26 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  && pFd->pMapRegi
286e0 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20  on==0) );.  if( 
286f0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30  pFd->nFetchOut>0
28700 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
28710 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70  _OK;..  if( nMap
28720 3c 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  <0 ){.    struct
28730 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20   stat statbuf;  
28740 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c          /* Low-l
28750 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d  evel file inform
28760 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28  ation */.    if(
28770 20 6f 73 46 73 74 61 74 28 70 46 64 2d 3e 68 2c   osFstat(pFd->h,
28780 20 26 73 74 61 74 62 75 66 29 20 29 7b 0a 20 20   &statbuf) ){.  
28790 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
287a0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
287b0 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20 3d 20     }.    nMap = 
287c0 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3b  statbuf.st_size;
287d0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e  .  }.  if( nMap>
287e0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
287f0 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70   ){.    nMap = p
28800 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  Fd->mmapSizeMax;
28810 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
28820 49 54 45 5f 53 48 41 52 45 44 5f 4d 41 50 50 49  ITE_SHARED_MAPPI
28830 4e 47 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 49  NG.  if( pFd->pI
28840 6e 6f 64 65 20 29 7b 0a 20 20 20 20 75 6e 69 78  node ){.    unix
28850 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
28860 65 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 3b  e = pFd->pInode;
28870 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d  .    if( pFd->pM
28880 61 70 52 65 67 69 6f 6e 20 29 20 72 65 74 75 72  apRegion ) retur
28890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
288a0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
288b0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
288c0 65 2d 3e 70 53 68 61 72 65 64 4d 61 70 70 69 6e  e->pSharedMappin
288d0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 38  g==0 ){.      u8
288e0 20 2a 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28   *pNew = osMmap(
288f0 30 2c 20 6e 4d 61 70 2c 20 50 52 4f 54 5f 52 45  0, nMap, PROT_RE
28900 41 44 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20  AD, MAP_SHARED, 
28910 70 46 64 2d 3e 68 2c 20 30 29 3b 0a 20 20 20 20  pFd->h, 0);.    
28920 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f    if( pNew==MAP_
28930 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
28940 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53    unixLogError(S
28950 51 4c 49 54 45 5f 4f 4b 2c 20 22 6d 6d 61 70 22  QLITE_OK, "mmap"
28960 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  , pFd->zPath);. 
28970 20 20 20 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70         pFd->mmap
28980 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20 20  SizeMax = 0;.   
28990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
289a0 20 20 70 49 6e 6f 64 65 2d 3e 70 53 68 61 72 65    pInode->pShare
289b0 64 4d 61 70 70 69 6e 67 20 3d 20 70 4e 65 77 3b  dMapping = pNew;
289c0 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
289d0 3e 6e 53 68 61 72 65 64 4d 61 70 70 69 6e 67 20  >nSharedMapping 
289e0 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 20 20 7d 0a  = nMap;.      }.
289f0 20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70      }.    pFd->p
28a00 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 49 6e 6f  MapRegion = pIno
28a10 64 65 2d 3e 70 53 68 61 72 65 64 4d 61 70 70 69  de->pSharedMappi
28a20 6e 67 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61  ng;.    pFd->mma
28a30 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 70 46  pSizeActual = pF
28a40 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70 49  d->mmapSize = pI
28a50 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 4d 61 70  node->nSharedMap
28a60 70 69 6e 67 3b 0a 20 20 20 20 75 6e 69 78 4c 65  ping;.    unixLe
28a70 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
28a80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28a90 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
28aa0 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c  assert( nMap>0 |
28ab0 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  | (pFd->mmapSize
28ac0 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61 70  ==0 && pFd->pMap
28ad0 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20  Region==0) );.  
28ae0 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d  if( nMap!=pFd->m
28af0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 75  mapSize ){.    u
28b00 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64  nixRemapfile(pFd
28b10 2c 20 6e 4d 61 70 29 3b 0a 20 20 7d 0a 0a 20 20  , nMap);.  }..  
28b20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28b30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
28b40 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
28b50 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ZE>0 */../*.** I
28b60 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75  f possible, retu
28b70 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
28b80 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c  a mapping of fil
28b90 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74  e fd starting at
28ba0 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e   offset.** iOff.
28bb0 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73   The mapping mus
28bc0 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61  t be valid for a
28bd0 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74  t least nAmt byt
28be0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  es..**.** If suc
28bf0 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20  h a pointer can 
28c00 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f  be obtained, sto
28c10 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64  re it in *pp and
28c20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28c30 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65  K..** Or, if one
28c40 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65   cannot but no e
28c50 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
28c60 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65   *pp to 0 and re
28c70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
28c80 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61  ** Finally, if a
28c90 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
28ca0 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  ur, return an SQ
28cb0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
28cc0 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61   The final.** va
28cd0 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e  lue of *pp is un
28ce0 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
28cf0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
28d00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
28d10 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
28d20 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  er, the caller m
28d30 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a  ust eventually .
28d40 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  ** release the r
28d50 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c  eference by call
28d60 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28  ing unixUnfetch(
28d70 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
28d80 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74   unixFetch(sqlit
28d90 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
28da0 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c   iOff, int nAmt,
28db0 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66   void **pp){.#if
28dc0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
28dd0 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69  _SIZE>0.  unixFi
28de0 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
28df0 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
28e00 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
28e10 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
28e20 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b  endif.  *pp = 0;
28e30 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
28e40 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
28e50 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
28e60 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
28e70 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
28e80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
28e90 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
28ea0 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20  e(pFd, -1);.    
28eb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28ec0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
28ed0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
28ee0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20  Fd->mmapSize >= 
28ef0 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20  iOff+nAmt ){.   
28f00 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a     *pp = &((u8 *
28f10 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
28f20 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70  )[iOff];.      p
28f30 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b  Fd->nFetchOut++;
28f40 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
28f50 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
28f60 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
28f70 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
28f80 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  ment is non-NULL
28f90 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
28fa0 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20  tion releases a 
28fb0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62  .** reference ob
28fc0 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72  tained by an ear
28fd0 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69  lier call to uni
28fe0 78 46 65 74 63 68 28 29 2e 20 54 68 65 20 73 65  xFetch(). The se
28ff0 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
29000 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
29010 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
29020 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
29030 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
29040 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20  * argument that 
29050 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
29060 65 20 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e  e unixFetch() in
29070 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  vocation. .**.**
29080 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72   Or, if the thir
29090 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  d argument is NU
290a0 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
290b0 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
290c0 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e  called .** to in
290d0 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79  form the VFS lay
290e0 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69  er that, accordi
290f0 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79  ng to POSIX, any
29100 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
29110 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65  g .** may now be
29120 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
29130 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e  uld be unmapped.
29140 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
29150 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74  nixUnfetch(sqlit
29160 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
29170 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
29180 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
29190 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e  MMAP_SIZE>0.  un
291a0 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75  ixFile *pFd = (u
291b0 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20  nixFile *)fd;   
291c0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
291d0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
291e0 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
291f0 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20  METER(iOff);..  
29200 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61  /* If p==0 (unma
29210 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c  p the entire fil
29220 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e) then there mu
29230 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  st be no outstan
29240 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63  ding .  ** xFetc
29250 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72  h references. Or
29260 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69  , if p!=0 (meani
29270 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74  ng it is an xFet
29280 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20  ch reference),. 
29290 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d   ** then there m
292a0 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
292b0 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e  one outstanding.
292c0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
292d0 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65  p==0)==(pFd->nFe
292e0 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20  tchOut==0) );.. 
292f0 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20   /* If p!=0, it 
29300 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69  must match the i
29310 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  Off value. */.  
29320 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
29330 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e  p==&((u8 *)pFd->
29340 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
29350 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b  ] );..  if( p ){
29360 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68  .    pFd->nFetch
29370 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Out--;.  }else{.
29380 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c      unixUnmapfil
29390 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61  e(pFd);.  }..  a
293a0 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
293b0 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73  chOut>=0 );.#els
293c0 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
293d0 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
293e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
293f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
29400 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69  TER(iOff);.#endi
29410 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
29420 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  E_OK;.}../*.** H
29430 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
29440 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
29450 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
29460 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
29470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29480 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
29490 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
294a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
294b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
294c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
294d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
294e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
294f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
29510 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
29520 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
29530 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
29540 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
29550 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  cts that.** impl
29560 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69  ement various fi
29570 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  le locking strat
29580 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20  egies.  It also 
29590 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
295a0 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64  ions.** of "find
295b0 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  er" functions.  
295c0 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  A finder-functio
295d0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  n is used to loc
295e0 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ate the appropri
295f0 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  ate.** sqlite3_i
29600 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
29610 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
29620 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  r database file.
29630 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a    The pAppData.*
29640 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
29650 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f  qlite3_vfs VFS o
29660 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69  bjects are initi
29670 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69  alized to be poi
29680 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  nters to.** the 
29690 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66  correct finder-f
296a0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  unction for that
296b0 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74   VFS..**.** Most
296c0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
296d0 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
296e0 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
296f0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29700 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  .** object.  The
29710 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e   only interestin
29720 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  g finder-functio
29730 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  n is autolockIoF
29740 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20  inder, which.** 
29750 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
29760 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64  esystem type and
29770 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20   tries to guess 
29780 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
29790 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f  .** strategy fro
297a0 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  m that..**.** Fo
297b0 72 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  r finder-functio
297c0 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73  n F, two objects
297d0 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a   are created:.**
297e0 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72  .**    (1) The r
297f0 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  eal finder-funct
29800 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74  ion named "FImpt
29810 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ()"..**.**    (2
29820 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69  ) A constant poi
29830 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e  nter to this fun
29840 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74  ction named just
29850 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41   "F"..**.**.** A
29860 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
29870 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65  F pointer is use
29880 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74  d as the pAppDat
29890 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a  a value for VFS.
298a0 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20  ** objects.  We 
298b0 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
298c0 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69  instead of letti
298d0 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e  ng pAppData poin
298e0 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74  t.** directly at
298f0 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   the finder-func
29900 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72  tion since C90 r
29910 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76  ules prevent a v
29920 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20  oid*.** from be 
29930 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63  cast into a func
29940 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  tion pointer..**
29950 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  .**.** Each inst
29960 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63  ance of this mac
29970 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ro generates two
29980 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20   objects:.**.** 
29990 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20    *  A constant 
299a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
299b0 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d  ds object call M
299c0 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c  ETHOD that has l
299d0 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d  ocking.**      m
299e0 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f  ethods CLOSE, LO
299f0 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45  CK, UNLOCK, CKRE
29a00 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  SLOCK..**.**   *
29a10 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20    An I/O method 
29a20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  finder function 
29a30 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68  called FINDER th
29a40 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  at returns a poi
29a50 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20  nter.**      to 
29a60 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63  the METHOD objec
29a70 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
29a80 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65  s bullet..*/.#de
29a90 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46  fine IOMETHODS(F
29aa0 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45 52  INDER,METHOD,VER
29ab0 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c  SION,CLOSE,LOCK,
29ac0 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48  UNLOCK,CKLOCK,SH
29ad0 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73 74 61 74  MMAP)     \.stat
29ae0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
29af0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48  _io_methods METH
29b00 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20  OD = {          
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45           \.   VE
29b30 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
29b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
29b50 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20  rsion */        
29b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b70 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f          \.   CLO
29b80 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SE,             
29b90 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
29ba0 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
29bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bc0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
29bd0 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
29be0 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
29bf0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
29c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c10 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57        \.   unixW
29c20 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
29c30 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
29c40 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
29c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c60 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72       \.   unixTr
29c70 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
29c80 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
29c90 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
29ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cb0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e      \.   unixSyn
29cc0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
29cd0 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
29ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d00 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
29d10 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
29d20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
29d30 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
29d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d50 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20    \.   LOCK,    
29d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d70 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20     /* xLock */  
29d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29da0 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20   \.   UNLOCK,   
29db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29dc0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20    /* xUnlock */ 
29dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29df0 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20  \.   CKLOCK,    
29e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e10 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
29e20 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  edLock */       
29e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
29e40 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  .   unixFileCont
29e50 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
29e60 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
29e70 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
29e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29e90 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
29ea0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
29eb0 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
29ee0 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
29ef0 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a  acteristics,  /*
29f00 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69   xDeviceCapabili
29f10 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ties */         
29f20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
29f30 20 53 48 4d 4d 41 50 2c 20 20 20 20 20 20 20 20   SHMMAP,        
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29f50 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20  xShmMap */      
29f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f70 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
29f80 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20  unixShmLock,    
29f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29fa0 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  ShmLock */      
29fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fc0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
29fd0 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20  nixShmBarrier,  
29fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
29ff0 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20  hmBarrier */    
2a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a010 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2a020 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  ixShmUnmap,     
2a030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2a040 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20  mUnmap */       
2a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a060 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2a070 78 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  xFetch,         
2a080 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
2a090 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ch */           
2a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0b0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2a0c0 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20 20  Unfetch,        
2a0d0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65          /* xUnfe
2a0e0 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20  tch */          
2a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a100 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20        \.};      
2a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a150 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
2a160 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2a170 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23  ethods *FINDER##
2a180 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  Impl(const char 
2a190 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29  *z, unixFile *p)
2a1a0 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50  {   \.  UNUSED_P
2a1b0 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55  ARAMETER(z); UNU
2a1c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
2a1d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1f0 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d     \.  return &M
2a200 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20  ETHOD;          
2a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a240 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20    \.}           
2a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a290 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
2a2a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2a2b0 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44  ds *(*const FIND
2a2c0 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ER)(const char*,
2a2d0 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20  unixFile *p)    
2a2e0 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23  \.    = FINDER##
2a2f0 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  Impl;../*.** Her
2a300 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65  e are all of the
2a310 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2a320 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ods objects for 
2a330 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  each of the.** l
2a340 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
2a350 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68  s.  Functions th
2a360 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65  at return pointe
2a370 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68  rs to these meth
2a380 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ods.** are also 
2a390 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45  created..*/.IOME
2a3a0 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f  THODS(.  posixIo
2a3b0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2a3c0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2a3d0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2a3e0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20  posixIoMethods, 
2a3f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2a400 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2a410 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2a420 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
2a430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2a440 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20  ared memory and 
2a450 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64  mmap are enabled
2a460 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
2a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a480 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2a490 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4b0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2a4c0 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  */.  unixUnlock,
2a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a4e0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2a4f0 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
2a500 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
2a510 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2a520 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2a530 20 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20    unixShmMap    
2a540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a550 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2a560 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
2a570 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  nolockIoFinder, 
2a580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2a590 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2a5a0 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d  e */.  nolockIoM
2a5b0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2a5c0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2a5d0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2a5e0 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20  me */.  3,      
2a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a600 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2a610 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2a620 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c  /.  nolockClose,
2a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a640 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2a650 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20  /.  nolockLock, 
2a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a670 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2a680 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  .  nolockUnlock,
2a690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a6a0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2a6b0 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  /.  nolockCheckR
2a6c0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a  eservedLock,  /*
2a6d0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2a6e0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2a6f0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2a700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2a710 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
2a720 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f  .IOMETHODS(.  do
2a730 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  tlockIoFinder,  
2a740 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2a750 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2a760 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65  */.  dotlockIoMe
2a770 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f  thods,         /
2a780 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2a790 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2a7a0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7c0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2a7d0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2a7e0 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20    dotlockClose, 
2a7f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a800 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2a810 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20    dotlockLock,  
2a820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a830 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2a840 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20   dotlockUnlock, 
2a850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2a860 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2a870 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65    dotlockCheckRe
2a880 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78  servedLock, /* x
2a890 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2a8a0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8c0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2a8d0 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a  ap method */.)..
2a8e0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2a8f0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2a900 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f  IOMETHODS(.  flo
2a910 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
2a920 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
2a930 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
2a940 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f  /.  flockIoMetho
2a950 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
2a960 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2a970 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2a980 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
2a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a9a0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
2a9b0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
2a9c0 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20   flockClose,    
2a9d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2a9e0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2a9f0 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20   flockLock,     
2aa00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2aa10 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2aa20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  flockUnlock,    
2aa30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2aa40 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2aa50 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
2aa60 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43  vedLock,   /* xC
2aa70 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2aa80 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
2aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaa0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
2aab0 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  p method */.).#e
2aac0 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57  ndif..#if OS_VXW
2aad0 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
2aae0 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20    semIoFinder,  
2aaf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2ab00 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2ab10 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65  ame */.  semIoMe
2ab20 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
2ab30 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2ab40 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2ab50 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab70 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2ab80 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
2ab90 20 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65 2c   */.  semXClose,
2aba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abb0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2abc0 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c 20   */.  semXLock, 
2abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abe0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2abf0 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c  */.  semXUnlock,
2ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ac10 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2ac20 20 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b 52   */.  semXCheckR
2ac30 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
2ac40 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2ac50 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2ac60 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2ac70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ac80 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2ac90 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .).#endif..#if d
2aca0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2acb0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2acc0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2acd0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66  .IOMETHODS(.  af
2ace0 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  pIoFinder,      
2acf0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2ad00 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2ad10 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64  */.  afpIoMethod
2ad20 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
2ad30 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2ad40 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2ad50 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
2ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad70 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2ad80 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2ad90 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20    afpClose,     
2ada0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2adb0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2adc0 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20    afpLock,      
2add0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ade0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2adf0 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   afpUnlock,     
2ae00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2ae10 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2ae20 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76    afpCheckReserv
2ae30 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78  edLock,     /* x
2ae40 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2ae50 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae70 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2ae80 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
2ae90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
2aea0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
2aeb0 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65  ethod is a "supe
2aec0 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65  r-method" in the
2aed0 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a   sense that it.*
2aee0 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72  * opens secondar
2aef0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
2af00 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  rs for the conch
2af10 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20   and lock files 
2af20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70  and.** it uses p
2af30 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20  roxy, dot-file, 
2af40 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29  AFP, and flock()
2af50 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
2af60 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63   on those.** sec
2af70 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46  ondary files.  F
2af80 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
2af90 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
2afa0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  t implements.** 
2afb0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
2afc0 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75   located much fu
2afd0 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  rther down in th
2afe0 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20  e file.  But we 
2aff0 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  need.** to go ah
2b000 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74  ead and define t
2b010 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
2b020 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72  thods and finder
2b030 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
2b040 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68   proxy locking h
2b050 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77  ere.  So we forw
2b060 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20  ard declare the 
2b070 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  I/O methods..*/.
2b080 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2b090 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2b0a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2b0b0 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74  STYLE.static int
2b0c0 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
2b0d0 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
2b0e0 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b  ic int proxyLock
2b0f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
2b100 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
2b110 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
2b120 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
2b130 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
2b140 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
2b150 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
2b160 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48  *, int*);.IOMETH
2b170 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69  ODS(.  proxyIoFi
2b180 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2b190 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2b1a0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ion name */.  pr
2b1b0 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  oxyIoMethods,   
2b1c0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2b1d0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2b1e0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
2b1f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b200 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2b210 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2b220 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79  abled */.  proxy
2b230 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2b240 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2b250 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
2b260 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2b270 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2b280 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55  thod */.  proxyU
2b290 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2b2a0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2b2b0 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
2b2c0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2b2d0 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k,   /* xCheckRe
2b2e0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2b2f0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b310 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2b320 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
2b330 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20  /* nfs lockd on 
2b340 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27  OSX 10.3+ doesn'
2b350 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f  t clear write lo
2b360 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20  cks when a read 
2b370 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23  lock is set */.#
2b380 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2b390 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2b3a0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2b3b0 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
2b3c0 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20    nfsIoFinder,  
2b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b3e0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
2b3f0 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d  name */.  nfsIoM
2b400 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2b410 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2b420 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2b430 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
2b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b450 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2b460 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2b470 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
2b480 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2b490 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
2b4a0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
2b4b0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2b4c0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2b4d0 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c  thod */.  nfsUnl
2b4e0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2b4f0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
2b500 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
2b510 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2b520 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k,     /* xCheck
2b530 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2b540 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
2b550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b560 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
2b570 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
2b580 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
2b590 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2b5a0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2b5b0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
2b5c0 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
2b5d0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
2b5e0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2b5f0 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
2b600 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
2b610 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b620 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
2b630 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
2b640 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
2b650 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
2b660 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
2b670 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
2b680 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
2b690 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a  MacOSX only..*/.
2b6a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2b6b0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2b6c0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
2b6d0 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
2b6e0 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
2b6f0 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
2b700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2b710 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
2b720 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
2b730 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
2b740 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
2b750 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
2b760 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
2b770 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
2b780 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2b790 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
2b7a0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
2b7b0 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
2b7c0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
2b7d0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2b7e0 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
2b7f0 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
2b800 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
2b810 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
2b820 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
2b830 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
2b840 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
2b850 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
2b860 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
2b870 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
2b880 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  },.    { "smbfs"
2b890 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
2b8a0 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
2b8b0 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  v", &nolockIoMet
2b8c0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c  hods },.    { 0,
2b8d0 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
2b8e0 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
2b8f0 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72  fs fsInfo;.  str
2b900 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
2b910 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
2b920 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
2b930 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
2b940 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
2b950 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
2b960 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
2b970 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
2b980 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
2b990 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
2b9a0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
2b9b0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69  Methods;.  }.  i
2b9c0 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61  f( statfs(filePa
2b9d0 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
2b9e0 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73  -1 ){.    if( fs
2b9f0 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
2ba00 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  NT_RDONLY ){.   
2ba10 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
2ba20 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  kIoMethods;.    
2ba30 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61  }.    for(i=0; a
2ba40 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
2ba50 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
2ba60 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
2ba70 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
2ba80 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
2ba90 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tem)==0 ){.     
2baa0 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69     return aMap[i
2bab0 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ].pMethods;.    
2bac0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2bad0 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65   /* Default case
2bae0 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67  . Handles, among
2baf0 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22  st others, "nfs"
2bb00 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65  ..  ** Test byte
2bb10 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
2bb20 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
2bb30 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
2bb40 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
2bb50 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
2bb60 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
2bb70 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
2bb80 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
2bb90 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
2bba0 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
2bbb0 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
2bbc0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
2bbd0 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
2bbe0 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
2bbf0 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
2bc00 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
2bc10 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
2bc20 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   {.    if( strcm
2bc30 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
2bc40 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
2bc50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2bc60 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a   &nfsIoMethods;.
2bc70 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2bc80 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
2bc90 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
2bca0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2bcb0 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
2bcc0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
2bcd0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2bce0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
2bcf0 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
2bd00 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
2bd10 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2bd20 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
2bd30 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
2bd40 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
2bd50 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2bd60 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2bd70 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
2bd80 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a  OS_VXWORKS./*.**
2bd90 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
2bda0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 56 78 57 6f  unction for VxWo
2bdb0 72 6b 73 20 63 68 65 63 6b 73 20 74 6f 20 73 65  rks checks to se
2bdc0 65 20 69 66 20 70 6f 73 69 78 20 61 64 76 69 73  e if posix advis
2bdd0 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77  ory.** locking w
2bde0 6f 72 6b 73 2e 20 20 49 66 20 69 74 20 64 6f 65  orks.  If it doe
2bdf0 73 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 20  s, then that is 
2be00 77 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 49  what is used.  I
2be10 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  f it does not.**
2be20 20 77 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c 6c   work, then fall
2be30 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73 65  back to named se
2be40 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e  maphore locking.
2be50 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
2be60 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2be70 6f 64 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46 69  ods *vxworksIoFi
2be80 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73  nderImpl(.  cons
2be90 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68  t char *filePath
2bea0 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20  ,    /* name of 
2beb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2bec0 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
2bed0 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20  *pNew           
2bee0 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  /* the open file
2bef0 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
2bf00 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
2bf10 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66  kInfo;..  if( !f
2bf20 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f  ilePath ){.    /
2bf30 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e  * If filePath==N
2bf40 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ULL that means w
2bf50 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
2bf60 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  th a transient f
2bf70 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ile.    ** that 
2bf80 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
2bf90 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20   be locked. */. 
2bfa0 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
2bfb0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
2bfc0 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63  .  /* Test if fc
2bfd0 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74  ntl() is support
2bfe0 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58  ed and use POSIX
2bff0 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20   style locks..  
2c000 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  ** Otherwise fal
2c010 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61  l back to the na
2c020 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65  med semaphore me
2c030 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63  thod..  */.  loc
2c040 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
2c050 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
2c060 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
2c070 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
2c080 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
2c090 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
2c0a0 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63  DLCK;.  if( osFc
2c0b0 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47  ntl(pNew->h, F_G
2c0c0 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
2c0d0 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74  !=-1 ) {.    ret
2c0e0 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68  urn &posixIoMeth
2c0f0 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
2c100 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d    return &semIoM
2c110 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
2c120 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2c130 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
2c140 20 2a 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72 6b   *(*const vxwork
2c150 73 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  sIoFinder)(const
2c160 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2c170 29 20 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e  ) = vxworksIoFin
2c180 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
2c190 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
2c1a0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
2c1b0 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
2c1c0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f  pointer to an IO
2c1d0 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
2c1e0 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65  unction:.*/.type
2c1f0 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  def const sqlite
2c200 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
2c210 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e  finder_type)(con
2c220 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
2c230 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  e*);.../********
2c240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c280 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
2c290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c2a0 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  * sqlite3_vfs me
2c2b0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
2c2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c2d0 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69  **.**.** This di
2c2e0 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
2c2f0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
2c300 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e  on of methods on
2c310 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
2c320 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a  vfs object..*/..
2c330 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
2c340 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2c350 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
2c360 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
2c370 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74  to by pId..*/.st
2c380 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55  atic int fillInU
2c390 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74  nixFile(.  sqlit
2c3a0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2c3b0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2c3c0 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
2c3d0 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20   int h,         
2c3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
2c3f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2c400 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f   of file being o
2c410 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pened */.  sqlit
2c420 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20  e3_file *pId,   
2c430 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
2c440 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
2c450 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
2c460 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2c470 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
2c480 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  of the file bein
2c490 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
2c4a0 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20  t ctrlFlags     
2c4b0 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72        /* Zero or
2c4c0 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a   more UNIXFILE_*
2c4d0 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
2c4e0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2c4f0 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69  _methods *pLocki
2c500 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46  ngStyle;.  unixF
2c510 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69  ile *pNew = (uni
2c520 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69  xFile *)pId;.  i
2c530 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c540 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  K;..  assert( pN
2c550 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c  ew->pInode==NULL
2c560 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63   );..  /* No loc
2c570 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74  king occurs in t
2c580 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a  emporary files *
2c590 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  /.  assert( zFil
2c5a0 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72  ename!=0 || (ctr
2c5b0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
2c5c0 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a  E_NOLOCK)!=0 );.
2c5d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
2c5e0 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
2c5f0 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b   h, zFilename));
2c600 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a  .  pNew->h = h;.
2c610 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70    pNew->pVfs = p
2c620 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61  Vfs;.  pNew->zPa
2c630 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
2c640 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2c650 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67  s = (u8)ctrlFlag
2c660 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  s;.#if SQLITE_MA
2c670 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
2c680 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  pNew->mmapSizeMa
2c690 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  x = sqlite3Globa
2c6a0 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a  lConfig.szMmap;.
2c6b0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c  #endif.  if( sql
2c6c0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2c6d0 28 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55  (((ctrlFlags & U
2c6e0 4e 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a  NIXFILE_URI) ? z
2c6f0 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20  Filename : 0),. 
2c700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c710 20 20 20 20 20 20 20 20 20 20 22 70 73 6f 77 22            "psow"
2c720 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41  , SQLITE_POWERSA
2c730 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b  FE_OVERWRITE) ){
2c740 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
2c750 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2c760 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28  _PSOW;.  }.  if(
2c770 20 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e   strcmp(pVfs->zN
2c780 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29  ame,"unix-excl")
2c790 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  ==0 ){.    pNew-
2c7a0 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
2c7b0 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d  IXFILE_EXCL;.  }
2c7c0 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
2c7d0 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76  .  pNew->pId = v
2c7e0 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64  xworksFindFileId
2c7f0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
2c800 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20  f( pNew->pId==0 
2c810 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73  ){.    ctrlFlags
2c820 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c   |= UNIXFILE_NOL
2c830 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  OCK;.    rc = SQ
2c840 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2c850 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
2c860 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55  f( ctrlFlags & U
2c870 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29  NIXFILE_NOLOCK )
2c880 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
2c890 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  yle = &nolockIoM
2c8a0 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
2c8b0 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79  .    pLockingSty
2c8c0 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f  le = (**(finder_
2c8d0 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70  type*)pVfs->pApp
2c8e0 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c  Data)(zFilename,
2c8f0 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49   pNew);.#if SQLI
2c900 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2c910 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43  G_STYLE.    /* C
2c920 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69  ache zFilename i
2c930 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  n the locking co
2c940 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64  ntext (AFP and d
2c950 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29  otlock override)
2c960 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78   for.    ** prox
2c970 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e  yLock activation
2c980 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65   is possible (re
2c990 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61  mote proxy is ba
2c9a0 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a  sed on db name).
2c9b0 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65      ** zFilename
2c9c0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75   remains valid u
2c9d0 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  ntil file is clo
2c9e0 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20  sed, to support 
2c9f0 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  */.    pNew->loc
2ca00 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76  kingContext = (v
2ca10 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a  oid*)zFilename;.
2ca20 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
2ca30 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2ca40 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  == &posixIoMetho
2ca50 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ds.#if defined(_
2ca60 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2ca70 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2ca80 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20  NG_STYLE.    || 
2ca90 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2caa0 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23   &nfsIoMethods.#
2cab0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
2cac0 49 54 45 5f 53 48 41 52 45 44 5f 4d 41 50 50 49  ITE_SHARED_MAPPI
2cad0 4e 47 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69  NG.    || pLocki
2cae0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 6f 6c 6f  ngStyle == &nolo
2caf0 63 6b 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64  ckIoMethods.#end
2cb00 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78  if.  ){.    unix
2cb10 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2cb20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
2cb30 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
2cb40 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
2cb50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2cb60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
2cb70 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
2cb80 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e  d in findInodeIn
2cb90 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20  fo(), close the 
2cba0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
2cbb0 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61        ** immedia
2cbc0 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c  tely, before rel
2cbd0 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78  easing the mutex
2cbe0 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  . findInodeInfo(
2cbf0 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20  ) may fail.     
2cc00 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61   ** in two scena
2cc10 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  rios:.      **. 
2cc20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20       **   (a) A 
2cc30 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20  call to fstat() 
2cc40 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a  failed..      **
2cc50 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20     (b) A malloc 
2cc60 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a  failed..      **
2cc70 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72  .      ** Scenar
2cc80 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20  io (b) may only 
2cc90 6f 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f  occur if the pro
2cca0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
2ccb0 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  no other.      *
2ccc0 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
2ccd0 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  rs open on the s
2cce0 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ame file. If the
2ccf0 72 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69  re were other fi
2cd00 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
2cd10 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20  riptors on this 
2cd20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61  file, then no ma
2cd30 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65  lloc would be re
2cd40 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20  quired by.      
2cd50 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  ** findInodeInfo
2cd60 28 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  (). If this is t
2cd70 68 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71  he case, it is q
2cd80 75 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f  uite safe to clo
2cd90 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64  se.      ** hand
2cda0 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20  le h - as it is 
2cdb0 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
2cdc0 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77  no posix locks w
2cdd0 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a  ill be released.
2cde0 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e        ** by doin
2cdf0 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  g so..      **. 
2ce00 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61       ** If scena
2ce10 72 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74  rio (a) caused t
2ce20 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68  he error then th
2ce30 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20  ings are not so 
2ce40 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20  safe. The.      
2ce50 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75  ** implicit assu
2ce60 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74  mption here is t
2ce70 68 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66  hat if fstat() f
2ce80 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65  ails, things are
2ce90 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63   in.      ** suc
2cea0 68 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74  h bad shape that
2ceb0 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b   dropping a lock
2cec0 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20   or two doesn't 
2ced0 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20  matter much..   
2cee0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75     */.      robu
2cef0 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
2cf00 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2cf10 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     h = -1;.    }
2cf20 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
2cf30 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20  tex();.  }..#if 
2cf40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2cf50 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
2cf60 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2cf70 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  ).  else if( pLo
2cf80 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61  ckingStyle == &a
2cf90 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  fpIoMethods ){. 
2cfa0 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e     /* AFP lockin
2cfb0 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
2cfc0 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
2cfd0 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
2cfe0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66  in.    ** the af
2cff0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e  pLockingContext.
2d000 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c  .    */.    afpL
2d010 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
2d020 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  Ctx;.    pNew->l
2d030 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
2d040 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pCtx = sqlite3_m
2d050 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
2d060 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66  *pCtx) );.    if
2d070 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
2d080 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2d090 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
2d0a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  else{.      /* N
2d0b0 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69  B: zFilename exi
2d0c0 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20  sts and remains 
2d0d0 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20  valid until the 
2d0e0 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  file is closed. 
2d0f0 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e       ** accordin
2d100 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74  g to requirement
2d110 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20   F11141.  So we 
2d120 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d  do not need to m
2d130 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ake a.      ** c
2d140 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e  opy of the filen
2d150 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43  ame. */.      pC
2d160 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69  tx->dbPath = zFi
2d170 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43  lename;.      pC
2d180 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30  tx->reserved = 0
2d190 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64  ;.      srandomd
2d1a0 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78  ev();.      unix
2d1b0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2d1c0 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
2d1d0 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
2d1e0 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
2d1f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d200 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d210 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
2d220 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
2d230 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75  t);.        robu
2d240 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
2d250 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2d260 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
2d270 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c     }.      unixL
2d280 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20  eaveMutex();    
2d290 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23      .    }.  }.#
2d2a0 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66  endif..  else if
2d2b0 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2d2c0 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  == &dotlockIoMet
2d2d0 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44  hods ){.    /* D
2d2e0 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75  otfile locking u
2d2f0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
2d300 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
2d310 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
2d320 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f      ** the dotlo
2d330 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
2d340 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61   .    */.    cha
2d350 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20  r *zLockFile;.  
2d360 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b    int nFilename;
2d370 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69  .    assert( zFi
2d380 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20  lename!=0 );.   
2d390 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e   nFilename = (in
2d3a0 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61  t)strlen(zFilena
2d3b0 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f  me) + 6;.    zLo
2d3c0 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
2d3d0 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36  )sqlite3_malloc6
2d3e0 34 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  4(nFilename);.  
2d3f0 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d    if( zLockFile=
2d400 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2d410 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2d420 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
2d430 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2d440 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c  rintf(nFilename,
2d450 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22   zLockFile, "%s"
2d460 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c   DOTLOCK_SUFFIX,
2d470 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
2d480 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63   }.    pNew->loc
2d490 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c  kingContext = zL
2d4a0 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69  ockFile;.  }..#i
2d4b0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65  f OS_VXWORKS.  e
2d4c0 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
2d4d0 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d  Style == &semIoM
2d4e0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
2d4f0 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
2d500 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2d510 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2d520 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  t needs to be.  
2d530 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e    ** included in
2d540 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43   the semLockingC
2d550 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20  ontext.    */.  
2d560 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2d570 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
2d580 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
2d590 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
2d5a0 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
2d5b0 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65  LITE_OK) && (pNe
2d5c0 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d  w->pInode->pSem=
2d5d0 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  =NULL) ){.      
2d5e0 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d  char *zSemName =
2d5f0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61   pNew->pInode->a
2d600 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  SemName;.      i
2d610 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt n;.      sqli
2d620 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
2d630 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e  _PATHNAME, zSemN
2d640 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a  ame, "/%s.sem",.
2d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d660 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64         pNew->pId
2d670 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
2d680 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d  );.      for( n=
2d690 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20  1; zSemName[n]; 
2d6a0 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66  n++ ).        if
2d6b0 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27  ( zSemName[n]=='
2d6c0 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  /' ) zSemName[n]
2d6d0 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e   = '_';.      pN
2d6e0 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
2d6f0 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d   = sem_open(zSem
2d700 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30  Name, O_CREAT, 0
2d710 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  666, 1);.      i
2d720 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  f( pNew->pInode-
2d730 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49  >pSem == SEM_FAI
2d740 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72  LED ){.        r
2d750 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2d760 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70  _BKPT;.        p
2d770 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65  New->pInode->aSe
2d780 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b  mName[0] = '\0';
2d790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2d7a0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2d7b0 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  x();.  }.#endif.
2d7c0 20 20 0a 20 20 73 74 6f 72 65 4c 61 73 74 45 72    .  storeLastEr
2d7d0 72 6e 6f 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69  rno(pNew, 0);.#i
2d7e0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
2d7f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d800 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
2d810 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
2d820 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2d830 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a  _);.    h = -1;.
2d840 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69      osUnlink(zFi
2d850 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  lename);.    pNe
2d860 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
2d870 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b  UNIXFILE_DELETE;
2d880 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
2d890 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d8a0 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20  ){.    if( h>=0 
2d8b0 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
2d8c0 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
2d8d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2d8e0 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
2d8f0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
2d900 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b     OpenCounter(+
2d910 31 29 3b 0a 20 20 20 20 76 65 72 69 66 79 44 62  1);.    verifyDb
2d920 46 69 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  File(pNew);.  }.
2d930 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d940 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2d950 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63   name of a direc
2d960 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f  tory in which to
2d970 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66   put temporary f
2d980 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73  iles..** If no s
2d990 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72  uitable temporar
2d9a0 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79  y file directory
2d9b0 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
2d9c0 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
2d9d0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2d9e0 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69   *unixTempFileDi
2d9f0 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  r(void){.  stati
2da00 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
2da10 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Dirs[] = {.     
2da20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20  0,.     0,.     
2da30 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/var/tmp",.    
2da40 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20   "/usr/tmp",.   
2da50 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22    "/tmp",.     "
2da60 2e 22 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e  .".  };.  unsign
2da70 65 64 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  ed int i = 0;.  
2da80 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
2da90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2daa0 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  Dir = sqlite3_te
2dab0 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 0a 20  mp_directory;.. 
2dac0 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20   if( !azDirs[0] 
2dad0 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65  ) azDirs[0] = ge
2dae0 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
2daf0 44 49 52 22 29 3b 0a 20 20 69 66 28 20 21 61 7a  DIR");.  if( !az
2db00 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73  Dirs[1] ) azDirs
2db10 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d  [1] = getenv("TM
2db20 50 44 49 52 22 29 3b 0a 20 20 77 68 69 6c 65 28  PDIR");.  while(
2db30 31 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72  1){.    if( zDir
2db40 21 3d 30 0a 20 20 20 20 20 26 26 20 6f 73 53 74  !=0.     && osSt
2db50 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 3d 3d  at(zDir, &buf)==
2db60 30 0a 20 20 20 20 20 26 26 20 53 5f 49 53 44 49  0.     && S_ISDI
2db70 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 0a 20  R(buf.st_mode). 
2db80 20 20 20 20 26 26 20 6f 73 41 63 63 65 73 73 28      && osAccess(
2db90 7a 44 69 72 2c 20 30 33 29 3d 3d 30 0a 20 20 20  zDir, 03)==0.   
2dba0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2dbb0 20 7a 44 69 72 3b 0a 20 20 20 20 7d 0a 20 20 20   zDir;.    }.   
2dbc0 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61   if( i>=sizeof(a
2dbd0 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a  zDirs)/sizeof(az
2dbe0 44 69 72 73 5b 30 5d 29 20 29 20 62 72 65 61 6b  Dirs[0]) ) break
2dbf0 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a 44  ;.    zDir = azD
2dc00 69 72 73 5b 69 2b 2b 5d 3b 0a 20 20 7d 0a 20 20  irs[i++];.  }.  
2dc10 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2dc20 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
2dc30 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
2dc40 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
2dc50 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
2dc60 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69  .** by the calli
2dc70 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d  ng process and m
2dc80 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
2dc90 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61  h to hold at lea
2dca0 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61  st.** pVfs->mxPa
2dcb0 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f  thname bytes..*/
2dcc0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2dcd0 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
2dce0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
2dcf0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
2dd00 2a 7a 44 69 72 3b 0a 20 20 69 6e 74 20 69 4c 69  *zDir;.  int iLi
2dd10 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  mit = 0;..  /* I
2dd20 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
2dd30 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
2dd40 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
2dd50 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
2dd60 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
2dd70 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
2dd80 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
2dd90 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
2dda0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
2ddb0 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
2ddc0 2a 2f 0a 20 20 7a 42 75 66 5b 30 5d 20 3d 20 30  */.  zBuf[0] = 0
2ddd0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
2dde0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
2ddf0 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a  TE_IOERR );..  z
2de00 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69  Dir = unixTempFi
2de10 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a  leDir();.  if( z
2de20 44 69 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Dir==0 ) return 
2de30 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
2de40 54 45 4d 50 50 41 54 48 3b 0a 20 20 64 6f 7b 0a  TEMPPATH;.  do{.
2de50 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 73      u64 r;.    s
2de60 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
2de70 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29  s(sizeof(r), &r)
2de80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 42  ;.    assert( nB
2de90 75 66 3e 32 20 29 3b 0a 20 20 20 20 7a 42 75 66  uf>2 );.    zBuf
2dea0 5b 6e 42 75 66 2d 32 5d 20 3d 20 30 3b 0a 20 20  [nBuf-2] = 0;.  
2deb0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2dec0 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22  tf(nBuf, zBuf, "
2ded0 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f  %s/"SQLITE_TEMP_
2dee0 46 49 4c 45 5f 50 52 45 46 49 58 22 25 6c 6c 78  FILE_PREFIX"%llx
2def0 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
2df00 20 20 20 20 20 20 20 20 20 20 7a 44 69 72 2c 20            zDir, 
2df10 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a  r, 0);.    if( z
2df20 42 75 66 5b 6e 42 75 66 2d 32 5d 21 3d 30 20 7c  Buf[nBuf-2]!=0 |
2df30 7c 20 28 69 4c 69 6d 69 74 2b 2b 29 3e 31 30 20  | (iLimit++)>10 
2df40 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2df50 45 52 52 4f 52 3b 0a 20 20 7d 77 68 69 6c 65 28  ERROR;.  }while(
2df60 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30   osAccess(zBuf,0
2df70 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
2df80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
2df90 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2dfa0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
2dfb0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
2dfc0 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  E__)./*.** Routi
2dfd0 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20  ne to transform 
2dfe0 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20  a unixFile into 
2dff0 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  a proxy-locking 
2e000 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70  unixFile..** Imp
2e010 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74  lementation in t
2e020 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69  he proxy-lock di
2e030 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64  vision, but used
2e040 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a   by unixOpen().*
2e050 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  * if SQLITE_PREF
2e060 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
2e070 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
2e080 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2e090 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
2e0a0 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e  e(unixFile*, con
2e0b0 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69  st char*);.#endi
2e0c0 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  f../*.** Search 
2e0d0 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69  for an unused fi
2e0e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
2e0f0 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  at was opened on
2e100 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
2e110 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  * file (not a jo
2e120 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d  urnal or master-
2e130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64  journal file) id
2e140 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 74 68  entified by path
2e150 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69  name.** zPath wi
2e160 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58  th SQLITE_OPEN_X
2e170 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e  XX flags matchin
2e180 67 20 74 68 6f 73 65 20 70 61 73 73 65 64 20 61  g those passed a
2e190 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  s the second.** 
2e1a0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
2e1b0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
2e1c0 20 53 75 63 68 20 61 20 66 69 6c 65 20 64 65 73   Such a file des
2e1d0 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73  criptor may exis
2e1e0 74 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  t if a database 
2e1f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63  connection was c
2e200 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65  losed.** but the
2e210 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
2e220 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c   descriptor coul
2e230 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  d not be closed 
2e240 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20  because some.** 
2e250 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
2e260 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  iptor open on th
2e270 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68  e same file is h
2e280 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f  olding a file-lo
2e290 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20  ck..** Refer to 
2e2a0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  comments in the 
2e2b0 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63  unixClose() func
2e2c0 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e  tion and the len
2e2d0 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20  gthy comment.** 
2e2e0 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69  describing "Posi
2e2f0 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
2e300 6e 67 22 20 61 74 20 74 68 65 20 73 74 61 72 74  ng" at the start
2e310 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f   of this file fo
2e320 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65  r .** further de
2e330 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63  tails. Also, tic
2e340 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a  ket #4018..**.**
2e350 20 49 66 20 61 20 73 75 69 74 61 62 6c 65 20 66   If a suitable f
2e360 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
2e370 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74  s found, then it
2e380 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
2e390 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65   no.** such file
2e3a0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c   descriptor is l
2e3b0 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65  ocated, -1 is re
2e3c0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2e3d0 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a  c UnixUnusedFd *
2e3e0 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63  findReusableFd(c
2e3f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2e400 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
2e410 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
2e420 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  nused = 0;..  /*
2e430 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66   Do not search f
2e440 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c  or an unused fil
2e450 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
2e460 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63  vxworks. Not bec
2e470 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b  ause.  ** vxwork
2e480 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65  s would not bene
2e490 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61  fit from the cha
2e4a0 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77  nge (it might, w
2e4b0 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a  e're not sure),.
2e4c0 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65    ** but because
2e4d0 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20   no way to test 
2e4e0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2e4f0 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73  available. It is
2e500 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f   better .  ** no
2e510 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69  t to risk breaki
2e520 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f  ng vxworks suppo
2e530 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20  rt for the sake 
2e540 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75  of such an obscu
2e550 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65  re .  ** feature
2e560 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58  .  */.#if !OS_VX
2e570 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73  WORKS.  struct s
2e580 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
2e590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e5a0 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28  Results of stat(
2e5b0 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 75 6e 69  ) call */..  uni
2e5c0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  xEnterMutex();..
2e5d0 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61    /* A stat() ca
2e5e0 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20  ll may fail for 
2e5f0 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e  various reasons.
2e600 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
2e610 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d  , it is.  ** alm
2e620 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74  ost certain that
2e630 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20   an open() call 
2e640 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68  on the same path
2e650 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e   will also fail.
2e660 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72  .  ** For this r
2e670 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72  eason, if an err
2e680 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
2e690 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72   stat() call her
2e6a0 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67  e, it is.  ** ig
2e6b0 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20  nored and -1 is 
2e6c0 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
2e6d0 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f  ller will try to
2e6e0 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
2e6f0 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  .  ** descriptor
2e700 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74   on the same pat
2e710 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74  h, fail, and ret
2e720 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  urn an error to 
2e730 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a  SQLite..  **.  *
2e740 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75 62 73  * Even if a subs
2e750 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61  equent open() ca
2e760 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c  ll does succeed,
2e770 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65   the consequence
2e780 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65  s of.  ** not se
2e790 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65  arching for a re
2e7a0 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  usable file desc
2e7b0 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64  riptor are not d
2e7c0 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ire.  */.  if( n
2e7d0 55 6e 75 73 65 64 46 64 3e 30 20 26 26 20 30 3d  UnusedFd>0 && 0=
2e7e0 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26  =osStat(zPath, &
2e7f0 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75 6e  sStat) ){.    un
2e800 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
2e810 6f 64 65 3b 0a 0a 20 20 20 20 70 49 6e 6f 64 65  ode;..    pInode
2e820 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
2e830 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
2e840 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  && (pInode->file
2e850 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74  Id.dev!=sStat.st
2e860 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20  _dev.           
2e870 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e            || pIn
2e880 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21  ode->fileId.ino!
2e890 3d 28 75 36 34 29 73 53 74 61 74 2e 73 74 5f 69  =(u64)sStat.st_i
2e8a0 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 70 49  no) ){.       pI
2e8b0 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  node = pInode->p
2e8c0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
2e8d0 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20  if( pInode ){.  
2e8e0 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64      UnixUnusedFd
2e8f0 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72   **pp;.      for
2e900 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e  (pp=&pInode->pUn
2e910 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70  used; *pp && (*p
2e920 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73  p)->flags!=flags
2e930 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e  ; pp=&((*pp)->pN
2e940 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e  ext));.      pUn
2e950 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20  used = *pp;.    
2e960 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
2e970 0a 20 20 20 20 20 20 20 20 6e 55 6e 75 73 65 64  .        nUnused
2e980 46 64 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2a 70  Fd--;.        *p
2e990 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65  p = pUnused->pNe
2e9a0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
2e9b0 7d 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  }.  }.  unixLeav
2e9c0 65 4d 75 74 65 78 28 29 3b 0a 23 65 6e 64 69 66  eMutex();.#endif
2e9d0 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58      /* if !OS_VX
2e9e0 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72  WORKS */.  retur
2e9f0 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a  n pUnused;.}../*
2ea00 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 6d 6f 64  .** Find the mod
2ea10 65 2c 20 75 69 64 20 61 6e 64 20 67 69 64 20 6f  e, uid and gid o
2ea20 66 20 66 69 6c 65 20 7a 46 69 6c 65 2e 20 0a 2a  f file zFile. .*
2ea30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
2ea40 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73  FileMode(.  cons
2ea50 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 20  t char *zFile,  
2ea60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2ea70 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 6d 6f  ile name */.  mo
2ea80 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20  de_t *pMode,    
2ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2eaa0 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e   OUT: Permission
2eab0 73 20 6f 66 20 7a 46 69 6c 65 20 2a 2f 0a 20 20  s of zFile */.  
2eac0 75 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20  uid_t *pUid,    
2ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eae0 2f 2a 20 4f 55 54 3a 20 75 69 64 20 6f 66 20 7a  /* OUT: uid of z
2eaf0 46 69 6c 65 2e 20 2a 2f 0a 20 20 67 69 64 5f 74  File. */.  gid_t
2eb00 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20   *pGid          
2eb10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2eb20 54 3a 20 67 69 64 20 6f 66 20 7a 46 69 6c 65 2e  T: gid of zFile.
2eb30 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
2eb40 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
2eb50 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
2eb60 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20  ut of stat() on 
2eb70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2eb80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2eb90 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 30 3d 3d  TE_OK;.  if( 0==
2eba0 6f 73 53 74 61 74 28 7a 46 69 6c 65 2c 20 26 73  osStat(zFile, &s
2ebb0 53 74 61 74 29 20 29 7b 0a 20 20 20 20 2a 70 4d  Stat) ){.    *pM
2ebc0 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d  ode = sStat.st_m
2ebd0 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20  ode & 0777;.    
2ebe0 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74  *pUid = sStat.st
2ebf0 5f 75 69 64 3b 0a 20 20 20 20 2a 70 47 69 64 20  _uid;.    *pGid 
2ec00 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a  = sStat.st_gid;.
2ec10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2ec20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  = SQLITE_IOERR_F
2ec30 53 54 41 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  STAT;.  }.  retu
2ec40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2ec50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2ec60 20 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f   called by unixO
2ec70 70 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69  pen() to determi
2ec80 6e 65 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d  ne the unix perm
2ec90 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72  issions.** to cr
2eca0 65 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77  eate new files w
2ecb0 69 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  ith. If no error
2ecc0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
2ecd0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2ece0 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c  ned.** and a val
2ecf0 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ue suitable for 
2ed00 70 61 73 73 69 6e 67 20 61 73 20 74 68 65 20 74  passing as the t
2ed10 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  hird argument to
2ed20 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77   open(2) is.** w
2ed30 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65  ritten to *pMode
2ed40 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2ed50 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
2ed60 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
2ed70 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e   .** returned an
2ed80 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a  d the value of *
2ed90 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64  pMode is not mod
2eda0 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
2edb0 6d 6f 73 74 20 63 61 73 65 73 2c 20 74 68 69 73  most cases, this
2edc0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70   routine sets *p
2edd0 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68  Mode to 0, which
2ede0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20   will become.** 
2edf0 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f  an indication to
2ee00 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74   robust_open() t
2ee10 6f 20 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  o create the fil
2ee20 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54  e using.** SQLIT
2ee30 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
2ee40 45 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73  ERMISSIONS adjus
2ee50 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b  ted by the umask
2ee60 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20  ..** But if the 
2ee70 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
2ee80 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65  d is a WAL or re
2ee90 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
2eea0 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  le, then .** thi
2eeb0 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69  s function queri
2eec0 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  es the file-syst
2eed0 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69  em for the permi
2eee0 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a  ssions on the .*
2eef0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
2ef00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
2ef10 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f  d sets *pMode to
2ef20 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65   this value. Whe
2ef30 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62  never .** possib
2ef40 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72  le, WAL and jour
2ef50 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72  nal files are cr
2ef60 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
2ef70 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  same permissions
2ef80 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f   .** as the asso
2ef90 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
2efa0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
2efb0 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
2efc0 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f  _8_3_NAMES optio
2efd0 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
2efe0 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  en the.** origin
2eff0 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75  al filename is u
2f000 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74  navailable.  But
2f010 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e   8_3_NAMES is on
2f020 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46  ly used for.** F
2f030 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61  AT filesystems a
2f040 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64  nd permissions d
2f050 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65  o not matter the
2f060 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a  re, so just use.
2f070 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ** the default p
2f080 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73  ermissions..*/.s
2f090 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72  tatic int findCr
2f0a0 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20  eateFileMode(.  
2f0b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2f0c0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
2f0d0 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20  /* Path of file 
2f0e0 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67  (possibly) being
2f0f0 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e   created */.  in
2f100 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f120 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 61 73   Flags passed as
2f130 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f   4th argument to
2f140 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f   xOpen() */.  mo
2f150 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20  de_t *pMode,    
2f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f170 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e   OUT: Permission
2f180 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77  s to open file w
2f190 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a  ith */.  uid_t *
2f1a0 70 55 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  pUid,           
2f1b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2f1c0 20 75 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74   uid to set on t
2f1d0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64  he file */.  gid
2f1e0 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20 20 20  _t *pGid        
2f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f200 4f 55 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20  OUT: gid to set 
2f210 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29  on the file */.)
2f220 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2f230 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2f240 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
2f250 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d  de */.  *pMode =
2f260 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b   0;.  *pUid = 0;
2f270 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20  .  *pGid = 0;.  
2f280 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c  if( flags & (SQL
2f290 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c  ITE_OPEN_WAL|SQL
2f2a0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2f2b0 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68  URNAL) ){.    ch
2f2c0 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e  ar zDb[MAX_PATHN
2f2d0 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44  AME+1];     /* D
2f2e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74  atabase file pat
2f2f0 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62  h */.    int nDb
2f300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f310 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f320 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20   of valid bytes 
2f330 69 6e 20 7a 44 62 20 2a 2f 0a 0a 20 20 20 20 2f  in zDb */..    /
2f340 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70 61 74  * zPath is a pat
2f350 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f  h to a WAL or jo
2f360 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
2f370 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
2f380 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74  derives.    ** t
2f390 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 61  he path to the a
2f3a0 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
2f3b0 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61  se file from zPa
2f3c0 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68  th. This block h
2f3d0 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68  andles.    ** th
2f3e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69  e following nami
2f3f0 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a  ng conventions:.
2f400 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2f410 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
2f420 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  urnal".    **   
2f430 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61  "<path to db>-wa
2f440 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
2f450 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
2f460 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  lNN".    **   "<
2f470 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e  path to db>-walN
2f480 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N".    **.    **
2f490 20 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64   where NN is a d
2f4a0 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54  ecimal number. T
2f4b0 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68  he NN naming sch
2f4c0 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a  emes are .    **
2f4d0 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73   used by the tes
2f4e0 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f  t_multiplex.c mo
2f4f0 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dule..    */.   
2f500 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74   nDb = sqlite3St
2f510 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20  rlen30(zPath) - 
2f520 31 3b 20 0a 20 20 20 20 77 68 69 6c 65 28 20 7a  1; .    while( z
2f530 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29  Path[nDb]!='-' )
2f540 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 6e 6f  {.      /* In no
2f550 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 2c 20  rmal operation, 
2f560 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f570 20 6e 61 6d 65 20 77 69 6c 6c 20 61 6c 77 61 79   name will alway
2f580 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  s contain.      
2f590 2a 2a 20 61 20 27 2d 27 20 63 68 61 72 61 63 74  ** a '-' charact
2f5a0 65 72 2e 20 20 48 6f 77 65 76 65 72 20 69 6e 20  er.  However in 
2f5b0 38 2b 33 20 66 69 6c 65 6e 61 6d 65 20 6d 6f 64  8+3 filename mod
2f5c0 65 2c 20 6f 72 20 69 66 20 61 20 63 6f 72 72 75  e, or if a corru
2f5d0 70 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c  pt.      ** roll
2f5e0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 70 65  back journal spe
2f5f0 63 69 66 69 65 73 20 61 20 6d 61 73 74 65 72 20  cifies a master 
2f600 6a 6f 75 72 6e 61 6c 20 77 69 74 68 20 61 20 67  journal with a g
2f610 6f 6f 66 79 20 6e 61 6d 65 2c 20 74 68 65 6e 0a  oofy name, then.
2f620 20 20 20 20 20 20 2a 2a 20 74 68 65 20 27 2d 27        ** the '-'
2f630 20 6d 69 67 68 74 20 62 65 20 6d 69 73 73 69 6e   might be missin
2f640 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  g. */.      if( 
2f650 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b  nDb==0 || zPath[
2f660 6e 44 62 5d 3d 3d 27 2e 27 20 29 20 72 65 74 75  nDb]=='.' ) retu
2f670 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2f680 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d      nDb--;.    }
2f690 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c  .    memcpy(zDb,
2f6a0 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20   zPath, nDb);.  
2f6b0 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30    zDb[nDb] = '\0
2f6c0 27 3b 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74  ';..    rc = get
2f6d0 46 69 6c 65 4d 6f 64 65 28 7a 44 62 2c 20 70 4d  FileMode(zDb, pM
2f6e0 6f 64 65 2c 20 70 55 69 64 2c 20 70 47 69 64 29  ode, pUid, pGid)
2f6f0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
2f700 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2f710 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
2f720 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  ){.    *pMode = 
2f730 30 36 30 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  0600;.  }else if
2f740 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
2f750 5f 4f 50 45 4e 5f 55 52 49 20 29 7b 0a 20 20 20  _OPEN_URI ){.   
2f760 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2f770 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
2f780 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
2f790 20 77 61 73 20 6f 70 65 6e 65 64 20 75 73 69 6e   was opened usin
2f7a0 67 20 61 20 55 52 49 0a 20 20 20 20 2a 2a 20 66  g a URI.    ** f
2f7b0 69 6c 65 6e 61 6d 65 2c 20 63 68 65 63 6b 20 66  ilename, check f
2f7c0 6f 72 20 74 68 65 20 22 6d 6f 64 65 6f 66 22 20  or the "modeof" 
2f7d0 70 61 72 61 6d 65 74 65 72 2e 20 49 66 20 70 72  parameter. If pr
2f7e0 65 73 65 6e 74 2c 20 69 6e 74 65 72 70 72 65 74  esent, interpret
2f7f0 0a 20 20 20 20 2a 2a 20 69 74 73 20 76 61 6c 75  .    ** its valu
2f800 65 20 61 73 20 61 20 66 69 6c 65 6e 61 6d 65 20  e as a filename 
2f810 61 6e 64 20 74 72 79 20 74 6f 20 63 6f 70 79 20  and try to copy 
2f820 74 68 65 20 6d 6f 64 65 2c 20 75 69 64 20 61 6e  the mode, uid an
2f830 64 20 67 69 64 20 66 72 6f 6d 0a 20 20 20 20 2a  d gid from.    *
2f840 2a 20 74 68 61 74 20 66 69 6c 65 2e 20 20 2a 2f  * that file.  */
2f850 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2f860 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  *z = sqlite3_uri
2f870 5f 70 61 72 61 6d 65 74 65 72 28 7a 50 61 74 68  _parameter(zPath
2f880 2c 20 22 6d 6f 64 65 6f 66 22 29 3b 0a 20 20 20  , "modeof");.   
2f890 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
2f8a0 72 63 20 3d 20 67 65 74 46 69 6c 65 4d 6f 64 65  rc = getFileMode
2f8b0 28 7a 2c 20 70 4d 6f 64 65 2c 20 70 55 69 64 2c  (z, pMode, pUid,
2f8c0 20 70 47 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20   pGid);.    }.  
2f8d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2f8e0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
2f8f0 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20   file zPath..** 
2f900 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20  .** Previously, 
2f910 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61  the SQLite OS la
2f920 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66  yer used three f
2f930 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63  unctions in plac
2f940 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65  e of this.** one
2f950 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
2f960 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
2f970 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  te();.**     sql
2f980 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
2f990 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  ly();.**     sql
2f9a0 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
2f9b0 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ive();.**.** The
2f9c0 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70  se calls corresp
2f9d0 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ond to the follo
2f9e0 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
2f9f0 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  s of flags:.**.*
2fa00 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28  *     ReadWrite(
2fa10 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52  ) ->     (READWR
2fa20 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a  ITE | CREATE).**
2fa30 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20       ReadOnly() 
2fa40 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c   ->     (READONL
2fa50 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45  Y) .**     OpenE
2fa60 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52  xclusive() -> (R
2fa70 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
2fa80 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a  E | EXCLUSIVE).*
2fa90 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65  *.** The old Ope
2faa0 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63  nExclusive() acc
2fab0 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20  epted a boolean 
2fac0 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46  argument - "delF
2fad0 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65  lag". If.** true
2fae0 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63  , the file was c
2faf0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20  onfigured to be 
2fb00 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
2fb10 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a  leted when the.*
2fb20 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c  * file handle cl
2fb30 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65  osed. To achieve
2fb40 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74   the same effect
2fb50 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20   using this new 
2fb60 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61  .** interface, a
2fb70 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43  dd the DELETEONC
2fb80 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f  LOSE flag to tho
2fb90 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f  se specified abo
2fba0 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45  ve for .** OpenE
2fbb0 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73  xclusive()..*/.s
2fbc0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70  tatic int unixOp
2fbd0 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
2fbe0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
2fbf0 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f     /* The VFS fo
2fc00 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
2fc10 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64  the xOpen method
2fc20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2fc30 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
2fc40 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f     /* Pathname o
2fc50 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65  f file to be ope
2fc60 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
2fc70 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  _file *pFile,   
2fc80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
2fc90 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
2fca0 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a  be filled in */.
2fcb0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fcd0 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f  * Input flags to
2fce0 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65   control the ope
2fcf0 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ning */.  int *p
2fd00 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
2fd10 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
2fd20 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
2fd30 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a  to SQLite core *
2fd40 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
2fd50 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  *p = (unixFile *
2fd60 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64  )pFile;.  int fd
2fd70 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
2fd80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2fd90 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75   descriptor retu
2fda0 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a  rned by open() *
2fdb0 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  /.  int openFlag
2fdc0 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
2fdd0 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70     /* Flags to p
2fde0 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f  ass to open() */
2fdf0 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
2fe00 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
2fe10 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
2fe20 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
2fe30 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20  nt noLock;      
2fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fe50 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f   True to omit lo
2fe60 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
2fe70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2fe80 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2fe90 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
2fea0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
2feb0 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20    int ctrlFlags 
2fec0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2fed0 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66   /* UNIXFILE_* f
2fee0 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69  lags */..  int i
2fef0 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66  sExclusive  = (f
2ff00 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2ff10 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  EN_EXCLUSIVE);. 
2ff20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
2ff30 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2ff40 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
2ff50 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69  NCLOSE);.  int i
2ff60 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66  sCreate     = (f
2ff70 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2ff80 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e  EN_CREATE);.  in
2ff90 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
2ffa0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2ffb0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2ffc0 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69  .  int isReadWri
2ffd0 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  te  = (flags & S
2ffe0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
2fff0 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54  RITE);.#if SQLIT
30000 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
30010 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41  _STYLE.  int isA
30020 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61  utoProxy  = (fla
30030 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
30040 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e  _AUTOPROXY);.#en
30050 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
30060 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51  __APPLE__) || SQ
30070 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
30080 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75  ING_STYLE.  stru
30090 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
300a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
300b0 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73  f creating a mas
300c0 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65  ter or main-file
300d0 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66   journal, this f
300e0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65  unction will ope
300f0 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65  n.  ** a file-de
30100 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
30110 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54  directory too. T
30120 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e  he first time un
30130 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73  ixSync().  ** is
30140 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65   called the dire
30150 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
30160 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73  iptor will be fs
30170 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73  ync()ed and clos
30180 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  e()d..  */.  int
30190 20 73 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72   syncDir = (isCr
301a0 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20  eate && (.      
301b0 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f    eType==SQLITE_
301c0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
301d0 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
301e0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
301f0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  MAIN_JOURNAL .  
30200 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
30210 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
30220 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75  );..  /* If argu
30230 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20  ment zPath is a 
30240 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68  NULL pointer, th
30250 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
30260 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a  equired to open.
30270 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79    ** a temporary
30280 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20   file. Use this 
30290 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
302a0 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  the file name in
302b0 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ..  */.  char zT
302c0 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  mpname[MAX_PATHN
302d0 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20  AME+2];.  const 
302e0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50  char *zName = zP
302f0 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ath;..  /* Check
30300 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
30310 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
30320 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ue: .  **.  **  
30330 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
30340 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
30350 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
30360 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
30370 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62  , and .  **   (b
30380 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73  ) if CREATE is s
30390 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49  et, then READWRI
303a0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
303b0 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
303c0 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45  (c) if EXCLUSIVE
303d0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
303e0 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
303f0 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64  e set..  **   (d
30400 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f  ) if DELETEONCLO
30410 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  SE is set, then 
30420 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
30430 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
30440 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e  assert((isReadon
30450 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  ly==0 || isReadW
30460 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52  rite==0) && (isR
30470 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65  eadWrite || isRe
30480 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65  adonly));.  asse
30490 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c  rt(isCreate==0 |
304a0 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a  | isReadWrite);.
304b0 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75    assert(isExclu
304c0 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  sive==0 || isCre
304d0 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ate);.  assert(i
304e0 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73  sDelete==0 || is
304f0 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54  Create);..  /* T
30500 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e  he main DB, main
30510 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69   journal, WAL fi
30520 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f  le and master jo
30530 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20  urnal are never 
30540 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
30550 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72  lly deleted. Nor
30560 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74   are they ever t
30570 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
30580 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21   */.  assert( (!
30590 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
305a0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
305b0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
305c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
305d0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
305e0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
305f0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
30600 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
30610 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
30620 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
30630 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
30640 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  STER_JOURNAL );.
30650 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
30660 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
30670 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
30680 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f  OPEN_WAL );..  /
30690 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
306a0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
306b0 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
306c0 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
306d0 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
306e0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
306f0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
30700 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
30710 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
30720 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
30730 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
30740 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
30750 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
30760 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
30770 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
30780 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
30790 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
307a0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
307b0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
307c0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
307d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
307e0 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65  IENT_DB || eType
307f0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
30800 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74  L.  );..  /* Det
30810 65 63 74 20 61 20 70 69 64 20 63 68 61 6e 67 65  ect a pid change
30820 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
30830 52 4e 47 2e 20 20 54 68 65 72 65 20 69 73 20 61  RNG.  There is a
30840 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 0a   race condition.
30850 20 20 2a 2a 20 68 65 72 65 20 73 75 63 68 20 74    ** here such t
30860 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  hat two or more 
30870 74 68 72 65 61 64 73 20 61 6c 6c 20 74 72 79 69  threads all tryi
30880 6e 67 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  ng to open datab
30890 61 73 65 73 20 61 74 0a 20 20 2a 2a 20 74 68 65  ases at.  ** the
308a0 20 73 61 6d 65 20 69 6e 73 74 61 6e 74 20 6d 69   same instant mi
308b0 67 68 74 20 61 6c 6c 20 72 65 73 65 74 20 74 68  ght all reset th
308c0 65 20 50 52 4e 47 2e 20 20 42 75 74 20 6d 75 6c  e PRNG.  But mul
308d0 74 69 70 6c 65 20 72 65 73 65 74 73 0a 20 20 2a  tiple resets.  *
308e0 2a 20 61 72 65 20 68 61 72 6d 6c 65 73 73 2e 0a  * are harmless..
308f0 20 20 2a 2f 0a 20 20 69 66 28 20 72 61 6e 64 6f    */.  if( rando
30900 6d 6e 65 73 73 50 69 64 21 3d 6f 73 47 65 74 70  mnessPid!=osGetp
30910 69 64 28 30 29 20 29 7b 0a 20 20 20 20 72 61 6e  id(0) ){.    ran
30920 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73 47  domnessPid = osG
30930 65 74 70 69 64 28 30 29 3b 0a 20 20 20 20 73 71  etpid(0);.    sq
30940 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
30950 28 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 6d 65  (0,0);.  }..  me
30960 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
30970 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20  f(unixFile));.. 
30980 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
30990 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
309a0 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65  ){.    UnixUnuse
309b0 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20  dFd *pUnused;.  
309c0 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
309d0 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65  ReusableFd(zName
309e0 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
309f0 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
30a00 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
30a10 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >fd;.    }else{.
30a20 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
30a30 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
30a40 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64  (sizeof(*pUnused
30a50 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ));.      if( !p
30a60 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
30a70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30a80 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
30a90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d    }.    }.    p-
30aa0 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
30ab0 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
30ac0 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  .    /* Database
30ad0 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64   filenames are d
30ae0 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
30af0 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72  nated if they ar
30b00 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49  e not.    ** URI
30b10 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  s with parameter
30b20 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20  s.  Hence, they 
30b30 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61  can always be pa
30b40 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ssed into.    **
30b50 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
30b60 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20  ameter(). */.   
30b70 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
30b80 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
30b90 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c  I) || zName[strl
30ba0 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20  en(zName)+1]==0 
30bb0 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  );..  }else if( 
30bc0 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a  !zName ){.    /*
30bd0 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c   If zName is NUL
30be0 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  L, the upper lay
30bf0 65 72 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  er is requesting
30c00 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f   a temp file. */
30c10 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65  .    assert(isDe
30c20 6c 65 74 65 20 26 26 20 21 73 79 6e 63 44 69 72  lete && !syncDir
30c30 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  );.    rc = unix
30c40 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73  GetTempname(pVfs
30c50 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54  ->mxPathname, zT
30c60 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
30c70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30c80 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
30c90 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  c;.    }.    zNa
30ca0 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a  me = zTmpname;..
30cb0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64      /* Generated
30cc0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e   temporary filen
30cd0 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  ames are always 
30ce0 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
30cf0 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f  inated.    ** fo
30d00 72 20 75 73 65 20 62 79 20 73 71 6c 69 74 65 33  r use by sqlite3
30d10 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29  _uri_parameter()
30d20 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
30d30 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e   zName[strlen(zN
30d40 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20  ame)+1]==0 );.  
30d50 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  }..  /* Determin
30d60 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
30d70 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
30d80 65 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53  er passed to POS
30d90 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  IX function.  **
30da0 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d   open(). These m
30db0 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65  ust be calculate
30dc0 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29  d even if open()
30dd0 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20   is not called, 
30de0 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79  as.  ** they may
30df0 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61   be stored as pa
30e00 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  rt of the file h
30e10 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62  andle and used b
30e20 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e  y the .  ** 'con
30e30 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67  ch file' locking
30e40 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72   functions later
30e50 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69   on.  */.  if( i
30e60 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65  sReadonly )  ope
30e70 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  nFlags |= O_RDON
30e80 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64  LY;.  if( isRead
30e90 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67  Write ) openFlag
30ea0 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69  s |= O_RDWR;.  i
30eb0 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20  f( isCreate )   
30ec0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
30ed0 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45  CREAT;.  if( isE
30ee0 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46  xclusive ) openF
30ef0 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c  lags |= (O_EXCL|
30f00 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f  O_NOFOLLOW);.  o
30f10 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c  penFlags |= (O_L
30f20 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
30f30 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20  Y);..  if( fd<0 
30f40 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70  ){.    mode_t op
30f50 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  enMode;         
30f60 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69       /* Permissi
30f70 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66 69  ons to create fi
30f80 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 75  le with */.    u
30f90 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20  id_t uid;       
30fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30fb0 55 73 65 72 69 64 20 66 6f 72 20 74 68 65 20 66  Userid for the f
30fc0 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74  ile */.    gid_t
30fd0 20 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   gid;           
30fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75           /* Grou
30ff0 70 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65  pid for the file
31000 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e   */.    rc = fin
31010 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
31020 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f  zName, flags, &o
31030 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26  penMode, &uid, &
31040 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gid);.    if( rc
31050 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31060 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
31070 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
31080 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73  used );.      as
31090 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
310a0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20  ITE_OPEN_WAL || 
310b0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
310c0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
310d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
310e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64  rc;.    }.    fd
310f0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
31100 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
31110 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20   openMode);.    
31120 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20  OSTRACE(("OPENX 
31130 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22    %-3d %s 0%o\n"
31140 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65  , fd, zName, ope
31150 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 61 73  nFlags));.    as
31160 73 65 72 74 28 20 21 69 73 45 78 63 6c 75 73 69  sert( !isExclusi
31170 76 65 20 7c 7c 20 28 6f 70 65 6e 46 6c 61 67 73  ve || (openFlags
31180 20 26 20 4f 5f 43 52 45 41 54 29 21 3d 30 20 29   & O_CREAT)!=0 )
31190 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26  ;.    if( fd<0 &
311a0 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20  & errno!=EISDIR 
311b0 26 26 20 69 73 52 65 61 64 57 72 69 74 65 20 29  && isReadWrite )
311c0 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65  {.      /* Faile
311d0 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69  d to open the fi
311e0 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  le for read/writ
311f0 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65  e access. Try re
31200 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  ad-only. */.    
31210 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c    flags &= ~(SQL
31220 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
31230 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
31240 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70  REATE);.      op
31250 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52  enFlags &= ~(O_R
31260 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20  DWR|O_CREAT);.  
31270 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
31280 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
31290 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  Y;.      openFla
312a0 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
312b0 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79        isReadonly
312c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d   = 1;.      fd =
312d0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61   robust_open(zNa
312e0 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f  me, openFlags, o
312f0 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  penMode);.    }.
31300 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
31310 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
31320 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
31330 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
31340 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  pen", zName);.  
31350 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
31360 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  nished;.    }.. 
31370 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72     /* If this pr
31380 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67  ocess is running
31390 20 61 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20   as root and if 
313a0 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72  creating a new r
313b0 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a  ollback.    ** j
313c0 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69  ournal or WAL fi
313d0 6c 65 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65  le, set the owne
313e0 72 73 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75  rship of the jou
313f0 72 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62  rnal or WAL to b
31400 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d  e.    ** the sam
31410 65 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61  e as the origina
31420 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  l database..    
31430 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  */.    if( flags
31440 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
31450 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  WAL|SQLITE_OPEN_
31460 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b  MAIN_JOURNAL) ){
31470 0a 20 20 20 20 20 20 72 6f 62 75 73 74 46 63 68  .      robustFch
31480 6f 77 6e 28 66 64 2c 20 75 69 64 2c 20 67 69 64  own(fd, uid, gid
31490 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  );.    }.  }.  a
314a0 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a  ssert( fd>=0 );.
314b0 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
314c0 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  ){.    *pOutFlag
314d0 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
314e0 20 20 69 66 28 20 70 2d 3e 70 50 72 65 61 6c 6c    if( p->pPreall
314f0 6f 63 61 74 65 64 55 6e 75 73 65 64 20 29 7b 0a  ocatedUnused ){.
31500 20 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63      p->pPrealloc
31510 61 74 65 64 55 6e 75 73 65 64 2d 3e 66 64 20 3d  atedUnused->fd =
31520 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65   fd;.    p->pPre
31530 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 2d  allocatedUnused-
31540 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
31550 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c    }..  if( isDel
31560 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  ete ){.#if OS_VX
31570 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20  WORKS.    zPath 
31580 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 69 66 20 64  = zName;.#elif d
31590 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e  efined(SQLITE_UN
315a0 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45  LINK_AFTER_CLOSE
315b0 29 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 73 71  ).    zPath = sq
315c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
315d0 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
315e0 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 7b 0a  if( zPath==0 ){.
315f0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
31600 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(p, fd, __LINE
31610 5f 5f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  __);.      retur
31620 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
31630 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  KPT;.    }.#else
31640 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e  .    osUnlink(zN
31650 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ame);.#endif.  }
31660 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
31670 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
31680 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e  .  else{.    p->
31690 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e  openFlags = open
316a0 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69  Flags;.  }.#endi
316b0 66 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64  f.  .#if defined
316c0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53  (__APPLE__) || S
316d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
316e0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28  KING_STYLE.  if(
316f0 20 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73   fstatfs(fd, &fs
31700 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
31710 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
31720 6f 28 70 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  o(p, errno);.   
31730 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
31740 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
31750 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31760 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
31770 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73    }.  if (0 == s
31780 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20  trncmp("msdos", 
31790 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
317a0 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28  ame, 5)) {.    (
317b0 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
317c0 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51  )->fsFlags |= SQ
317d0 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
317e0 4d 53 44 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20  MSDOS;.  }.  if 
317f0 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65  (0 == strncmp("e
31800 78 66 61 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  xfat", fsInfo.f_
31810 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
31820 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
31830 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
31840 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
31850 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
31860 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
31870 65 74 20 75 70 20 61 70 70 72 6f 70 72 69 61 74  et up appropriat
31880 65 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20  e ctrlFlags */. 
31890 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 20   if( isDelete ) 
318a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
318b0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
318c0 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69  FILE_DELETE;.  i
318d0 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
318e0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
318f0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
31900 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 6e 6f 4c  LE_RDONLY;.  noL
31910 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c  ock = eType!=SQL
31920 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
31930 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29  ;.  if( noLock )
31940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31950 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
31960 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a  NIXFILE_NOLOCK;.
31970 20 20 69 66 28 20 73 79 6e 63 44 69 72 20 29 20    if( syncDir ) 
31980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31990 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
319a0 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20  XFILE_DIRSYNC;. 
319b0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
319c0 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63  ITE_OPEN_URI ) c
319d0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
319e0 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53  FILE_URI;..#if S
319f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
31a00 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53  KING_STYLE.#if S
31a10 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
31a20 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41  XY_LOCKING.  isA
31a30 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65  utoProxy = 1;.#e
31a40 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75 74  ndif.  if( isAut
31a50 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68  oProxy && (zPath
31a60 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c  !=NULL) && (!noL
31a70 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f  ock) && pVfs->xO
31a80 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  pen ){.    char 
31a90 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65  *envforce = gete
31aa0 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45  nv("SQLITE_FORCE
31ab0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29  _PROXY_LOCKING")
31ac0 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f  ;.    int usePro
31ad0 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  xy = 0;..    /* 
31ae0 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
31af0 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65  XY_LOCKING==1 me
31b00 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73  ans force always
31b10 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65   use proxy, 0 me
31b20 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65  ans .    ** neve
31b30 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c  r use proxy, NUL
31b40 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78  L means use prox
31b50 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20  y for non-local 
31b60 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a  files only.  */.
31b70 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65      if( envforce
31b80 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  !=NULL ){.      
31b90 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28  useProxy = atoi(
31ba0 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20  envforce)>0;.   
31bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 73   }else{.      us
31bc0 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66  eProxy = !(fsInf
31bd0 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f  o.f_flags&MNT_LO
31be0 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  CAL);.    }.    
31bf0 69 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a  if( useProxy ){.
31c00 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49        rc = fillI
31c10 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
31c20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
31c30 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20  , ctrlFlags);.  
31c40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31c50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31c60 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73   rc = proxyTrans
31c70 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e  formUnixFile((un
31c80 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22  ixFile*)pFile, "
31c90 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20  :auto:");.      
31ca0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31cb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
31cc0 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73   /* Use unixClos
31cd0 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68  e to clean up th
31ce0 65 20 72 65 73 6f 75 72 63 65 73 20 61 64 64 65  e resources adde
31cf0 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46  d in fillInUnixF
31d00 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ile .          *
31d10 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20  * and clear all 
31d20 74 68 65 20 73 74 72 75 63 74 75 72 65 27 73 20  the structure's 
31d30 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65  references.  Spe
31d40 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20  cifically, .    
31d50 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e        ** pFile->
31d60 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65  pMethods will be
31d70 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33   NULL so sqlite3
31d80 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20  OsClose will be 
31d90 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20  a no-op .       
31da0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
31db0 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29  unixClose(pFile)
31dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
31dd0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
31de0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
31df0 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
31e00 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  d;.    }.  }.#en
31e10 64 69 66 0a 20 20 0a 20 20 61 73 73 65 72 74 28  dif.  .  assert(
31e20 20 7a 50 61 74 68 3d 3d 30 20 7c 7c 20 7a 50 61   zPath==0 || zPa
31e30 74 68 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20  th[0]=='/' .    
31e40 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
31e50 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
31e60 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
31e70 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
31e80 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 29 3b 0a  N_JOURNAL .  );.
31e90 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
31ea0 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
31eb0 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74  pFile, zPath, ct
31ec0 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f  rlFlags);..open_
31ed0 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20  finished:.  if( 
31ee0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31ef0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
31f00 65 28 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74  e(p->pPreallocat
31f10 65 64 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20  edUnused);.  }. 
31f20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
31f30 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
31f40 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20   file at zPath. 
31f50 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61  If the dirSync a
31f60 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
31f70 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20   fsync().** the 
31f80 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
31f90 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
31fa0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
31fb0 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73   unixDelete(.  s
31fc0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
31fd0 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20  sed,     /* VFS 
31fe0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
31ff0 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d  as the xDelete m
32000 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
32010 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
32020 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
32030 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
32040 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53  ed */.  int dirS
32050 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
32060 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73    /* If true, fs
32070 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20  ync() directory 
32080 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66  after deleting f
32090 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
320a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
320b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
320c0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
320d0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
320e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
320f0 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66  RR_DELETE);.  if
32100 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68  ( osUnlink(zPath
32110 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69  )==(-1) ){.    i
32120 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  f( errno==ENOENT
32130 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
32140 20 20 20 20 20 20 20 20 7c 7c 20 6f 73 41 63 63          || osAcc
32150 65 73 73 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a  ess(zPath,0)!=0.
32160 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20  #endif.    ){.  
32170 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32180 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
32190 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  NT;.    }else{. 
321a0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
321b0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
321c0 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c  ERR_DELETE, "unl
321d0 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ink", zPath);.  
321e0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
321f0 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  c;.  }.#ifndef S
32200 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
32210 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72  RSYNC.  if( (dir
32220 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a  Sync & 1)!=0 ){.
32230 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
32240 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
32250 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
32260 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
32270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32280 20 69 66 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28   if( full_fsync(
32290 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20  fd,0,0) ){.     
322a0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
322b0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
322c0 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73  R_DIR_FSYNC, "fs
322d0 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ync", zPath);.  
322e0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75      }.      robu
322f0 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
32300 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
32310 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
32320 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  rt( rc==SQLITE_C
32330 41 4e 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20  ANTOPEN );.     
32340 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32350 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
32360 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
32370 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  ../*.** Test the
32380 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 6f 72   existence of or
32390 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
323a0 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74  ons of file zPat
323b0 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70  h. The.** test p
323c0 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73  erformed depends
323d0 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
323e0 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
323f0 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
32400 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31  EXISTS: Return 1
32410 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   if the file exi
32420 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  sts.**     SQLIT
32430 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
32440 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  TE: Return 1 if 
32450 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
32460 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a   and writable..*
32470 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
32480 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65  ESS_READONLY: Re
32490 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
324a0 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a  le is readable..
324b0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  **.** Otherwise 
324c0 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
324d0 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65  tic int unixAcce
324e0 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
324f0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a  s *NotUsed,   /*
32500 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e   The VFS contain
32510 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73  ing this xAccess
32520 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
32530 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
32540 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
32550 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d  the file to exam
32560 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ine */.  int fla
32570 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
32580 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77   /* What do we w
32590 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f  ant to learn abo
325a0 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c  ut the zPath fil
325b0 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  e? */.  int *pRe
325c0 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
325d0 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20  /* Write result 
325e0 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a  boolean here */.
325f0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
32600 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
32610 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
32620 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
32630 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29  _IOERR_ACCESS; )
32640 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
32650 4f 75 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Out!=0 );..  /* 
32660 54 68 65 20 73 70 65 63 20 73 61 79 73 20 74 68  The spec says th
32670 65 72 65 20 61 72 65 20 74 68 72 65 65 20 70 6f  ere are three po
32680 73 73 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f  ssible values fo
32690 72 20 66 6c 61 67 73 2e 20 20 42 75 74 20 6f 6e  r flags.  But on
326a0 6c 79 0a 20 20 2a 2a 20 74 77 6f 20 6f 66 20 74  ly.  ** two of t
326b0 68 65 6d 20 61 72 65 20 61 63 74 75 61 6c 6c 79  hem are actually
326c0 20 75 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72   used */.  asser
326d0 74 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  t( flags==SQLITE
326e0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 7c  _ACCESS_EXISTS |
326f0 7c 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  | flags==SQLITE_
32700 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
32710 20 29 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73   );..  if( flags
32720 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  ==SQLITE_ACCESS_
32730 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 73 74  EXISTS ){.    st
32740 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
32750 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 30     *pResOut = (0
32760 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20  ==osStat(zPath, 
32770 26 62 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f  &buf) && buf.st_
32780 73 69 7a 65 3e 30 29 3b 0a 20 20 7d 65 6c 73 65  size>0);.  }else
32790 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d  {.    *pResOut =
327a0 20 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c   osAccess(zPath,
327b0 20 57 5f 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b 0a   W_OK|R_OK)==0;.
327c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
327d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
327e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
327f0 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  kFullPathname(. 
32800 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
32810 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
32820 20 2f 2a 20 49 6e 70 75 74 20 70 61 74 68 20 2a   /* Input path *
32830 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20  /.  char *zOut, 
32840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32850 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
32860 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ffer */.  int nO
32870 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
32880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
32890 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 62  ocated size of b
328a0 75 66 66 65 72 20 7a 4f 75 74 20 2a 2f 0a 29 7b  uffer zOut */.){
328b0 0a 20 20 69 6e 74 20 6e 50 61 74 68 20 3d 20 73  .  int nPath = s
328c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
328d0 50 61 74 68 29 3b 0a 20 20 69 6e 74 20 69 4f 66  Path);.  int iOf
328e0 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 50 61  f = 0;.  if( zPa
328f0 74 68 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20  th[0]!='/' ){.  
32900 20 20 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a    if( osGetcwd(z
32910 4f 75 74 2c 20 6e 4f 75 74 2d 32 29 3d 3d 30 20  Out, nOut-2)==0 
32920 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
32930 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
32940 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
32950 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61  T, "getcwd", zPa
32960 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  th);.    }.    i
32970 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Off = sqlite3Str
32980 6c 65 6e 33 30 28 7a 4f 75 74 29 3b 0a 20 20 20  len30(zOut);.   
32990 20 7a 4f 75 74 5b 69 4f 66 66 2b 2b 5d 20 3d 20   zOut[iOff++] = 
329a0 27 2f 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  '/';.  }.  if( (
329b0 69 4f 66 66 2b 6e 50 61 74 68 2b 31 29 3e 6e 4f  iOff+nPath+1)>nO
329c0 75 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 51 4c  ut ){.    /* SQL
329d0 69 74 65 20 61 73 73 75 6d 65 73 20 74 68 61 74  ite assumes that
329e0 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29   xFullPathname()
329f0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 73 20   nul-terminates 
32a00 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
32a10 72 0a 20 20 20 20 2a 2a 20 65 76 65 6e 20 69 66  r.    ** even if
32a20 20 69 74 20 72 65 74 75 72 6e 73 20 61 6e 20 65   it returns an e
32a30 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 7a 4f  rror.  */.    zO
32a40 75 74 5b 69 4f 66 66 5d 20 3d 20 27 5c 30 27 3b  ut[iOff] = '\0';
32a50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
32a60 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
32a70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
32a80 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 69 4f  snprintf(nOut-iO
32a90 66 66 2c 20 26 7a 4f 75 74 5b 69 4f 66 66 5d 2c  ff, &zOut[iOff],
32aa0 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20   "%s", zPath);. 
32ab0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
32ac0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  K;.}../*.** Turn
32ad0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
32ae0 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
32af0 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72   pathname. The r
32b00 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20  elative path.** 
32b10 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e  is stored as a n
32b20 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
32b30 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66  ring in the buff
32b40 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
32b50 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a  .** zPath. .**.*
32b60 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f  * zOut points to
32b70 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
32b80 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66  least sqlite3_vf
32b90 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  s.mxPathname byt
32ba0 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20  es .** (in this 
32bb0 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41  case, MAX_PATHNA
32bc0 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66  ME bytes). The f
32bd0 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74  ull-path is writ
32be0 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62  ten to.** this b
32bf0 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74  uffer before ret
32c00 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
32c10 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61  c int unixFullPa
32c20 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
32c30 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
32c40 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
32c50 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
32c60 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
32c70 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
32c80 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
32c90 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
32ca0 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  ath */.  int nOu
32cb0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
32cc0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
32cd0 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
32ce0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
32cf0 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
32d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
32d10 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
32d20 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ){.#if !defined(
32d30 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 29 20 7c  HAVE_READLINK) |
32d40 7c 20 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f  | !defined(HAVE_
32d50 4c 53 54 41 54 29 0a 20 20 72 65 74 75 72 6e 20  LSTAT).  return 
32d60 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a  mkFullPathname(z
32d70 50 61 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74  Path, zOut, nOut
32d80 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  );.#else.  int r
32d90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
32da0 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
32db0 74 20 6e 4c 69 6e 6b 20 3d 20 31 3b 20 20 20 20  t nLink = 1;    
32dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
32dd0 75 6d 62 65 72 20 6f 66 20 73 79 6d 62 6f 6c 69  umber of symboli
32de0 63 20 6c 69 6e 6b 73 20 66 6f 6c 6c 6f 77 65 64  c links followed
32df0 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 6f 6e   so far */.  con
32e00 73 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a  st char *zIn = z
32e10 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Path;      /* In
32e20 70 75 74 20 70 61 74 68 20 66 6f 72 20 65 61 63  put path for eac
32e30 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c  h iteration of l
32e40 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  oop */.  char *z
32e50 44 65 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  Del = 0;..  asse
32e60 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  rt( pVfs->mxPath
32e70 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41  name==MAX_PATHNA
32e80 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ME );.  UNUSED_P
32e90 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
32ea0 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
32eb0 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
32ec0 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
32ed0 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
32ee0 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
32ef0 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
32f00 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
32f10 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
32f20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
32f30 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
32f40 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
32f50 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
32f60 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
32f70 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
32f80 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
32f90 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
32fa0 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
32fb0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
32fc0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
32fd0 29 3b 0a 0a 20 20 64 6f 20 7b 0a 0a 20 20 20 20  );..  do {..    
32fe0 2f 2a 20 43 61 6c 6c 20 73 74 61 74 28 29 20 6f  /* Call stat() o
32ff0 6e 20 70 61 74 68 20 7a 49 6e 2e 20 53 65 74 20  n path zIn. Set 
33000 62 4c 69 6e 6b 20 74 6f 20 74 72 75 65 20 69 66  bLink to true if
33010 20 74 68 65 20 70 61 74 68 20 69 73 20 61 20 73   the path is a s
33020 79 6d 62 6f 6c 69 63 0a 20 20 20 20 2a 2a 20 6c  ymbolic.    ** l
33030 69 6e 6b 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  ink, or false ot
33040 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a 20 20 20  herwise.  */.   
33050 20 69 6e 74 20 62 4c 69 6e 6b 20 3d 20 30 3b 0a   int bLink = 0;.
33060 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
33070 62 75 66 3b 0a 20 20 20 20 69 66 28 20 6f 73 4c  buf;.    if( osL
33080 73 74 61 74 28 7a 49 6e 2c 20 26 62 75 66 29 21  stat(zIn, &buf)!
33090 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
330a0 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
330b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
330c0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
330d0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
330e0 20 22 6c 73 74 61 74 22 2c 20 7a 49 6e 29 3b 0a   "lstat", zIn);.
330f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
33100 65 7b 0a 20 20 20 20 20 20 62 4c 69 6e 6b 20 3d  e{.      bLink =
33110 20 53 5f 49 53 4c 4e 4b 28 62 75 66 2e 73 74 5f   S_ISLNK(buf.st_
33120 6d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  mode);.    }..  
33130 20 20 69 66 28 20 62 4c 69 6e 6b 20 29 7b 0a 20    if( bLink ){. 
33140 20 20 20 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30       if( zDel==0
33150 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c   ){.        zDel
33160 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
33170 63 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  c(nOut);.       
33180 20 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29 20 72   if( zDel==0 ) r
33190 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
331a0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
331b0 73 65 20 69 66 28 20 2b 2b 6e 4c 69 6e 6b 3e 53  se if( ++nLink>S
331c0 51 4c 49 54 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e  QLITE_MAX_SYMLIN
331d0 4b 53 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  KS ){.        rc
331e0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
331f0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EN_BKPT;.      }
33200 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
33210 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33220 20 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 52       nByte = osR
33230 65 61 64 6c 69 6e 6b 28 7a 49 6e 2c 20 7a 44 65  eadlink(zIn, zDe
33240 6c 2c 20 6e 4f 75 74 2d 31 29 3b 0a 20 20 20 20  l, nOut-1);.    
33250 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 30 20      if( nByte<0 
33260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
33270 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
33280 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
33290 4b 50 54 2c 20 22 72 65 61 64 6c 69 6e 6b 22 2c  KPT, "readlink",
332a0 20 7a 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d   zIn);.        }
332b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
332c0 69 66 28 20 7a 44 65 6c 5b 30 5d 21 3d 27 2f 27  if( zDel[0]!='/'
332d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
332e0 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  int n;.         
332f0 20 20 20 66 6f 72 28 6e 20 3d 20 73 71 6c 69 74     for(n = sqlit
33300 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 6e 29 3b  e3Strlen30(zIn);
33310 20 6e 3e 30 20 26 26 20 7a 49 6e 5b 6e 2d 31 5d   n>0 && zIn[n-1]
33320 21 3d 27 2f 27 3b 20 6e 2d 2d 29 3b 0a 20 20 20  !='/'; n--);.   
33330 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 42 79           if( nBy
33340 74 65 2b 6e 2b 31 3e 6e 4f 75 74 20 29 7b 0a 20  te+n+1>nOut ){. 
33350 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
33360 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
33370 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  N_BKPT;.        
33380 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33390 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65           memmove
333a0 28 26 7a 44 65 6c 5b 6e 5d 2c 20 7a 44 65 6c 2c  (&zDel[n], zDel,
333b0 20 6e 42 79 74 65 2b 31 29 3b 0a 20 20 20 20 20   nByte+1);.     
333c0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
333d0 7a 44 65 6c 2c 20 7a 49 6e 2c 20 6e 29 3b 0a 20  zDel, zIn, n);. 
333e0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
333f0 74 65 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20  te += n;.       
33400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
33410 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 44 65   }.          zDe
33420 6c 5b 6e 42 79 74 65 5d 20 3d 20 27 5c 30 27 3b  l[nByte] = '\0';
33430 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33440 20 7d 0a 0a 20 20 20 20 20 20 7a 49 6e 20 3d 20   }..      zIn = 
33450 7a 44 65 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  zDel;.    }..   
33460 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
33470 49 54 45 5f 4f 4b 20 7c 7c 20 7a 49 6e 21 3d 7a  ITE_OK || zIn!=z
33480 4f 75 74 20 7c 7c 20 7a 49 6e 5b 30 5d 3d 3d 27  Out || zIn[0]=='
33490 2f 27 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  /' );.    if( rc
334a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
334b0 49 6e 21 3d 7a 4f 75 74 20 29 7b 0a 20 20 20 20  In!=zOut ){.    
334c0 20 20 72 63 20 3d 20 6d 6b 46 75 6c 6c 50 61 74    rc = mkFullPat
334d0 68 6e 61 6d 65 28 7a 49 6e 2c 20 7a 4f 75 74 2c  hname(zIn, zOut,
334e0 20 6e 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20   nOut);.    }.  
334f0 20 20 69 66 28 20 62 4c 69 6e 6b 3d 3d 30 20 29    if( bLink==0 )
33500 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 49 6e 20   break;.    zIn 
33510 3d 20 7a 4f 75 74 3b 0a 20 20 7d 77 68 69 6c 65  = zOut;.  }while
33520 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33530 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
33540 65 65 28 7a 44 65 6c 29 3b 0a 20 20 72 65 74 75  ee(zDel);.  retu
33550 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 20 20 20  rn rc;.#endif   
33560 2f 2a 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b  /* HAVE_READLINK
33570 20 26 26 20 48 41 56 45 5f 4c 53 54 41 54 20 2a   && HAVE_LSTAT *
33580 2f 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  /.}...#ifndef SQ
33590 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
335a0 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
335b0 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
335c0 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
335d0 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
335e0 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
335f0 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
33600 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
33610 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
33620 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  d library..*/.#i
33630 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e  nclude <dlfcn.h>
33640 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
33650 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ixDlOpen(sqlite3
33660 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63  _vfs *NotUsed, c
33670 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
33680 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  name){.  UNUSED_
33690 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
336a0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f  d);.  return dlo
336b0 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52  pen(zFilename, R
336c0 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47  TLD_NOW | RTLD_G
336d0 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LOBAL);.}../*.**
336e0 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
336f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65  is function imme
33700 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20  diately after a 
33710 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79  call to unixDlSy
33720 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c  m() or.** unixDl
33730 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65  Open() fails (re
33740 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69  turns a null poi
33750 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65  nter). If a more
33760 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a   detailed error.
33770 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76  ** message is av
33780 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77  ailable, it is w
33790 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75  ritten to zBufOu
337a0 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d  t. If no error m
337b0 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61  essage.** is ava
337c0 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20  ilable, zBufOut 
337d0 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
337e0 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73  ed and SQLite us
337f0 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20  es a default.** 
33800 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
33810 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
33820 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ixDlError(sqlite
33830 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
33840 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
33850 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73  zBufOut){.  cons
33860 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20  t char *zErr;.  
33870 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
33880 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69  (NotUsed);.  uni
33890 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
338a0 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28   zErr = dlerror(
338b0 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
338c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
338d0 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
338e0 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29  Out, "%s", zErr)
338f0 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
33900 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74  eMutex();.}.stat
33910 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c  ic void (*unixDl
33920 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
33930 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
33940 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53  p, const char*zS
33950 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a  ym))(void){.  /*
33960 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20   .  ** GCC with 
33970 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
33980 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64   says that C90 d
33990 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
339a0 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a  void* to be.  **
339b0 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69   cast into a poi
339c0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
339d0 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65  on.  And yet the
339e0 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29   library dlsym()
339f0 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65   routine.  ** re
33a00 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68  turns a void* wh
33a10 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ich is really a 
33a20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
33a30 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64  ction.  So how d
33a40 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c  o we.  ** use dl
33a50 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61  sym() with -peda
33a60 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a  ntic-errors?.  *
33a70 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20  *.  ** Variable 
33a80 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e  x below is defin
33a90 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74  ed to be a point
33aa0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
33ab0 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72   taking.  ** par
33ac0 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e  ameters void* an
33ad0 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e  d const char* an
33ae0 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f  d returning a po
33af0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
33b00 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69  ion..  ** We ini
33b10 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73  tialize x by ass
33b20 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e  igning it a poin
33b30 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d  ter to the dlsym
33b40 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  () function..  *
33b50 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65  * (That assignme
33b60 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61  nt requires a ca
33b70 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61  st.)  Then we ca
33b80 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ll the function 
33b90 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e  that.  ** x poin
33ba0 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20  ts to.  .  **.  
33bb0 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f  ** This work-aro
33bc0 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20  und is unlikely 
33bd0 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  to work correctl
33be0 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20  y on any system 
33bf0 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72  where.  ** you r
33c00 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73  eally cannot cas
33c10 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  t a function poi
33c20 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e  nter into void*.
33c30 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74    But then, on t
33c40 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61  he.  ** other ha
33c50 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c  nd, dlsym() will
33c60 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63   not work on suc
33c70 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65  h a system eithe
33c80 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20  r, so we have.  
33c90 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f  ** not really lo
33ca0 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a  st anything..  *
33cb0 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28  /.  void (*(*x)(
33cc0 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
33cd0 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55  *))(void);.  UNU
33ce0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
33cf0 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76  tUsed);.  x = (v
33d00 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63  oid(*(*)(void*,c
33d10 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
33d20 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75  d))dlsym;.  retu
33d30 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29  rn (*x)(p, zSym)
33d40 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
33d50 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69  unixDlClose(sqli
33d60 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
33d70 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
33d80 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
33d90 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
33da0 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65   dlclose(pHandle
33db0 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
33dc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
33dd0 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
33de0 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
33df0 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20  fine unixDlOpen 
33e00 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
33e10 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  xDlError 0.  #de
33e20 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20  fine unixDlSym  
33e30 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
33e40 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  xDlClose 0.#endi
33e50 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e  f../*.** Write n
33e60 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
33e70 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20  dom data to the 
33e80 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20  supplied buffer 
33e90 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
33ea0 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65  int unixRandomne
33eb0 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
33ec0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
33ed0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
33ee0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
33ef0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61  ER(NotUsed);.  a
33f00 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42  ssert((size_t)nB
33f10 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65  uf>=(sizeof(time
33f20 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  _t)+sizeof(int))
33f30 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  );..  /* We have
33f40 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
33f50 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
33f60 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
33f70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
33f80 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
33f90 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
33fa0 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
33fb0 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
33fc0 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
33fd0 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
33fe0 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
33ff0 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
34000 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
34010 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
34020 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
34030 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
34040 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
34050 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
34060 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
34070 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
34080 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
34090 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
340a0 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
340b0 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
340c0 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
340d0 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
340e0 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
340f0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
34100 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
34110 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
34120 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
34130 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
34140 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
34150 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
34160 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
34170 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
34180 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
34190 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
341a0 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
341b0 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20  Buf, 0, nBuf);. 
341c0 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d   randomnessPid =
341d0 20 6f 73 47 65 74 70 69 64 28 30 29 3b 20 20 0a   osGetpid(0);  .
341e0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
341f0 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
34200 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
34210 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20  T_RANDOMNESS).  
34220 7b 0a 20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f  {.    int fd, go
34230 74 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  t;.    fd = robu
34240 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72  st_open("/dev/ur
34250 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59  andom", O_RDONLY
34260 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64  , 0);.    if( fd
34270 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
34280 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
34290 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
342a0 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
342b0 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 6d  eof(t));.      m
342c0 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65  emcpy(&zBuf[size
342d0 6f 66 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e  of(t)], &randomn
342e0 65 73 73 50 69 64 2c 20 73 69 7a 65 6f 66 28 72  essPid, sizeof(r
342f0 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a  andomnessPid));.
34300 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
34310 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 72  zeof(t)+sizeof(r
34320 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28  andomnessPid)<=(
34330 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20  size_t)nBuf );. 
34340 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65       nBuf = size
34350 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 72  of(t) + sizeof(r
34360 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20  andomnessPid);. 
34370 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34380 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64  do{ got = osRead
34390 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29  (fd, zBuf, nBuf)
343a0 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  ; }while( got<0 
343b0 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
343c0 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
343d0 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c  close(0, fd, __L
343e0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20  INE__);.    }.  
343f0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
34400 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n nBuf;.}.../*.*
34410 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
34420 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
34430 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
34440 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a  f time slept..**
34450 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
34460 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
34470 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77  icroseconds we w
34480 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a  ant to sleep..**
34490 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
344a0 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
344b0 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
344c0 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c  of sleep actuall
344d0 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66  y.** requested f
344e0 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  rom the underlyi
344f0 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ng operating sys
34500 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68  tem, a number wh
34510 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
34520 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
34530 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67  equal to the arg
34540 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c  ument, but not l
34550 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20  ess.** than the 
34560 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
34570 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65  tic int unixSlee
34580 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  p(sqlite3_vfs *N
34590 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72  otUsed, int micr
345a0 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f  oseconds){.#if O
345b0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
345c0 63 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a  ct timespec sp;.
345d0 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d  .  sp.tv_sec = m
345e0 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30  icroseconds / 10
345f0 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e  00000;.  sp.tv_n
34600 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  sec = (microseco
34610 6e 64 73 20 25 20 31 30 30 30 30 30 30 29 20 2a  nds % 1000000) *
34620 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65   1000;.  nanosle
34630 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20  ep(&sp, NULL);. 
34640 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
34650 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
34660 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
34670 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  s;.#elif defined
34680 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26  (HAVE_USLEEP) &&
34690 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75   HAVE_USLEEP.  u
346a0 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e  sleep(microsecon
346b0 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ds);.  UNUSED_PA
346c0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
346d0 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f  ;.  return micro
346e0 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20  seconds;.#else. 
346f0 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28   int seconds = (
34700 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39  microseconds+999
34710 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20  999)/1000000;.  
34720 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a  sleep(seconds);.
34730 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
34740 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
34750 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30  eturn seconds*10
34760 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  00000;.#endif.}.
34770 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
34780 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
34790 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
347a0 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e  ero value, is in
347b0 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20  terpreted as.** 
347c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
347d0 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
347e0 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20   and is used to 
347f0 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
34800 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75  f.** sqlite3OsCu
34810 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69  rrentTime() duri
34820 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  ng testing..*/.#
34830 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
34840 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
34850 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20  rrent_time = 0; 
34860 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20   /* Fake system 
34870 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20  time in seconds 
34880 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23  since 1970. */.#
34890 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
348a0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
348b0 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
348c0 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
348d0 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  e).  Write into 
348e0 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75  *piNow.** the cu
348f0 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
34900 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
34910 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73  Day number times
34920 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e   86_400_000.  In
34930 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  .** other words,
34940 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   write into *piN
34950 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ow the number of
34960 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69   milliseconds si
34970 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a  nce the Julian.*
34980 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20  * epoch of noon 
34990 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20  in Greenwich on 
349a0 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31  November 24, 471
349b0 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20  4 B.C according 
349c0 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70  to the.** prolep
349d0 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61  tic Gregorian ca
349e0 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  lendar..**.** On
349f0 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
34a00 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74   SQLITE_OK.  Ret
34a10 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
34a20 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
34a30 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74   date .** cannot
34a40 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
34a50 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
34a60 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71  rentTimeInt64(sq
34a70 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
34a80 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ed, sqlite3_int6
34a90 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61  4 *piNow){.  sta
34aa0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
34ab0 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
34ac0 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
34ad0 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
34ae0 30 30 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  000;.  int rc = 
34af0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64  SQLITE_OK;.#if d
34b00 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44  efined(NO_GETTOD
34b10 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20  ).  time_t t;.  
34b20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e  time(&t);.  *piN
34b30 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69  ow = ((sqlite3_i
34b40 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75  nt64)t)*1000 + u
34b50 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20  nixEpoch;.#elif 
34b60 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
34b70 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f  uct timespec sNo
34b80 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69  w;.  clock_getti
34b90 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d  me(CLOCK_REALTIM
34ba0 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69  E, &sNow);.  *pi
34bb0 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20  Now = unixEpoch 
34bc0 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  + 1000*(sqlite3_
34bd0 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65  int64)sNow.tv_se
34be0 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63  c + sNow.tv_nsec
34bf0 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a  /1000000;.#else.
34c00 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
34c10 20 73 4e 6f 77 3b 0a 20 20 28 76 6f 69 64 29 67   sNow;.  (void)g
34c20 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f  ettimeofday(&sNo
34c30 77 2c 20 30 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f  w, 0);  /* Canno
34c40 74 20 66 61 69 6c 20 67 69 76 65 6e 20 76 61 6c  t fail given val
34c50 69 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  id arguments */.
34c60 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45    *piNow = unixE
34c70 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c  poch + 1000*(sql
34c80 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e  ite3_int64)sNow.
34c90 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76  tv_sec + sNow.tv
34ca0 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64  _usec/1000;.#end
34cb0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
34cc0 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
34cd0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
34ce0 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
34cf0 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
34d00 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
34d10 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
34d20 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
34d30 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
34d40 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
34d50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34d60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
34d70 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
34d80 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
34d90 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
34da0 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
34db0 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
34dc0 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
34dd0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
34de0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
34df0 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
34e00 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
34e10 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
34e20 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
34e30 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
34e40 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
34e50 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
34e60 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
34e70 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a  otUsed, double *
34e80 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65  prNow){.  sqlite
34e90 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20  3_int64 i = 0;. 
34ea0 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45   int rc;.  UNUSE
34eb0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
34ec0 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69  sed);.  rc = uni
34ed0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
34ee0 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e  4(0, &i);.  *prN
34ef0 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e  ow = i/86400000.
34f00 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
34f10 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
34f20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
34f30 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
34f40 20 54 68 65 20 78 47 65 74 4c 61 73 74 45 72 72   The xGetLastErr
34f50 6f 72 28 29 20 6d 65 74 68 6f 64 20 69 73 20 64  or() method is d
34f60 65 73 69 67 6e 65 64 20 74 6f 20 72 65 74 75 72  esigned to retur
34f70 6e 20 61 20 62 65 74 74 65 72 0a 2a 2a 20 6c 6f  n a better.** lo
34f80 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65  w-level error me
34f90 73 73 61 67 65 20 77 68 65 6e 20 6f 70 65 72 61  ssage when opera
34fa0 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62  ting-system prob
34fb0 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20  lems come up.** 
34fc0 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70  during SQLite op
34fd0 65 72 61 74 69 6f 6e 2e 20 20 4f 6e 6c 79 20 74  eration.  Only t
34fe0 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75 72  he integer retur
34ff0 6e 20 63 6f 64 65 20 69 73 20 63 75 72 72 65 6e  n code is curren
35000 74 6c 79 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a  tly.** used..*/.
35010 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
35020 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
35030 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
35040 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20  , int NotUsed2, 
35050 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b  char *NotUsed3){
35060 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
35070 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
35080 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
35090 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e  (NotUsed2);.  UN
350a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
350b0 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75  otUsed3);.  retu
350c0 72 6e 20 65 72 72 6e 6f 3b 0a 7d 0a 0a 0a 2f 2a  rn errno;.}.../*
350d0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
350e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
350f0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
35100 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
35110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35120 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
35130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
35170 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
35180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
351a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
351b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
351c0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
351d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
351e0 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67  in Proxy Locking
351f0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
35200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35210 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  *.**.** Proxy lo
35220 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72  cking is a "uber
35230 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22  -locking-method"
35240 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20   in this sense: 
35250 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20   It uses the.** 
35260 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65  other locking me
35270 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61  thods on seconda
35280 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20  ry lock files.  
35290 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
352a0 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72   a.** meta-layer
352b0 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65   over top of the
352c0 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
352d0 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  ng implemented a
352e0 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  bove.  For.** th
352f0 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
35300 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
35310 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79  lements of proxy
35320 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65   locking is defe
35330 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61  rred.** until la
35340 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28  te in the file (
35350 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20  here) after all 
35360 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f  of the other I/O
35370 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a   methods have.**
35380 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20   been defined - 
35390 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d  so that the prim
353a0 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  itive locking me
353b0 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61  thods are availa
353c0 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63  ble.** as servic
353d0 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20  es to help with 
353e0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
353f0 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  on of proxy lock
35400 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a  ing..**.****.**.
35410 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c  ** The default l
35420 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69  ocking schemes i
35430 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74  n SQLite use byt
35440 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e  e-range locks on
35450 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
35460 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e   file to coordin
35470 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72  ate safe, concur
35480 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d  rent access by m
35490 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a  ultiple readers.
354a0 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b  ** and writers [
354b0 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
354c0 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c  g/lockingv3.html
354d0 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c  ].  The five fil
354e0 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61  e locking.** sta
354f0 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50  tes (UNLOCKED, P
35500 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20  ENDING, SHARED, 
35510 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53  RESERVED, EXCLUS
35520 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  IVE) are impleme
35530 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58  nted.** as POSIX
35540 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f   read & write lo
35550 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73  cks over fixed s
35560 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20  et of locations 
35570 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20  (via fsctl),.** 
35580 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f  on AFP and SMB o
35590 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79  nly exclusive by
355a0 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
355b0 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61  re available via
355c0 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f   fsctl.** with _
355d0 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
355e0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
355f0 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20  ckPB2) to track 
35600 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65  the same 5 state
35610 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74  s..** To simulat
35620 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74  e a F_RDLCK on t
35630 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c  he shared range,
35640 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d   on AFP a random
35650 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  ly selected.** a
35660 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68  ddress in the sh
35670 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
35680 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44  ken for a SHARED
35690 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72   lock, the entir
356a0 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67  e.** shared rang
356b0 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
356c0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
356d0 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45  ):.**.**      PE
356e0 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20  NDING_BYTE      
356f0 20 20 30 78 34 30 30 30 30 30 30 30 0a 2a 2a 20    0x40000000.** 
35700 20 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59       RESERVED_BY
35710 54 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30  TE       0x40000
35720 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  001.**      SHAR
35730 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20  ED_RANGE        
35740 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78  0x40000002 -> 0x
35750 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54  40000200.**.** T
35760 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f  his works well o
35770 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65  n the local file
35780 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f   system, but sho
35790 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78  ws a nearly 100x
357a0 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20  .** slowdown in 
357b0 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65  read performance
357c0 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20   on AFP because 
357d0 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64  the AFP client d
357e0 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72  isables.** the r
357f0 65 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62  ead cache when b
35800 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
35810 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e  are present.  En
35820 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a  abling the read.
35830 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73  ** cache exposes
35840 20 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e   a cache coheren
35850 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20  cy problem that 
35860 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c  is present on al
35870 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72  l OS X.** suppor
35880 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65  ted network file
35890 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61   systems.  NFS a
358a0 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65  nd AFP both obse
358b0 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65  rve the.** close
358c0 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69  -to-open semanti
358d0 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  cs for ensuring 
358e0 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a  cache coherency.
358f0 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73  ** [http://nfs.s
35900 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23  ourceforge.net/#
35910 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64  faq_a8], which d
35920 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76  oes not effectiv
35930 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74  ely.** address t
35940 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  he requirements 
35950 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64  for concurrent d
35960 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62  atabase access b
35970 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65  y multiple.** re
35980 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
35990 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77  s.** [http://www
359a0 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69  .nabble.com/SQLi
359b0 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d  te-on-NFS-cache-
359c0 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35  coherency-td1565
359d0 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a  5701.html]..**.*
359e0 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65  * To address the
359f0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64   performance and
35a00 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
35a10 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66   issues, proxy f
35a20 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63  ile locking.** c
35a30 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64  hanges the way d
35a40 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69  atabase access i
35a50 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20  s controlled by 
35a60 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20  limiting access 
35a70 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68  to a.** single h
35a80 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e  ost at a time an
35a90 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f  d moving file lo
35aa0 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64  cks off of the d
35ab0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
35ac0 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79  and onto a proxy
35ad0 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63   file on the loc
35ae0 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  al file system. 
35af0 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67   .**.**.** Using
35b00 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20   proxy locks.** 
35b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35b20 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a  -.**.** C APIs.*
35b30 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  *.**  sqlite3_fi
35b40 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
35b50 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43  bname, SQLITE_FC
35b60 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_SET_LOCKPROX
35b70 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20  YFILE,.**       
35b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b90 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22  <proxy_path> | "
35ba0 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71  :auto:");.**  sq
35bb0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
35bc0 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
35bd0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f  QLITE_FCNTL_GET_
35be0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a  LOCKPROXYFILE,.*
35bf0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
35c00 20 20 20 20 20 20 20 20 26 3c 70 72 6f 78 79 5f          &<proxy_
35c10 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a  path>);.**.**.**
35c20 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a   SQL pragmas.**.
35c30 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
35c40 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
35c50 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74  _file=<proxy_pat
35c60 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20  h> | :auto:.**  
35c70 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
35c80 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
35c90 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69  e.**.** Specifyi
35ca0 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e  ng ":auto:" mean
35cb0 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20  s that if there 
35cc0 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20  is a conch file 
35cd0 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a  with a matching.
35ce0 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74  ** host ID in it
35cf0 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68  , the proxy path
35d00 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   in the conch fi
35d10 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c  le will be used,
35d20 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20   otherwise.** a 
35d30 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64  proxy path based
35d40 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74   on the user's t
35d50 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20  emp dir.** (via 
35d60 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
35d70 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
35d80 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75  ,...)) will be u
35d90 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61  sed and the.** a
35da0 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  ctual proxy file
35db0 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74   name is generat
35dc0 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65  ed from the name
35dd0 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65   and path of the
35de0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
35df0 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  e.  For example:
35e00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72  .**.**       For
35e10 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22   database path "
35e20 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62  /Users/me/foo.db
35e30 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  " .**       The 
35e40 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
35e50 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69  e "<tmpdir>/sqli
35e60 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f  teplocks/_Users_
35e70 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22  me_foo.db:auto:"
35e80 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c  ).**.** Once a l
35e90 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e  ock proxy is con
35ea0 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61  figured for a da
35eb0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
35ec0 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a  n, it can not.**
35ed0 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77   be removed, how
35ee0 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73  ever it may be s
35ef0 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66  witched to a dif
35f00 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74  ferent proxy pat
35f10 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f  h via.** the abo
35f20 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e  ve APIs (assumin
35f30 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  g the conch file
35f40 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65   is not being he
35f50 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a  ld by another.**
35f60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70   connection or p
35f70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a  rocess). .**.**.
35f80 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63  ** How proxy loc
35f90 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d  king works.** --
35fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35fb0 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  -----.**.** Prox
35fc0 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72  y file locking r
35fd0 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20  elies primarily 
35fe0 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f  on two new suppo
35ff0 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a  rting files: .**
36000 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66  .**   *  conch f
36010 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63  ile to limit acc
36020 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
36030 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69  ase file to a si
36040 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20  ngle host.**    
36050 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a    at a time.**.*
36060 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c  *   *  proxy fil
36070 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72  e to act as a pr
36080 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69  oxy for the advi
36090 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61  sory locks norma
360a0 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65  lly.**      take
360b0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
360c0 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63  e.**.** The conc
360d0 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20  h file - to use 
360e0 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71  a proxy file, sq
360f0 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20  lite must first 
36100 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22  "hold the conch"
36110 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e  .** by taking an
36120 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68   sqlite-style sh
36130 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
36140 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61   conch file, rea
36150 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  ding the.** cont
36160 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69  ents and compari
36170 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e  ng the host's un
36180 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65  ique host ID (se
36190 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63  e below) and loc
361a0 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20  k.** proxy path 
361b0 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75  against the valu
361c0 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
361d0 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e   conch.  The con
361e0 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74  ch file is.** st
361f0 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ored in the same
36200 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68   directory as th
36210 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36220 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  and the file nam
36230 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65  e.** is patterne
36240 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61  d after the data
36250 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
36260 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d  s ".<databasenam
36270 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66  e>-conch"..** If
36280 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
36290 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
362a0 6f 72 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20  or its contents 
362b0 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  do not match the
362c0 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f  .** host ID and/
362d0 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74  or proxy path, t
362e0 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  hen the lock is 
362f0 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20  escalated to an 
36300 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63  exclusive.** loc
36310 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20  k and the conch 
36320 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73  file contents is
36330 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
36340 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72  e host ID and pr
36350 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20  oxy.** path and 
36360 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e  the lock is down
36370 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61 72  graded to a shar
36380 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20  ed lock again.  
36390 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20  If the conch.** 
363a0 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  is held by anoth
363b0 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74 68  er process (with
363c0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c   a shared lock),
363d0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
363e0 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c  ock.** will fail
363f0 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59   and SQLITE_BUSY
36400 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
36410 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
36420 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79  le - a single-by
36430 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  te file used for
36440 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69   all advisory fi
36450 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d  le locks.** norm
36460 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68  ally taken on th
36470 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
36480 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66     This allows f
36490 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a  or safe sharing.
364a0 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
364b0 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74  se file for mult
364c0 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64  iple readers and
364d0 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20   writers on the 
364e0 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68  same.** host (th
364f0 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20  e conch ensures 
36500 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73  that they all us
36510 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c  e the same local
36520 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a   lock file)..**.
36530 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74 68  ** Requesting th
36540 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65  e lock proxy doe
36550 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c  s not immediatel
36560 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68  y take the conch
36570 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  , it is.** only 
36580 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66  taken when the f
36590 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f 20  irst request to 
365a0 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66 69  lock database fi
365b0 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a  le is made.  .**
365c0 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
365d0 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74  e semantics of t
365e0 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c  he traditional l
365f0 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c  ocking behavior,
36600 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e   where.** openin
36610 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  g a connection t
36620 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
36630 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20  e does not take 
36640 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a  a lock on it..**
36650 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   The shared lock
36660 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c   and an open fil
36670 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
36680 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69   maintained unti
36690 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63  l .** the connec
366a0 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tion to the data
366b0 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20  base is closed. 
366c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
366d0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f   file and the lo
366e0 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65  ck file are neve
366f0 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65  r deleted so the
36700 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74  y only need.** t
36710 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68 65  o be created the
36720 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 79   first time they
36730 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a   are used..**.**
36740 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   Configuration o
36750 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  ptions.** ------
36760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
36770 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52  **.**  SQLITE_PR
36780 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
36790 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44  NG.**.**       D
367a0 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 63  atabase files ac
367b0 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f  cessed on non-lo
367c0 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73  cal file systems
367d0 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75   are.**       au
367e0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66  tomatically conf
367f0 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79  igured for proxy
36800 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66   locking, lock f
36810 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  iles are.**     
36820 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69    named automati
36830 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20  cally using the 
36840 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a  same logic as.**
36850 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f         PRAGMA lo
36860 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a  ck_proxy_file=":
36870 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a  auto:".**    .**
36880 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44    SQLITE_PROXY_D
36890 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  EBUG.**.**      
368a0 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67   Enables the log
368b0 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65  ging of error me
368c0 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f  ssages during ho
368d0 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20  st id file.**   
368e0 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e      retrieval an
368f0 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a  d creation.**.**
36900 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a    LOCKPROXYDIR.*
36910 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72  *.**       Overr
36920 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c 74  ides the default
36930 20 64 69 72 65 63 74 6f 72 79 20 75 73 65 64 20   directory used 
36940 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66  for lock proxy f
36950 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  iles that.**    
36960 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74     are named aut
36970 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74  omatically via t
36980 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74  he ":auto:" sett
36990 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ing.**.**  SQLIT
369a0 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
369b0 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a  IR_PERMISSIONS.*
369c0 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69  *.**       Permi
369d0 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68  ssions to use wh
369e0 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64 69  en creating a di
369f0 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72  rectory for stor
36a00 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
36a10 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
36a20 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  s, only used whe
36a30 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69  n LOCKPROXYDIR i
36a40 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20  s not set..**   
36a50 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d   .**    .** As m
36a60 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20  entioned above, 
36a70 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69  when compiled wi
36a80 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  th SQLITE_PREFER
36a90 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a  _PROXY_LOCKING,.
36aa0 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  ** setting the e
36ab0 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
36ac0 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45  ble SQLITE_FORCE
36ad0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74  _PROXY_LOCKING t
36ae0 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63  o 1 will.** forc
36af0 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
36b00 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
36b10 76 65 72 79 20 64 61 74 61 62 61 73 65 20 66 69  very database fi
36b20 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30  le opened, and 0
36b30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  .** will force a
36b40 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c  utomatic proxy l
36b50 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73  ocking to be dis
36b60 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61  abled for all da
36b70 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20  tabase.** files 
36b80 28 65 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c  (explicitly call
36b90 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 46  ing the SQLITE_F
36ba0 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_SET_LOCKPRO
36bb0 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72  XYFILE pragma or
36bc0 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f  .** sqlite_file_
36bd0 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e  control API is n
36be0 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53  ot affected by S
36bf0 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
36c00 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a  Y_LOCKING)..*/..
36c10 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  /*.** Proxy lock
36c20 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
36c30 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20  lable on MacOSX 
36c40 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
36c50 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
36c60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
36c70 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a  ING_STYLE../*.**
36c80 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   The proxyLockin
36c90 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65  gContext has the
36ca0 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73   path and file s
36cb0 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68  tructures for th
36cc0 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64  e remote .** and
36cd0 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c   local proxy fil
36ce0 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65  es in it.*/.type
36cf0 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79  def struct proxy
36d00 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70  LockingContext p
36d10 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
36d20 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79  xt;.struct proxy
36d30 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
36d40 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
36d50 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  chFile;         
36d60 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69  /* Open conch fi
36d70 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f  le */.  char *co
36d80 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20  nchFilePath;    
36d90 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
36da0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  the conch file *
36db0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f  /.  unixFile *lo
36dc0 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20  ckProxy;        
36dd0 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c   /* Open proxy l
36de0 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
36df0 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74  ar *lockProxyPat
36e00 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  h;         /* Na
36e10 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20  me of the proxy 
36e20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
36e30 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
36e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
36e50 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ame of the open 
36e60 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  file */.  int co
36e70 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20  nchHeld;        
36e80 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74         /* 1 if t
36e90 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64  he conch is held
36ea0 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73  , -1 if lockless
36eb0 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73   */.  int nFails
36ec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36ed0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
36ee0 63 6f 6e 63 68 20 74 61 6b 69 6e 67 20 66 61 69  conch taking fai
36ef0 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  lures */.  void 
36f00 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  *oldLockingConte
36f10 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  xt;     /* Origi
36f20 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65  nal lockingconte
36f30 78 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e  xt to restore on
36f40 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69   close */.  sqli
36f50 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63  te3_io_methods c
36f60 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64  onst *pOldMethod
36f70 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
36f80 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f  l I/O methods fo
36f90 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f  r close */.};../
36fa0 2a 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  * .** The proxy 
36fb0 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66  lock file path f
36fc0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
36fd0 61 74 20 64 62 50 61 74 68 20 69 73 20 77 72 69  at dbPath is wri
36fe0 74 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c  tten into lPath,
36ff0 20 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20   .** which must 
37000 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20  point to valid, 
37010 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20  writable memory 
37020 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
37030 20 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68   a maxLen length
37040 0a 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a  .** file path. .
37050 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
37060 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63  oxyGetLockPath(c
37070 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74  onst char *dbPat
37080 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20  h, char *lPath, 
37090 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a  size_t maxLen){.
370a0 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74    int len;.  int
370b0 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b   dbLen;.  int i;
370c0 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f  ..#ifdef LOCKPRO
370d0 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74  XYDIR.  len = st
370e0 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43  rlcpy(lPath, LOC
370f0 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65  KPROXYDIR, maxLe
37100 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65  n);.#else.# ifde
37110 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  f _CS_DARWIN_USE
37120 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20  R_TEMP_DIR.  {. 
37130 20 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28     if( !confstr(
37140 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
37150 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c  TEMP_DIR, lPath,
37160 20 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20   maxLen) ){.    
37170 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c    OSTRACE(("GETL
37180 4f 43 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20  OCKPATH  failed 
37190 25 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d  %s errno=%d pid=
371a0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
371b0 20 20 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72        lPath, err
371c0 6e 6f 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  no, osGetpid(0))
371d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
371e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
371f0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  K;.    }.    len
37200 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68   = strlcat(lPath
37210 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22  , "sqliteplocks"
37220 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20  , maxLen);    . 
37230 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20   }.# else.  len 
37240 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c  = strlcpy(lPath,
37250 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e   "/tmp/", maxLen
37260 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  );.# endif.#endi
37270 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c  f..  if( lPath[l
37280 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20  en-1]!='/' ){.  
37290 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28    len = strlcat(
372a0 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c  lPath, "/", maxL
372b0 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  en);.  }.  .  /*
372c0 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64   transform the d
372d0 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71  b path to a uniq
372e0 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f  ue cache name */
372f0 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29  .  dbLen = (int)
37300 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a  strlen(dbPath);.
37310 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62    for( i=0; i<db
37320 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29  Len && (i+len+7)
37330 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b  <(int)maxLen; i+
37340 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d  +){.    char c =
37350 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20   dbPath[i];.    
37360 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28  lPath[i+len] = (
37370 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20  c=='/')?'_':c;. 
37380 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e   }.  lPath[i+len
37390 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61  ]='\0';.  strlca
373a0 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a  t(lPath, ":auto:
373b0 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53  ", maxLen);.  OS
373c0 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
373d0 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ATH  proxy lock 
373e0 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
373f0 22 2c 20 6c 50 61 74 68 2c 20 6f 73 47 65 74 70  ", lPath, osGetp
37400 69 64 28 30 29 29 29 3b 0a 20 20 72 65 74 75 72  id(0)));.  retur
37410 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
37420 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20  /* . ** Creates 
37430 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e  the lock file an
37440 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69  d any missing di
37450 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63  rectories in loc
37460 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63  kPath. */.static
37470 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
37480 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
37490 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a  har *lockPath){.
374a0 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20    int i, len;.  
374b0 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48  char buf[MAXPATH
374c0 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72  LEN];.  int star
374d0 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65  t = 0;.  .  asse
374e0 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c  rt(lockPath!=NUL
374f0 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20  L);.  /* try to 
37500 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69  create all the i
37510 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65  ntermediate dire
37520 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e  ctories */.  len
37530 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c   = (int)strlen(l
37540 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b  ockPath);.  buf[
37550 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d  0] = lockPath[0]
37560 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c  ;.  for( i=1; i<
37570 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  len; i++ ){.    
37580 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20  if( lockPath[i] 
37590 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73  == '/' && (i - s
375a0 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20  tart > 0) ){.   
375b0 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72     /* only mkdir
375c0 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20   if leaf dir != 
375d0 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e  "." or "/" or ".
375e0 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ." */.      if( 
375f0 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d  i-start>2 || (i-
37600 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b  start==1 && buf[
37610 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26  start] != '.' &&
37620 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
37630 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  /') .         ||
37640 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20   (i-start==2 && 
37650 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
37660 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31  ' && buf[start+1
37670 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20  ] != '.') ){.   
37680 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27       buf[i]='\0'
37690 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 73  ;.        if( os
376a0 4d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54  Mkdir(buf, SQLIT
376b0 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
376c0 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20  IR_PERMISSIONS) 
376d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
376e0 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20   err=errno;.    
376f0 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d 45        if( err!=E
37700 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20  EXIST ) {.      
37710 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
37720 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20  CREATELOCKPATH  
37730 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20  FAILED creating 
37740 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %s, ".          
37750 20 20 20 20 20 20 20 20 20 20 20 22 27 25 73 27             "'%s'
37760 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
37770 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20  =%s pid=%d\n",. 
37780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37790 20 20 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f      buf, strerro
377a0 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68  r(err), lockPath
377b0 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
377c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
377d0 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20  urn err;.       
377e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
377f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61       }.      sta
37800 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  rt=i+1;.    }.  
37810 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50    buf[i] = lockP
37820 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53  ath[i];.  }.  OS
37830 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f  TRACE(("CREATELO
37840 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f  CKPATH  proxy lo
37850 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
37860 64 5c 6e 22 2c 6c 6f 63 6b 50 61 74 68 2c 6f 73  d\n",lockPath,os
37870 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 72  Getpid(0)));.  r
37880 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
37890 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56  * Create a new V
378a0 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  FS file descript
378b0 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65  or (stored in me
378c0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
378d0 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
378e0 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74  lloc) and open t
378f0 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70  he file named "p
37900 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65  ath" in the file
37910 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a   descriptor..**.
37920 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
37930 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74   responsible not
37940 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e   only for closin
37950 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  g the file descr
37960 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73  iptor.** but als
37970 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  o for freeing th
37980 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  e memory associa
37990 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6c  ted with the fil
379a0 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f  e descriptor..*/
379b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
379c0 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
379d0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
379e0 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a  *path,        /*
379f0 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65   path for the ne
37a00 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20  w unixFile */.  
37a10 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46    unixFile **ppF
37a20 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e  ile,       /* un
37a30 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20 61  ixFile created a
37a40 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 72  nd returned by r
37a50 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  ef */.    int is
37a60 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20  lockfile        
37a70 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72     /* if non zer
37a80 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77  o missing dirs w
37a90 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a  ill be created *
37aa0 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d  /.) {.  int fd =
37ab0 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   -1;.  unixFile 
37ac0 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20  *pNew;.  int rc 
37ad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
37ae0 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  nt openFlags = O
37af0 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
37b00 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64  .  sqlite3_vfs d
37b10 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74  ummyVfs;.  int t
37b20 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69  errno = 0;.  Uni
37b30 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
37b40 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a  ed = NULL;..  /*
37b50 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f   1. first try to
37b60 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65   open/create the
37b70 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66   file.  ** 2. if
37b80 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64   that fails, and
37b90 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20   this is a lock 
37ba0 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29  file (not-conch)
37bb0 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20  , try creating. 
37bc0 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64   ** the parent d
37bd0 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74  irectories and t
37be0 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20  hen try again.. 
37bf0 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66   ** 3. if that f
37c00 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65  ails, try to ope
37c10 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d  n the file read-
37c20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77  only.  ** otherw
37c30 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59 20  ise return BUSY 
37c40 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f  (if lock file) o
37c50 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74  r CANTOPEN for t
37c60 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20  he conch file.  
37c70 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66  */.  pUnused = f
37c80 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70 61  indReusableFd(pa
37c90 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a  th, openFlags);.
37ca0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
37cb0 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65  .    fd = pUnuse
37cc0 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d->fd;.  }else{.
37cd0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71      pUnused = sq
37ce0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73  lite3_malloc64(s
37cf0 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
37d00 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73  ;.    if( !pUnus
37d10 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ed ){.      retu
37d20 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
37d30 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
37d40 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
37d50 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
37d60 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
37d70 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72  gs, 0);.    terr
37d80 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
37d90 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
37da0 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c  o==ENOENT && isl
37db0 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
37dc0 20 69 66 28 20 70 72 6f 78 79 43 72 65 61 74 65   if( proxyCreate
37dd0 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29 20 3d  LockPath(path) =
37de0 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  = SQLITE_OK ){. 
37df0 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75         fd = robu
37e00 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
37e10 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
37e20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
37e30 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
37e40 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
37e50 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20  DONLY;.    fd = 
37e60 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68  robust_open(path
37e70 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b  , openFlags, 0);
37e80 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
37e90 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  rno;.  }.  if( f
37ea0 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  d<0 ){.    if( i
37eb0 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
37ec0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37ed0 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
37ee0 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29   switch (terrno)
37ef0 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45 41   {.      case EA
37f00 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65  CCES:.        re
37f10 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
37f20 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49 4f  ;.      case EIO
37f30 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  : .        retur
37f40 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
37f50 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f  OCK; /* even tho
37f60 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63 6f  ugh it is the co
37f70 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66  nch */.      def
37f80 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65  ault:.        re
37f90 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
37fa0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
37fb0 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d  .  }.  .  pNew =
37fc0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c   (unixFile *)sql
37fd0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69  ite3_malloc64(si
37fe0 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
37ff0 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29  if( pNew==NULL )
38000 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
38010 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
38020 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74    goto end_creat
38030 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d  e_proxy;.  }.  m
38040 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
38050 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
38060 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c  ;.  pNew->openFl
38070 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
38080 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79  .  memset(&dummy
38090 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  Vfs, 0, sizeof(d
380a0 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d  ummyVfs));.  dum
380b0 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d  myVfs.pAppData =
380c0 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63   (void*)&autoloc
380d0 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d  kIoFinder;.  dum
380e0 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64  myVfs.zName = "d
380f0 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64  ummy";.  pUnused
38100 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e  ->fd = fd;.  pUn
38110 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70  used->flags = op
38120 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  enFlags;.  pNew-
38130 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
38140 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
38150 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e    .  rc = fillIn
38160 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56  UnixFile(&dummyV
38170 66 73 2c 20 66 64 2c 20 28 73 71 6c 69 74 65 33  fs, fd, (sqlite3
38180 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74  _file*)pNew, pat
38190 68 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  h, 0);.  if( rc=
381a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
381b0 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77    *ppFile = pNew
381c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
381d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f  ITE_OK;.  }.end_
381e0 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20  create_proxy:   
381f0 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65   .  robust_close
38200 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e  (pNew, fd, __LIN
38210 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E__);.  sqlite3_
38220 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71  free(pNew);.  sq
38230 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73  lite3_free(pUnus
38240 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ed);.  return rc
38250 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
38260 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c  TE_TEST./* simul
38270 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73  ate multiple hos
38280 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75  ts by creating u
38290 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c  nique hostid fil
382a0 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73  e paths */.int s
382b0 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
382c0 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  m = 0;.#endif..#
382d0 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53  define PROXY_HOS
382e0 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a  TIDLEN    16  /*
382f0 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74   conch file host
38300 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 23   id length */..#
38310 69 66 64 65 66 20 48 41 56 45 5f 47 45 54 48 4f  ifdef HAVE_GETHO
38320 53 54 55 55 49 44 0a 2f 2a 20 4e 6f 74 20 61 6c  STUUID./* Not al
38330 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20  ways defined in 
38340 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20 69  the headers as i
38350 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f  t ought to be */
38360 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68  .extern int geth
38370 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20 69  ostuuid(uuid_t i
38380 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  d, const struct 
38390 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b  timespec *wait);
383a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 67 65 74 20  .#endif../* get 
383b0 74 68 65 20 68 6f 73 74 20 49 44 20 76 69 61 20  the host ID via 
383c0 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70  gethostuuid(), p
383d0 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e  HostID must poin
383e0 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49  t to PROXY_HOSTI
383f0 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f  DLEN .** bytes o
38400 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72  f writable memor
38410 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
38420 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28   proxyGetHostID(
38430 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
38440 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72  HostID, int *pEr
38450 72 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 50  ror){.  assert(P
38460 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d  ROXY_HOSTIDLEN =
38470 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29  = sizeof(uuid_t)
38480 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73  );.  memset(pHos
38490 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f  tID, 0, PROXY_HO
384a0 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66 64 65 66  STIDLEN);.#ifdef
384b0 20 48 41 56 45 5f 47 45 54 48 4f 53 54 55 55 49   HAVE_GETHOSTUUI
384c0 44 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74  D.  {.    struct
384d0 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75   timespec timeou
384e0 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31  t = {1, 0}; /* 1
384f0 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a   sec timeout */.
38500 20 20 20 20 69 66 28 20 67 65 74 68 6f 73 74 75      if( gethostu
38510 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69  uid(pHostID, &ti
38520 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20  meout) ){.      
38530 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b  int err = errno;
38540 0a 20 20 20 20 20 20 69 66 28 20 70 45 72 72 6f  .      if( pErro
38550 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45  r ){.        *pE
38560 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20  rror =