/ Hex Artifact Content
Login

Artifact 1f9c3e771557edd248e1fcec0818739826b2a3121b609a6e3372b670236d085a:


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 20 20 7b 20 22 69 6f  urrent)..  { "io
4650: 63 74 6c 22 2c 20 20 20 20 20 20 20 20 20 28 73  ctl",         (s
4660: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
4670: 74 72 29 69 6f 63 74 6c 2c 20 20 20 20 20 20 20  tr)ioctl,       
4680: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
4690: 6f 73 49 6f 63 74 6c 20 28 28 69 6e 74 28 2a 29  osIoctl ((int(*)
46a0: 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  (int,int,...))aS
46b0: 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72  yscall[28].pCurr
46c0: 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20  ent)..}; /* End 
46d0: 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61  of the overridea
46e0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
46f0: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73   */.../*.** On s
4700: 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c  ome systems, cal
4710: 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77  ls to fchown() w
4720: 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65  ill trigger a me
4730: 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72  ssage in a secur
4740: 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68  ity.** log if th
4750: 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e  ey come from non
4760: 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e  -root processes.
4770: 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69    So avoid calli
4780: 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a  ng fchown() if.*
4790: 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e  * we are not run
47a0: 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f  ning as root..*/
47b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
47c0: 73 74 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c  stFchown(int fd,
47d0: 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f   uid_t uid, gid_
47e0: 74 20 67 69 64 29 7b 0a 23 69 66 20 64 65 66 69  t gid){.#if defi
47f0: 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57 4e 29  ned(HAVE_FCHOWN)
4800: 0a 20 20 72 65 74 75 72 6e 20 6f 73 47 65 74 65  .  return osGete
4810: 75 69 64 28 29 20 3f 20 30 20 3a 20 6f 73 46 63  uid() ? 0 : osFc
4820: 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29  hown(fd,uid,gid)
4830: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
4840: 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
4850: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
4860: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
4870: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
4880: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
4890: 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20  f the.** "unix" 
48a0: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
48b0: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
48c0: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
48d0: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
48e0: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
48f0: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
4900: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
4910: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
4920: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
4930: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
4940: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74  atic int unixSet
4950: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
4960: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
4970: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
4980: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
4990: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
49a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
49b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
49c0: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
49d0: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
49e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
49f0: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
4a00: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
4a10: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
4a20: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
4a30: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
4a40: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4a50: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
4a60: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
4a70: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
4a80: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
4a90: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
4aa0: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
4ab0: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
4ac0: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
4ad0: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
4ae0: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
4af0: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
4b00: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4b10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4b20: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
4b30: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
4b40: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
4b50: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
4b60: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
4b70: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
4b80: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
4b90: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
4ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4bc0: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
4bd0: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
4be0: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
4bf0: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
4c00: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
4c10: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
4c20: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
4c30: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
4c40: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
4c50: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
4c60: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
4c70: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
4c80: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
4c90: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
4ca0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
4cb0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
4cc0: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
4cd0: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
4ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
4cf0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4d00: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
4d10: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
4d20: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
4d30: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
4d40: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4d50: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
4d60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4d70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4d80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4d90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4da0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
4db0: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
4dc0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
4dd0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
4de0: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
4df0: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
4e00: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
4e10: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
4e20: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
4e30: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
4e40: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
4e50: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e  3_syscall_ptr un
4e60: 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  ixGetSystemCall(
4e70: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
4e80: 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73  pNotUsed,.  cons
4e90: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
4ea0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
4eb0: 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  i;..  UNUSED_PAR
4ec0: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
4ed0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
4ee0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
4ef0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
4f00: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
4f10: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
4f20: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
4f30: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
4f40: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4f50: 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rent;.  }.  retu
4f60: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
4f70: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
4f80: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
4f90: 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e  em call after zN
4fa0: 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d  ame.  If zName==
4fb0: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  NULL.** then ret
4fc0: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
4fd0: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
4fe0: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
4ff0: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20  ULL if zName.** 
5000: 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74  is the last syst
5010: 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e  em call or if zN
5020: 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e  ame is not the n
5030: 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a  ame of a valid.*
5040: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a  * system call..*
5050: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
5060: 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73  har *unixNextSys
5070: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
5080: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
5090: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
50a0: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
50b0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
50c0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
50d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
50e0: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
50f0: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
5100: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
5110: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
5120: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
5130: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
5140: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
5150: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
5160: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
5170: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
5180: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
5190: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
51a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
51b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f  ;.}../*.** Do no
51c0: 74 20 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c  t accept any fil
51d0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73  e descriptor les
51e0: 73 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  s than this valu
51f0: 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  e, in order to a
5200: 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  void.** opening 
5210: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
5220: 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69 70  ing file descrip
5230: 74 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 6f  tors that are co
5240: 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  mmonly used for 
5250: 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70  .** standard inp
5260: 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20  ut, output, and 
5270: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  error..*/.#ifnde
5280: 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d  f SQLITE_MINIMUM
5290: 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52  _FILE_DESCRIPTOR
52a0: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
52b0: 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45  _MINIMUM_FILE_DE
52c0: 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69  SCRIPTOR 3.#endi
52d0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  f../*.** Invoke 
52e0: 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d  open().  Do so m
52f0: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75  ultiple times, u
5300: 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20 73  ntil it either s
5310: 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61  ucceeds or.** fa
5320: 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61  ils for some rea
5330: 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45  son other than E
5340: 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  INTR..**.** If t
5350: 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  he file creation
5360: 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74   mode "m" is 0 t
5370: 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68  hen set it to th
5380: 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a  e default for.**
5390: 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65   SQLite.  The de
53a0: 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f  fault is SQLITE_
53b0: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
53c0: 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c  MISSIONS (normal
53d0: 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d  ly.** 0644) as m
53e0: 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20 73  odified by the s
53f0: 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66  ystem umask.  If
5400: 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65   m is not 0, the
5410: 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69  n.** make the fi
5420: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
5430: 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67   be exactly m ig
5440: 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b  noring the umask
5450: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61  ..**.** The m pa
5460: 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20  rameter will be 
5470: 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68  non-zero only wh
5480: 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c  en creating -wal
5490: 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61  , -journal,.** a
54a0: 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20  nd -shm files.  
54b0: 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69  We want those fi
54c0: 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61  les to have *exa
54d0: 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a  ctly* the same.*
54e0: 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73  * permissions as
54f0: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
5500: 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c  database, unadul
5510: 74 65 72 61 74 65 64 20 62 79 20 74 68 65 20 75  terated by the u
5520: 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  mask..** In that
5530: 20 77 61 79 2c 20 69 66 20 61 20 64 61 74 61 62   way, if a datab
5540: 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d  ase file is -rw-
5550: 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d  rw-rw or -rw-rw-
5560: 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61  r-, and a.** tra
5570: 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73  nsaction crashes
5580: 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69   and leaves behi
5590: 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c  nd hot journals,
55a0: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f   then any.** pro
55b0: 63 65 73 73 20 74 68 61 74 20 69 73 20 61 62 6c  cess that is abl
55c0: 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  e to write to th
55d0: 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  e database will 
55e0: 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a  also be able to.
55f0: 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20 68  ** recover the h
5600: 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a  ot journals..*/.
5610: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
5620: 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  t_open(const cha
5630: 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64  r *z, int f, mod
5640: 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64  e_t m){.  int fd
5650: 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20  ;.  mode_t m2 = 
5660: 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44  m ? m : SQLITE_D
5670: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
5680: 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65  ISSIONS;.  while
5690: 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  (1){.#if defined
56a0: 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20  (O_CLOEXEC).    
56b0: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c  fd = osOpen(z,f|
56c0: 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23  O_CLOEXEC,m2);.#
56d0: 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73  else.    fd = os
56e0: 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65  Open(z,f,m2);.#e
56f0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c  ndif.    if( fd<
5700: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  0 ){.      if( e
5710: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f  rrno==EINTR ) co
5720: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72  ntinue;.      br
5730: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
5740: 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49  f( fd>=SQLITE_MI
5750: 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52  NIMUM_FILE_DESCR
5760: 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20  IPTOR ) break;. 
5770: 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a     osClose(fd);.
5780: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
5790: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
57a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
57b0: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65   "attempt to ope
57c0: 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65  n \"%s\" as file
57d0: 20 64 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c   descriptor %d",
57e0: 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20   z, fd);.    fd 
57f0: 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73  = -1;.    if( os
5800: 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22  Open("/dev/null"
5810: 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61  , f, m)<0 ) brea
5820: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e  k;.  }.  if( fd>
5830: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21  =0 ){.    if( m!
5840: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
5850: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
5860: 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
5870: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
5880: 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73  ==0 .       && s
5890: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
58a0: 30 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61  0.       && (sta
58b0: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37  tbuf.st_mode&077
58c0: 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a  7)!=m .      ){.
58d0: 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64          osFchmod
58e0: 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d  (fd, m);.      }
58f0: 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
5900: 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26  ed(FD_CLOEXEC) &
5910: 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c  & (!defined(O_CL
5920: 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45  OEXEC) || O_CLOE
5930: 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63  XEC==0).    osFc
5940: 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
5950: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
5960: 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
5970: 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20  OEXEC);.#endif. 
5980: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a   }.  return fd;.
5990: 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
59a0: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
59b0: 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
59c0: 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
59d0: 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
59e0: 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
59f0: 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
5a00: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e  unixInodeInfo an
5a10: 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65  d.** vxworksFile
5a20: 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  Id objects used 
5a30: 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  by this file, al
5a40: 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
5a50: 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20  e .** shared by 
5a60: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
5a70: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
5a80: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
5a90: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
5aa0: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
5ab0: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
5ac0: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
5ad0: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
5ae0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
5af0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
5b00: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
5b10: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
5b20: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
5b30: 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
5b40: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
5b50: 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ) );.**   unixEn
5b60: 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74  terLeave().*/.st
5b70: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e  atic void unixEn
5b80: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
5b90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5ba0: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
5bb0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
5bc0: 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31  UTEX_STATIC_VFS1
5bd0: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
5be0: 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78  d unixLeaveMutex
5bf0: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
5c00: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
5c10: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
5c20: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
5c30: 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69  TIC_VFS1));.}.#i
5c40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5c50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  G.static int uni
5c60: 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  xMutexHeld(void)
5c70: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
5c80: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
5c90: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
5ca0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5cb0: 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23  ATIC_VFS1));.}.#
5cc0: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
5cd0: 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52  QLITE_HAVE_OS_TR
5ce0: 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  ACE./*.** Helper
5cf0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72   function for pr
5d00: 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65  inting out trace
5d10: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
5d20: 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62  m debugging.** b
5d30: 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65  inaries. This re
5d40: 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
5d50: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
5d60: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a  of the supplied.
5d70: 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d  ** integer lock-
5d80: 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  type..*/.static 
5d90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69  const char *azFi
5da0: 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65  leLock(int eFile
5db0: 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28  Lock){.  switch(
5dc0: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
5dd0: 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20    case NO_LOCK: 
5de0: 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20  return "NONE";. 
5df0: 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c     case SHARED_L
5e00: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41  OCK: return "SHA
5e10: 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52  RED";.    case R
5e20: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65  ESERVED_LOCK: re
5e30: 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b  turn "RESERVED";
5e40: 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e  .    case PENDIN
5e50: 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  G_LOCK: return "
5e60: 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61  PENDING";.    ca
5e70: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
5e80: 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55  K: return "EXCLU
5e90: 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74  SIVE";.  }.  ret
5ea0: 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23  urn "ERROR";.}.#
5eb0: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
5ec0: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
5ed0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20  /*.** Print out 
5ee0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
5ef0: 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70  t all locking op
5f00: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
5f10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5f20: 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65  used for trouble
5f30: 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f  shooting locks o
5f40: 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a  n multithreaded.
5f50: 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45  ** platforms.  E
5f60: 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69  nable by compili
5f70: 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51  ng with the -DSQ
5f80: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
5f90: 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  ** command-line 
5fa0: 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f  option on the co
5fb0: 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f  mpiler.  This co
5fc0: 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  de is normally.*
5fd0: 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  * turned off..*/
5fe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
5ff0: 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e  Trace(int fd, in
6000: 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f  t op, struct flo
6010: 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  ck *p){.  char *
6020: 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b  zOpName, *zType;
6030: 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20  .  int s;.  int 
6040: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66  savedErrno;.  if
6050: 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b  ( op==F_GETLK ){
6060: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
6070: 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  GETLK";.  }else 
6080: 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20  if( op==F_SETLK 
6090: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
60a0: 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "SETLK";.  }els
60b0: 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e  e{.    s = osFcn
60c0: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
60d0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
60e0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b  rintf("fcntl unk
60f0: 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22  nown %d %d %d\n"
6100: 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20  , fd, op, s);.  
6110: 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a    return s;.  }.
6120: 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d    if( p->l_type=
6130: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
6140: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
6150: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
6160: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
6170: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
6180: 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  WRLCK";.  }else 
6190: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
61a0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _UNLCK ){.    zT
61b0: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
61c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
61d0: 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61  rt( 0 );.  }.  a
61e0: 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e  ssert( p->l_when
61f0: 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a  ce==SEEK_SET );.
6200: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
6210: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
6220: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
6230: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
6240: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
6250: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
6260: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
6270: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
6280: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
6290: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
62a0: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
62b0: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
62c0: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
62d0: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
62e0: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
62f0: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
6300: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
6310: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
6320: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
6330: 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  p;.    osFcntl(f
6340: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
6350: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
6360: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
6370: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
6380: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
6390: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
63a0: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
63b0: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
63c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
63d0: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
63e0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
63f0: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
6400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
6410: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
6420: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
6430: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
6440: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
6450: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
6460: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
6470: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
6480: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
6490: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
64a0: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
64b0: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
64c0: 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63  s;.}.#undef osFc
64d0: 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  ntl.#define osFc
64e0: 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65  ntl lockTrace.#e
64f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  ndif /* SQLITE_L
6500: 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  OCK_TRACE */../*
6510: 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63  .** Retry ftrunc
6520: 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74  ate() calls that
6530: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e   fail due to EIN
6540: 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c  TR.**.** All cal
6550: 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74 65 28  ls to ftruncate(
6560: 29 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 69  ) within this fi
6570: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64  le should be mad
6580: 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69  e through.** thi
6590: 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e 20 74  s wrapper.  On t
65a0: 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61 74 66  he Android platf
65b0: 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67 20 74  orm, bypassing t
65c0: 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a  he logic below.*
65d0: 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  * could lead to 
65e0: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
65f0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
6600: 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  t robust_ftrunca
6610: 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65  te(int h, sqlite
6620: 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69  3_int64 sz){.  i
6630: 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f  nt rc;.#ifdef __
6640: 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f  ANDROID__.  /* O
6650: 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e  n Android, ftrun
6660: 63 61 74 65 28 29 20 61 6c 77 61 79 73 20 75 73  cate() always us
6670: 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73 65 74  es 32-bit offset
6680: 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a  s, even if .  **
6690: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
66a0: 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64  TS=64 is defined
66b0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 74 20  . This means it 
66c0: 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61 74 74  is unsafe to att
66d0: 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75  empt to.  ** tru
66e0: 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
66f0: 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65 72 20  any size larger 
6700: 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e  than 2GiB. Silen
6710: 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20  tly ignore any. 
6720: 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d 70 74   ** such attempt
6730: 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e  s.  */.  if( sz>
6740: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30  (sqlite3_int64)0
6750: 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20 20 20  x7FFFFFFF ){.   
6760: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6770: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
6780: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72    do{ rc = osFtr
6790: 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77  uncate(h,sz); }w
67a0: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
67b0: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
67c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
67d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
67e0: 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74   translates a st
67f0: 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72  andard POSIX err
6800: 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d  no code into som
6810: 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c  ething.** useful
6820: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20   to the clients 
6830: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66  of the sqlite3 f
6840: 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69  unctions.  Speci
6850: 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a  fically, it is.*
6860: 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72  * intended to tr
6870: 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74  anslate a variet
6880: 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22  y of "try again"
6890: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c   errors into SQL
68a0: 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20  ITE_BUSY.** and 
68b0: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c  a variety of "pl
68c0: 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66  ease close the f
68d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e  ile descriptor N
68e0: 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  OW" errors into 
68f0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
6900: 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64  .** .** Errors d
6910: 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  uring initializa
6920: 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f  tion of locks, o
6930: 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  r file system su
6940: 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c  pport for locks,
6950: 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c  .** should handl
6960: 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55  e ENOLCK, ENOTSU
6970: 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65  P, EOPNOTSUPP se
6980: 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  parately..*/.sta
6990: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72  tic int sqliteEr
69a0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
69b0: 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72  r(int posixError
69c0: 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72  , int sqliteIOEr
69d0: 72 29 20 7b 0a 20 20 61 73 73 65 72 74 28 20 28  r) {.  assert( (
69e0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
69f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
6a00: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
6a10: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6a20: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
6a30: 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  OCK) || .       
6a40: 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20     (sqliteIOErr 
6a50: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
6a60: 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20  RDLOCK) ||.     
6a70: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6a80: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6a90: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
6aa0: 4f 43 4b 29 20 29 3b 0a 20 20 73 77 69 74 63 68  OCK) );.  switch
6ab0: 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a   (posixError) {.
6ac0: 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a    case EACCES: .
6ad0: 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20    case EAGAIN:. 
6ae0: 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a   case ETIMEDOUT:
6af0: 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20  .  case EBUSY:. 
6b00: 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63   case EINTR:.  c
6b10: 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20  ase ENOLCK:  .  
6b20: 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20    /* random NFS 
6b30: 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c  retry error, unl
6b40: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
6b50: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
6b60: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
6b70: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
6b80: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
6b90: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
6ba0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6bb0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20  TE_BUSY;.    .  
6bc0: 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20  case EPERM: .   
6bd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
6be0: 45 52 4d 3b 0a 20 20 20 20 0a 20 20 64 65 66 61  ERM;.    .  defa
6bf0: 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  ult: .    return
6c00: 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20   sqliteIOErr;.  
6c10: 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}.../*********
6c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c60: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
6c70: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55  ******** Begin U
6c80: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
6c90: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
6ca0: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
6cb0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d  *****.**.** On m
6cc0: 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ost versions of 
6cd0: 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74  unix, we can get
6ce0: 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72   a unique ID for
6cf0: 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61   a file by conca
6d00: 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  tenating.** the 
6d10: 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e  device number an
6d20: 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  d the inode numb
6d30: 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f  er.  But this do
6d40: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
6d50: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78  xWorks..** On Vx
6d60: 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20  Works, a unique 
6d70: 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20  file id must be 
6d80: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e  based on the can
6d90: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
6da0: 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
6db0: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
6dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
6dd0: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
6de0: 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75  e used as a.** u
6df0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e  nique file ID in
6e00: 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20   VxWorks.  Each 
6e10: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
6e20: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
6e30: 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66  ins.** a copy of
6e40: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
6e50: 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20  ilename.  There 
6e60: 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65  is also a refere
6e70: 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20  nce count.  .** 
6e80: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73  The structure is
6e90: 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20   reclaimed when 
6ea0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
6eb0: 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f  inters to it dro
6ec0: 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a  ps to.** zero..*
6ed0: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e  *.** There are n
6ee0: 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66  ever very many f
6ef0: 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65  iles open at one
6f00: 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70   time and lookup
6f10: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70  s are not.** a p
6f20: 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69  erformance-criti
6f30: 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20  cal path, so it 
6f40: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
6f50: 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74   put these.** st
6f60: 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69  ructures on a li
6f70: 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  nked list..*/.st
6f80: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6f90: 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78  Id {.  struct vx
6fa0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
6fb0: 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20  xt;  /* Next in 
6fc0: 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  a list of them a
6fd0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ll */.  int nRef
6fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ff0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7000: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
7010: 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69   this one */.  i
7020: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7040: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43  Length of the zC
7050: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73  anonicalName[] s
7060: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
7070: 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b  *zCanonicalName;
7080: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f           /* Cano
7090: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a  nical filename *
70a0: 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  /.};..#if OS_VXW
70b0: 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20  ORKS./* .** All 
70c0: 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73  unique filenames
70d0: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c   are held on a l
70e0: 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65  inked list heade
70f0: 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72  d by this.** var
7100: 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63  iable:.*/.static
7110: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
7120: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
7130: 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  leList = 0;../*.
7140: 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69  ** Simplify a fi
7150: 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20  lename into its 
7160: 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a  canonical form.*
7170: 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20  * by making the 
7180: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
7190: 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f  s:.**.**  * remo
71a0: 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e  ving any trailin
71b0: 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20  g and duplicate 
71c0: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
71d0: 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  /./ into just /.
71e0: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41  **  * convert /A
71f0: 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20  /../ where A is 
7200: 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20  any simple name 
7210: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a  into just /.**.*
7220: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61  * Changes are ma
7230: 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65  de in-place.  Re
7240: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d  turn the new nam
7250: 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20  e length..**.** 
7260: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  The original fil
7270: 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e  ename is in z[0.
7280: 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74  .n-1].  Return t
7290: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
72a0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
72b0: 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d  e simplified nam
72c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
72d0: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
72e0: 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e  Name(char *z, in
72f0: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  t n){.  int i, j
7300: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  ;.  while( n>1 &
7310: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b  & z[n-1]=='/' ){
7320: 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d   n--; }.  for(i=
7330: 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
7340: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f      if( z[i]=='/
7350: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ' ){.      if( z
7360: 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
7370: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
7380: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
7390: 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+2<n && z[i+2]=
73a0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
73b0: 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i += 1;.        
73c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
73d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  }.      if( z[i+
73e0: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e  1]=='.' && i+3<n
73f0: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20   && z[i+2]=='.' 
7400: 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29  && z[i+3]=='/' )
7410: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
7420: 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d   j>0 && z[j-1]!=
7430: 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
7440: 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b        if( j>0 ){
7450: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
7460: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
7470: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7480: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b  }.    }.    z[j+
7490: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20  +] = z[i];.  }. 
74a0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74   z[j] = 0;.  ret
74b0: 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn j;.}../*.** 
74c0: 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69  Find a unique fi
74d0: 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69  le ID for the gi
74e0: 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74  ven absolute pat
74f0: 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a  hname.  Return.*
7500: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
7510: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
7520: 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70   object.  This p
7530: 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e  ointer is the un
7540: 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e  ique.** file ID.
7550: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20  .**.** The nRef 
7560: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77  field of the vxw
7570: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
7580: 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
7590: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f   before.** the o
75a0: 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65  bject is returne
75b0: 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b  d.  A new vxwork
75c0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
75d0: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
75e0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c   added to the gl
75f0: 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63  obal list if nec
7600: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
7610: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
7620: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
7630: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  s, return NULL..
7640: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
7650: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
7660: 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
7670: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  d(const char *zA
7680: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20  bsoluteName){.  
7690: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
76a0: 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20  leId *pNew;     
76b0: 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65      /* search ke
76c0: 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49  y and new file I
76d0: 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  D */.  struct vx
76e0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61  worksFileId *pCa
76f0: 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f  ndidate;   /* Fo
7700: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
7710: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73  xisting file IDs
7720: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
7750: 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65  gth of zAbsolute
7760: 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a  Name string */..
7770: 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c    assert( zAbsol
7780: 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  uteName[0]=='/' 
7790: 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74  );.  n = (int)st
77a0: 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61  rlen(zAbsoluteNa
77b0: 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  me);.  pNew = sq
77c0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
77d0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
77e0: 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  (n+1) );.  if( p
77f0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
7800: 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  0;.  pNew->zCano
7810: 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61  nicalName = (cha
7820: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d  r*)&pNew[1];.  m
7830: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e  emcpy(pNew->zCan
7840: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73  onicalName, zAbs
7850: 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b  oluteName, n+1);
7860: 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69  .  n = vxworksSi
7870: 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d  mplifyName(pNew-
7880: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
7890: 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63   n);..  /* Searc
78a0: 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
78b0: 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  g entry that mat
78c0: 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69  ching the canoni
78d0: 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49  cal name..  ** I
78e0: 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65  f found, increme
78f0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
7900: 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72   count and retur
7910: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20  n a pointer to. 
7920: 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67   ** the existing
7930: 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20   file ID..  */. 
7940: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
7950: 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64  );.  for(pCandid
7960: 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ate=vxworksFileL
7970: 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b  ist; pCandidate;
7980: 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e   pCandidate=pCan
7990: 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a  didate->pNext){.
79a0: 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61      if( pCandida
79b0: 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20  te->nName==n .  
79c0: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61     && memcmp(pCa
79d0: 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69  ndidate->zCanoni
79e0: 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  calName, pNew->z
79f0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
7a00: 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
7a10: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7a20: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43  pNew);.       pC
7a30: 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b  andidate->nRef++
7a40: 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61  ;.       unixLea
7a50: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
7a60: 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64    return pCandid
7a70: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ate;.    }.  }..
7a80: 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61    /* No match wa
7a90: 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c  s found.  We wil
7aa0: 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c  l make a new fil
7ab0: 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  e ID */.  pNew->
7ac0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77  nRef = 1;.  pNew
7ad0: 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70  ->nName = n;.  p
7ae0: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77  New->pNext = vxw
7af0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20  orksFileList;.  
7b00: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
7b10: 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65  = pNew;.  unixLe
7b20: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
7b30: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7b40: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
7b50: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
7b60: 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69  t on a vxworksFi
7b70: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72  leId object.  Fr
7b80: 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  ee.** the object
7b90: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
7ba0: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
7bb0: 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  s zero..*/.stati
7bc0: 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65  c void vxworksRe
7bd0: 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75  leaseFileId(stru
7be0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7bf0: 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e   *pId){.  unixEn
7c00: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
7c10: 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e  sert( pId->nRef>
7c20: 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66  0 );.  pId->nRef
7c30: 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e  --;.  if( pId->n
7c40: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  Ref==0 ){.    st
7c50: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7c60: 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72  Id **pp;.    for
7c70: 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65  (pp=&vxworksFile
7c80: 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70  List; *pp && *pp
7c90: 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a  !=pId; pp = &((*
7ca0: 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20  pp)->pNext)){}. 
7cb0: 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d     assert( *pp==
7cc0: 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d  pId );.    *pp =
7cd0: 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pId->pNext;.   
7ce0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
7cf0: 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
7d00: 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65  aveMutex();.}.#e
7d10: 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
7d20: 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  KS */./*********
7d30: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e  ****** End of Un
7d40: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
7d50: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
7d60: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
7d70: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
7d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dc0: 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
7dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e10: 2a 2a 2a 2a 2a 2a 2a 0a 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 20 50 6f 73 69 78 20 41 64 76 69 73 6f  *** Posix Adviso
7e40: 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  ry Locking *****
7e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e60: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f  *******.**.** PO
7e70: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
7e80: 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79  ks are broken by
7e90: 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53   design.  ANSI S
7ea0: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
7eb0: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
7ec0: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
7ed0: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
7ee0: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
7ef0: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
7f00: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
7f10: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
7f20: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
7f30: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
7f40: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
7f50: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
7f60: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
7f70: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
7f80: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
7f90: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
7fa0: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
7fb0: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
7fc0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
7fd0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
7fe0: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
7ff0: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
8000: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
8010: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
8020: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
8030: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
8040: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
8050: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
8060: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
8070: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
8080: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
8090: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
80a0: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
80b0: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
80c0: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
80d0: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
80e0: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
80f0: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
8100: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
8110: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
8120: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
8130: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
8140: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
8150: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
8160: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
8170: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
8180: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
8190: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
81a0: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
81b0: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
81c0: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
81d0: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
81e0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
81f0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
8200: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
8210: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
8220: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
8230: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
8240: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
8250: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
8260: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   names..**.** Th
8270: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  is means that we
8280: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
8290: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
82a0: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
82b0: 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70  ss.** among comp
82c0: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
82d0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
82e0: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
82f0: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
8300: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
8310: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
8320: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
8330: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
8340: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
8350: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
8360: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
8370: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
8380: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
8390: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
83a0: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
83b0: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
83c0: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
83d0: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
83e0: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
83f0: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
8400: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
8410: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8420: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
8430: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
8440: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
8450: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
8460: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
8470: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
8480: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
8490: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
84a0: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
84b0: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
84c0: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
84d0: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
84e0: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
84f0: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
8500: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
8510: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
8520: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
8530: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
8540: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
8550: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
8560: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
8570: 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20  .** (Aside: The 
8580: 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d  use of inode num
8590: 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49  bers as unique I
85a0: 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  Ds does not work
85b0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
85c0: 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20  For VxWorks, we 
85d0: 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20  have to use the 
85e0: 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71  alternative uniq
85f0: 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73  ue ID system bas
8600: 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63  ed on.** canonic
8610: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  al filename and 
8620: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74  implemented in t
8630: 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69  he previous divi
8640: 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  sion.).**.** The
8650: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
8660: 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49  ructure for POSI
8670: 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a  X is no longer j
8680: 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66  ust an integer f
8690: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
86a0: 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20  r.  It is now a 
86b0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
86c0: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
86d0: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
86e0: 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  tor and a pointe
86f0: 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65  r to a structure
8700: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
8710: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
8720: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72  locks on the cor
8730: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65  responding inode
8740: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
8750: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
8760: 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20  e.** per inode, 
8770: 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69  so if the same i
8780: 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74  node is opened t
8790: 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46  wice, both unixF
87a0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a  ile structures.*
87b0: 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  * point to the s
87c0: 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ame locking stru
87d0: 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b  cture.  The lock
87e0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
87f0: 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e  eps.** a referen
8800: 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20  ce count (so we 
8810: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74  will know when t
8820: 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64  o delete it) and
8830: 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c   a "cnt".** fiel
8840: 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20  d that tells us 
8850: 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  its internal loc
8860: 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d  k status.  cnt==
8870: 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66  0 means the.** f
8880: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
8890: 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20    cnt==-1 means 
88a0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  the file has an 
88b0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a  exclusive lock..
88c0: 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74  ** cnt>0 means t
88d0: 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61  here are cnt sha
88e0: 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  red locks on the
88f0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79   file..**.** Any
8900: 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b   attempt to lock
8910: 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c   or unlock a fil
8920: 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74  e first checks t
8930: 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  he locking.** st
8940: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63  ructure.  The fc
8950: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
8960: 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  l is only invoke
8970: 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50  d to set a .** P
8980: 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65  OSIX lock if the
8990: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
89a0: 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74  tructure transit
89b0: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ions between.** 
89c0: 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20  a locked and an 
89d0: 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a  unlocked state..
89e0: 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20  **.** But wait: 
89f0: 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d   there are yet m
8a00: 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  ore problems wit
8a10: 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  h POSIX advisory
8a20: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   locks..**.** If
8a30: 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c   you close a fil
8a40: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
8a50: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69  t points to a fi
8a60: 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  le that has lock
8a70: 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20  s,.** all locks 
8a80: 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
8a90: 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74  t are owned by t
8aa0: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
8ab0: 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73  ss are.** releas
8ac0: 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  ed.  To work aro
8ad0: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
8ae0: 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65  , each unixInode
8af0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d  Info object.** m
8b00: 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74  aintains a count
8b10: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
8b20: 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  f pending locks 
8b30: 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a  on tha inode..**
8b40: 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   When an attempt
8b50: 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73   is made to clos
8b60: 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69  e an unixFile, i
8b70: 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f  f there are.** o
8b80: 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70  ther unixFile op
8b90: 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69  en on the same i
8ba0: 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f  node that are ho
8bb0: 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65  lding locks, the
8bc0: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73   call.** to clos
8bd0: 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73  e() the file des
8be0: 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72  criptor is defer
8bf0: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66  red until all of
8c00: 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72   the locks clear
8c10: 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f  ..** The unixIno
8c20: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
8c30: 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66   keeps a list of
8c40: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8c50: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a  s that need to.*
8c60: 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  * be closed and 
8c70: 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c  that list is wal
8c80: 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64  ked (and cleared
8c90: 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  ) when the last 
8ca0: 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a  lock.** clears..
8cb0: 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65  **.** Yet anothe
8cc0: 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75  r problem:  Linu
8cd0: 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20  xThreads do not 
8ce0: 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70  play well with p
8cf0: 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  osix locks..**.*
8d00: 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72  * Many older ver
8d10: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75  sions of linux u
8d20: 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65  se the LinuxThre
8d30: 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63  ads library whic
8d40: 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69  h is.** not posi
8d50: 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e  x compliant.  Un
8d60: 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  der LinuxThreads
8d70: 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  , a lock created
8d80: 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20   by thread.** A 
8d90: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69  cannot be modifi
8da0: 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e  ed or overridden
8db0: 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20   by a different 
8dc0: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c  thread B..** Onl
8dd0: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d  y thread A can m
8de0: 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20  odify the lock. 
8df0: 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   Locking behavio
8e00: 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20  r is correct.** 
8e10: 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f  if the appliatio
8e20: 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72  n uses the newer
8e30: 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68   Native Posix Th
8e40: 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50  read Library (NP
8e50: 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20  TL).** on linux 
8e60: 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f  - with NPTL a lo
8e70: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
8e80: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
8e90: 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20  ide locks.** in 
8ea0: 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74  thread B.  But t
8eb0: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
8ec0: 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c  o know at compil
8ed0: 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20  e-time which.** 
8ee0: 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72  threading librar
8ef0: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e  y is being used.
8f00: 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f    So there is no
8f10: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a   way to know at.
8f20: 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** compile-time 
8f30: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
8f40: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
8f50: 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ride locks on th
8f60: 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68  read B..** One h
8f70: 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74  as to do a run-t
8f80: 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73  ime check to dis
8f90: 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69  cover the behavi
8fa0: 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72  or of the.** cur
8fb0: 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  rent process..**
8fc0: 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20  .** SQLite used 
8fd0: 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78  to support Linux
8fe0: 54 68 72 65 61 64 73 2e 20 20 42 75 74 20 73 75  Threads.  But su
8ff0: 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54  pport for LinuxT
9000: 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72  hreads.** was dr
9010: 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20  opped beginning 
9020: 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37  with version 3.7
9030: 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c  .0.  SQLite will
9040: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68   still work with
9050: 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73  .** LinuxThreads
9060: 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 28   provided that (
9070: 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  1) there is no m
9080: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e  ore than one con
9090: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20  nection .** per 
90a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
90b0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
90c0: 73 20 61 6e 64 20 28 32 29 20 64 61 74 61 62 61  s and (2) databa
90d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
90e0: 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63  * do not move ac
90f0: 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f  ross threads..*/
9100: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
9110: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
9120: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
9130: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
9140: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
9150: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
9160: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
9170: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ject..*/.struct 
9180: 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64  unixFileId {.  d
9190: 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20  ev_t dev;       
91a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
91b0: 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  vice number */.#
91c0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
91d0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
91e0: 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55  leId *pId;  /* U
91f0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f  nique file ID fo
9200: 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65  r vxworks. */.#e
9210: 6c 73 65 0a 20 20 2f 2a 20 57 65 20 61 72 65 20  lse.  /* We are 
9220: 74 6f 6c 64 20 74 68 61 74 20 73 6f 6d 65 20 76  told that some v
9230: 65 72 73 69 6f 6e 73 20 6f 66 20 41 6e 64 72 6f  ersions of Andro
9240: 69 64 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67  id contain a bug
9250: 20 74 68 61 74 0a 20 20 2a 2a 20 73 69 7a 65 73   that.  ** sizes
9260: 20 69 6e 6f 5f 74 20 61 74 20 6f 6e 6c 79 20 33   ino_t at only 3
9270: 32 2d 62 69 74 73 20 69 6e 73 74 65 61 64 20 6f  2-bits instead o
9280: 66 20 36 34 2d 62 69 74 73 2e 20 28 53 65 65 0a  f 64-bits. (See.
9290: 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 61 6e 64    ** https://and
92a0: 72 6f 69 64 2d 72 65 76 69 65 77 2e 67 6f 6f 67  roid-review.goog
92b0: 6c 65 73 6f 75 72 63 65 2e 63 6f 6d 2f 23 2f 63  lesource.com/#/c
92c0: 2f 31 31 35 33 35 31 2f 33 2f 64 69 73 74 2f 73  /115351/3/dist/s
92d0: 71 6c 69 74 65 33 2e 63 29 0a 20 20 2a 2a 20 54  qlite3.c).  ** T
92e0: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
92f0: 69 73 2c 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  is, always alloc
9300: 61 74 65 20 36 34 2d 62 69 74 73 20 66 6f 72 20  ate 64-bits for 
9310: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
9320: 2e 20 20 0a 20 20 2a 2a 20 4f 6e 20 73 6d 61 6c  .  .  ** On smal
9330: 6c 20 6d 61 63 68 69 6e 65 73 20 74 68 61 74 20  l machines that 
9340: 6f 6e 6c 79 20 68 61 76 65 20 33 32 2d 62 69 74  only have 32-bit
9350: 20 69 6e 6f 64 65 73 2c 20 74 68 69 73 20 77 61   inodes, this wa
9360: 73 74 65 73 20 34 20 62 79 74 65 73 2c 0a 20 20  stes 4 bytes,.  
9370: 2a 2a 20 62 75 74 20 74 68 61 74 20 73 68 6f 75  ** but that shou
9380: 6c 64 20 6e 6f 74 20 62 65 20 61 20 62 69 67 20  ld not be a big 
9390: 64 65 61 6c 2e 20 2a 2f 0a 20 20 2f 2a 20 57 41  deal. */.  /* WA
93a0: 53 3a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20  S:  ino_t ino;  
93b0: 20 2a 2f 0a 20 20 75 36 34 20 69 6e 6f 3b 20 20   */.  u64 ino;  
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93d0: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
93e0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
93f0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
9400: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
9410: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
9420: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
9430: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e  h open.** inode.
9440: 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68    Or, on LinuxTh
9450: 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 20  reads, there is 
9460: 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72  one of these str
9470: 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65  uctures for.** e
9480: 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64  ach inode opened
9490: 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64 2e   by each thread.
94a0: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  .**.** A single 
94b0: 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d  inode can have m
94c0: 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73  ultiple file des
94d0: 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63  criptors, so eac
94e0: 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  h unixFile.** st
94f0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
9500: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
9510: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
9520: 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69  s object and thi
9530: 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70  s.** object keep
9540: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
9550: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46   number of unixF
9560: 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ile pointing to 
9570: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  it..*/.struct un
9580: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20  ixInodeInfo {.  
9590: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
95a0: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20  d fileId;       
95b0: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
95c0: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72  y */.  int nShar
95d0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
95e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
95f0: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
9600: 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67   held */.  unsig
9610: 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f  ned char eFileLo
9620: 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ck;        /* On
9630: 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e of SHARED_LOCK
9640: 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  , RESERVED_LOCK 
9650: 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  etc. */.  unsign
9660: 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73 73  ed char bProcess
9670: 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20  Lock;     /* An 
9680: 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73  exclusive proces
9690: 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a  s lock is held *
96a0: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
96d0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
96e0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
96f0: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
9700: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
9710: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
9720: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
9730: 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  h this inode */.
9740: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9760: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
9770: 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20  utstanding file 
9780: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55  locks */.  UnixU
9790: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
97a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
97b0: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
97c0: 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a  ptors to close *
97d0: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
97e0: 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  o *pNext;       
97f0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
9800: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
9810: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e   objects */.  un
9820: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72  ixInodeInfo *pPr
9830: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ev;           /*
9840: 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20      .... doubly 
9850: 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51  linked */.#if SQ
9860: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
9870: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69  ING_STYLE.  unsi
9880: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
9890: 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66  haredByte;  /* f
98a0: 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64  or AFP simulated
98b0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
98c0: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58  #endif.#if OS_VX
98d0: 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70  WORKS.  sem_t *p
98e0: 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sem;            
98f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64          /* Named
9900: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
9910: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e   */.  char aSemN
9920: 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
9930: 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  +2];  /* Name of
9940: 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20   that semaphore 
9950: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
9960: 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61  .** A lists of a
9970: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
9980: 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
9990: 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  tic unixInodeInf
99a0: 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30  o *inodeList = 0
99b0: 3b 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 49 6e  ;  /* All unixIn
99c0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  odeInfo objects 
99d0: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
99e0: 65 64 20 69 6e 74 20 6e 55 6e 75 73 65 64 46 64  ed int nUnusedFd
99f0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 6f 74 61   = 0;    /* Tota
9a00: 6c 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  l unused file de
9a10: 73 63 72 69 70 74 6f 72 73 20 2a 2f 0a 0a 2f 2a  scriptors */../*
9a20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
9a30: 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72  tion - unixLogEr
9a40: 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20 69 73 20  rorAtLine(), is 
9a50: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
9a60: 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a   via the macro.*
9a70: 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29  * unixLogError()
9a80: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e  ..**.** It is in
9a90: 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65  voked after an e
9aa0: 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61  rror occurs in a
9ab0: 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e  n OS function an
9ac0: 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65 6e  d errno has been
9ad0: 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67 73  .** set. It logs
9ae0: 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67   a message using
9af0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63   sqlite3_log() c
9b00: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
9b10: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a  rrent value of.*
9b20: 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20  * errno and, if 
9b30: 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75  possible, the hu
9b40: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75  man-readable equ
9b50: 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72  ivalent from str
9b60: 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74  error() or.** st
9b70: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a  rerror_r()..**.*
9b80: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
9b90: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
9ba0: 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20  he macro should 
9bb0: 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  be the error cod
9bc0: 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62  e that.** will b
9bd0: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  e returned to SQ
9be0: 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54  Lite (e.g. SQLIT
9bf0: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
9c00: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29  SQLITE_CANTOPEN)
9c10: 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75  . .** The two su
9c20: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
9c30: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ts should be the
9c40: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20   name of the OS 
9c50: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
9c60: 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75   failed (e.g. "u
9c70: 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20  nlink", "open") 
9c80: 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74  and the associat
9c90: 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70  ed file-system p
9ca0: 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a  ath,.** if any..
9cb0: 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c  */.#define unixL
9cc0: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20  ogError(a,b,c)  
9cd0: 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41     unixLogErrorA
9ce0: 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49  tLine(a,b,c,__LI
9cf0: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
9d00: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
9d10: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
9d20: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
9d30: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
9d40: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
9d50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
9d60: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
9d70: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66   /* Name of OS f
9d80: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69  unction that fai
9d90: 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  led */.  const c
9da0: 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
9db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
9dc0: 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64   path associated
9dd0: 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20   with error */. 
9de0: 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20   int iLine      
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e00: 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20   /* Source line 
9e10: 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72  number where err
9e20: 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29  or occurred */.)
9e30: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20  {.  char *zErr; 
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e50: 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66      /* Message f
9e60: 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f  rom strerror() o
9e70: 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a  r equivalent */.
9e80: 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65    int iErrno = e
9e90: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
9ea0: 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61    /* Saved sysca
9eb0: 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20  ll error number 
9ec0: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  */..  /* If this
9ed0: 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64   is not a thread
9ee0: 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49  safe build (SQLI
9ef0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30  TE_THREADSAFE==0
9f00: 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a  ), then use.  **
9f10: 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29 20   the strerror() 
9f20: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61  function to obta
9f30: 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  in the human-rea
9f40: 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73  dable error mess
9f50: 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c  age.  ** equival
9f60: 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74  ent to errno. Ot
9f70: 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74 72  herwise, use str
9f80: 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20  error_r()..  */ 
9f90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
9fa0: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
9fb0: 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f  d(HAVE_STRERROR_
9fc0: 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38  R).  char aErr[8
9fd0: 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72  0];.  memset(aEr
9fe0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72  r, 0, sizeof(aEr
9ff0: 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45  r));.  zErr = aE
a000: 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52  rr;..  /* If STR
a010: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28  ERROR_R_CHAR_P (
a020: 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20  set by autoconf 
a030: 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53  scripts) or __US
a040: 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64  E_GNU is defined
a050: 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68  ,.  ** assume th
a060: 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72  at the system pr
a070: 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55 20 76  ovides the GNU v
a080: 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72  ersion of strerr
a090: 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a 2a  or_r() that.  **
a0a0: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
a0b0: 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
a0c0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72  ontaining the er
a0d0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61  ror message. Tha
a0e0: 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20  t pointer .  ** 
a0f0: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72  may point to aEr
a100: 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70  r[], or it may p
a110: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61  oint to some sta
a120: 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65  tic storage some
a130: 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68  where. .  ** Oth
a140: 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74  erwise, assume t
a150: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
a160: 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53 49  rovides the POSI
a170: 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20  X version of .  
a180: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c  ** strerror_r(),
a190: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77 72   which always wr
a1a0: 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ites an error me
a1b0: 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b  ssage into aErr[
a1c0: 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  ]..  **.  ** If 
a1d0: 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65  the code incorre
a1e0: 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61  ctly assumes tha
a1f0: 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53 49  t it is the POSI
a200: 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69  X version that i
a210: 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  s.  ** available
a220: 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  , the error mess
a230: 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62  age will often b
a240: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
a250: 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75  g. Not a.  ** hu
a260: 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f  ge problem. Inco
a270: 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69  rrectly concludi
a280: 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55 20  ng that the GNU 
a290: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
a2a0: 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64  able .  ** could
a2b0: 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66 61   lead to a segfa
a2c0: 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f  ult though..  */
a2d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54 52  .#if defined(STR
a2e0: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20  ERROR_R_CHAR_P) 
a2f0: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45  || defined(__USE
a300: 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a  _GNU).  zErr = .
a310: 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72  # endif.  strerr
a320: 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72  or_r(iErrno, aEr
a330: 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d  r, sizeof(aErr)-
a340: 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54  1);..#elif SQLIT
a350: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f  E_THREADSAFE.  /
a360: 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72 65  * This is a thre
a370: 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75  adsafe build, bu
a380: 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69  t strerror_r() i
a390: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
a3a0: 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b   */.  zErr = "";
a3b0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d  .#else.  /* Non-
a3c0: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
a3d0: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28 29  , use strerror()
a3e0: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74  . */.  zErr = st
a3f0: 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a  rerror(iErrno);.
a400: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a 50  #endif..  if( zP
a410: 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d  ath==0 ) zPath =
a420: 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c   "";.  sqlite3_l
a430: 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
a440: 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a    "os_unix.c:%d:
a450: 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25   (%d) %s(%s) - %
a460: 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c  s",.      iLine,
a470: 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20   iErrno, zFunc, 
a480: 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b  zPath, zErr.  );
a490: 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f  ..  return errco
a4a0: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  de;.}../*.** Clo
a4b0: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
a4c0: 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ptor..**.** We a
a4d0: 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65  ssume that close
a4e0: 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  () almost always
a4f0: 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74   works, since it
a500: 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a   is only in a.**
a510: 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69   very sick appli
a520: 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76  cation or on a v
a530: 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72  ery sick platfor
a540: 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  m that it might 
a550: 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64  fail..** If it d
a560: 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79  oes fail, simply
a570: 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64   leak the file d
a580: 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64  escriptor, but d
a590: 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72  o log the.** err
a5a0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  or..**.** Note t
a5b0: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hat it is not sa
a5c0: 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73  fe to retry clos
a5d0: 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52 20  e() after EINTR 
a5e0: 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c  since the.** fil
a5f0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67  e descriptor mig
a600: 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ht have already 
a610: 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20 61  been reused by a
a620: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a  nother thread..*
a630: 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76  * So we don't ev
a640: 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65  en try to recove
a650: 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e  r from an EINTR.
a660: 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65    Just log the e
a670: 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65  rror.** and move
a680: 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   on..*/.static v
a690: 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  oid robust_close
a6a0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
a6b0: 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e  , int h, int lin
a6c0: 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c  eno){.  if( osCl
a6d0: 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e  ose(h) ){.    un
a6e0: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
a6f0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
a700: 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20  OSE, "close",.  
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69       pFile ? pFi
a730: 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c  le->zPath : 0, l
a740: 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ineno);.  }.}../
a750: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 46 69  *.** Set the pFi
a760: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e 20 20  le->lastErrno.  
a770: 44 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75 62  Do this in a sub
a780: 72 6f 75 74 69 6e 65 20 61 73 20 74 68 61 74 20  routine as that 
a790: 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61 20 63 6f  provides.** a co
a7a0: 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74  nvenient place t
a7b0: 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
a7c0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
a7d0: 69 64 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e  id storeLastErrn
a7e0: 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  o(unixFile *pFil
a7f0: 65 2c 20 69 6e 74 20 65 72 72 6f 72 29 7b 0a 20  e, int error){. 
a800: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
a810: 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a  o = error;.}../*
a820: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69  .** Close all fi
a830: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61  le descriptors a
a840: 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65  ccumuated in the
a850: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e   unixInodeInfo->
a860: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
a870: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c   .static void cl
a880: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e  osePendingFds(un
a890: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
a8a0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
a8b0: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
a8c0: 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55  >pInode;.  UnixU
a8d0: 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e  nusedFd *p;.  Un
a8e0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
a8f0: 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64  t;.  for(p=pInod
a900: 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70  e->pUnused; p; p
a910: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
a920: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
a930: 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
a940: 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f  pFile, p->fd, __
a950: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c  LINE__);.    sql
a960: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
a970: 20 20 6e 55 6e 75 73 65 64 46 64 2d 2d 3b 0a 20    nUnusedFd--;. 
a980: 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e   }.  pInode->pUn
a990: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
a9a0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69  ** Release a uni
a9b0: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
a9c0: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
a9d0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
a9e0: 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a  dInodeInfo()..**
a9f0: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e  .** The mutex en
aa00: 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  tered using the 
aa10: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
aa20: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
aa30: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74  e held.** when t
aa40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
aa50: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
aa60: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e  c void releaseIn
aa70: 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65  odeInfo(unixFile
aa80: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
aa90: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
aaa0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
aab0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
aac0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
aad0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
aae0: 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  ode) ){.    pIno
aaf0: 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  de->nRef--;.    
ab00: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66  if( pInode->nRef
ab10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
ab20: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68  ert( pInode->pSh
ab30: 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20  mNode==0 );.    
ab40: 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
ab50: 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
ab60: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  if( pInode->pPre
ab70: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
ab80: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ert( pInode->pPr
ab90: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64  ev->pNext==pInod
aba0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
abb0: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
abc0: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
abd0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
abe0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
abf0: 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64  inodeList==pInod
ac00: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f  e );.        ino
ac10: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d  deList = pInode-
ac20: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
ac30: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
ac40: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
ac50: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
ac60: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  e->pNext->pPrev=
ac70: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
ac80: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
ac90: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
aca0: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
acb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
acc0: 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ree(pInode);.   
acd0: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
ace0: 20 69 6e 6f 64 65 4c 69 73 74 21 3d 30 20 7c 7c   inodeList!=0 ||
acf0: 20 6e 55 6e 75 73 65 64 46 64 3d 3d 30 20 29 3b   nUnusedFd==0 );
ad00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
ad10: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
ad20: 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e  r, locate the un
ad30: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
ad40: 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72  ct that.** descr
ad50: 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64  ibes that file d
ad60: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61  escriptor.  Crea
ad70: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
ad80: 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a  necessary.  The.
ad90: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
ada0: 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69  might be uniniti
adb0: 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72  alized if an err
adc0: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  or occurs..**.**
add0: 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72   The mutex enter
ade0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69  ed using the uni
adf0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75  xEnterMutex() fu
ae00: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68  nction must be h
ae10: 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  eld.** when this
ae20: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
ae30: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
ae40: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
ae50: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
ae60: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49  static int findI
ae70: 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78  nodeInfo(.  unix
ae80: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
ae90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
aea0: 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c  ix file with fil
aeb0: 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74  e desc used in t
aec0: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78  he key */.  unix
aed0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e  InodeInfo **ppIn
aee0: 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ode        /* Re
aef0: 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f  turn the unixIno
af00: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65  deInfo object he
af10: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
af20: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
af30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73            /* Sys
af40: 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20  tem call return 
af50: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64  code */.  int fd
af60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
af70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
af80: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
af90: 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73  for pFile */.  s
afa0: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
afb0: 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a   fileId;      /*
afc0: 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20   Lookup key for 
afd0: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
afe0: 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  o */.  struct st
aff0: 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
b000: 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76        /* Low-lev
b010: 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74  el file informat
b020: 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ion */.  unixIno
b030: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
b040: 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69   0;     /* Candi
b050: 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e  date unixInodeIn
b060: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  fo object */..  
b070: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
b080: 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a  xHeld() );..  /*
b090: 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69   Get low-level i
b0a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
b0b0: 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
b0c0: 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20  e can used to.  
b0d0: 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  ** create a uniq
b0e0: 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ue name for the 
b0f0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20  file..  */.  fd 
b100: 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63  = pFile->h;.  rc
b110: 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26   = osFstat(fd, &
b120: 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20  statbuf);.  if( 
b130: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f  rc!=0 ){.    sto
b140: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
b150: 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 69 66 20 64  e, errno);.#if d
b160: 65 66 69 6e 65 64 28 45 4f 56 45 52 46 4c 4f 57  efined(EOVERFLOW
b170: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
b180: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 29  ITE_DISABLE_LFS)
b190: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
b1a0: 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52  lastErrno==EOVER
b1b0: 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51  FLOW ) return SQ
b1c0: 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64  LITE_NOLFS;.#end
b1d0: 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
b1e0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
b1f0: 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f  .#ifdef __APPLE_
b200: 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f  _.  /* On OS X o
b210: 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73  n an msdos files
b220: 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65  ystem, the inode
b230: 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72   number is repor
b240: 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65  ted.  ** incorre
b250: 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69  ctly for zero-si
b260: 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74  ze files.  See t
b270: 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f  icket #3260.  To
b280: 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e   work.  ** aroun
b290: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  d this problem (
b2a0: 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61  we consider it a
b2b0: 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f   bug in OS X, no
b2c0: 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77  t SQLite).  ** w
b2d0: 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73  e always increas
b2e0: 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
b2f0: 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20  to 1 by writing 
b300: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20  a single byte.  
b310: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65  ** prior to acce
b320: 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20  ssing the inode 
b330: 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65  number.  The one
b340: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73   byte written is
b350: 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27  .  ** an ASCII '
b360: 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69  S' character whi
b370: 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20  ch also happens 
b380: 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
b390: 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  byte.  ** in the
b3a0: 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79   header of every
b3b0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
b3c0: 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
b3d0: 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  if there.  ** is
b3e0: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
b3f0: 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74  n such that anot
b400: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61  her thread has a
b410: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
b420: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
b430: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
b440: 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20  base, no damage 
b450: 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  is done..  */.  
b460: 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73  if( statbuf.st_s
b470: 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65  ize==0 && (pFile
b480: 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  ->fsFlags & SQLI
b490: 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
b4a0: 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64  DOS)!=0 ){.    d
b4b0: 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28  o{ rc = osWrite(
b4c0: 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68  fd, "S", 1); }wh
b4d0: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
b4e0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
b4f0: 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20   if( rc!=1 ){.  
b500: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
b510: 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
b520: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
b530: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
b540: 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73   }.    rc = osFs
b550: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
b560: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
b570: 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
b580: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
b590: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65  errno);.      re
b5a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
b5b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
b5c0: 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66  dif..  memset(&f
b5d0: 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66  ileId, 0, sizeof
b5e0: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c  (fileId));.  fil
b5f0: 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75  eId.dev = statbu
b600: 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53  f.st_dev;.#if OS
b610: 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49  _VXWORKS.  fileI
b620: 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70  d.pId = pFile->p
b630: 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65  Id;.#else.  file
b640: 49 64 2e 69 6e 6f 20 3d 20 28 75 36 34 29 73 74  Id.ino = (u64)st
b650: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65  atbuf.st_ino;.#e
b660: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 69  ndif.  assert( i
b670: 6e 6f 64 65 4c 69 73 74 21 3d 30 20 7c 7c 20 6e  nodeList!=0 || n
b680: 55 6e 75 73 65 64 46 64 3d 3d 30 20 29 3b 0a 20  UnusedFd==0 );. 
b690: 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
b6a0: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  ist;.  while( pI
b6b0: 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26  node && memcmp(&
b6c0: 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d  fileId, &pInode-
b6d0: 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  >fileId, sizeof(
b6e0: 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20  fileId)) ){.    
b6f0: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
b700: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
b710: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
b720: 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69     pInode = sqli
b730: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
b740: 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b  zeof(*pInode) );
b750: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d  .    if( pInode=
b760: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
b770: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
b780: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
b790: 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30  memset(pInode, 0
b7a0: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  , sizeof(*pInode
b7b0: 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ));.    memcpy(&
b7c0: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
b7d0: 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  &fileId, sizeof(
b7e0: 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49  fileId));.    pI
b7f0: 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  node->nRef = 1;.
b800: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
b810: 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  t = inodeList;. 
b820: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
b830: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e   = 0;.    if( in
b840: 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c  odeList ) inodeL
b850: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ist->pPrev = pIn
b860: 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69  ode;.    inodeLi
b870: 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d  st = pInode;.  }
b880: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65  else{.    pInode
b890: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
b8a0: 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64  *ppInode = pInod
b8b0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
b8c0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b8d0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70  Return TRUE if p
b8e0: 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65  File has been re
b8f0: 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65  named or unlinke
b900: 64 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 66  d since it was f
b910: 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  irst opened..*/.
b920: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48  static int fileH
b930: 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65  asMoved(unixFile
b940: 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53   *pFile){.#if OS
b950: 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72  _VXWORKS.  retur
b960: 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21  n pFile->pInode!
b970: 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64  =0 && pFile->pId
b980: 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  !=pFile->pInode-
b990: 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c  >fileId.pId;.#el
b9a0: 73 65 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  se.  struct stat
b9b0: 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70   buf;.  return p
b9c0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20  File->pInode!=0 
b9d0: 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74  &&.      (osStat
b9e0: 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26  (pFile->zPath, &
b9f0: 62 75 66 29 21 3d 30 20 0a 20 20 20 20 20 20 20  buf)!=0 .       
ba00: 20 20 7c 7c 20 28 75 36 34 29 62 75 66 2e 73 74    || (u64)buf.st
ba10: 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e  _ino!=pFile->pIn
ba20: 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29  ode->fileId.ino)
ba30: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
ba40: 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46  ** Check a unixF
ba50: 69 6c 65 20 74 68 61 74 20 69 73 20 61 20 64 61  ile that is a da
ba60: 74 61 62 61 73 65 2e 20 20 56 65 72 69 66 79 20  tabase.  Verify 
ba70: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
ba80: 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69  *.** (1) There i
ba90: 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61  s exactly one ha
baa0: 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66  rd link on the f
bab0: 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66  ile.** (2) The f
bac0: 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d  ile is not a sym
bad0: 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33  bolic link.** (3
bae0: 29 20 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e  ) The file has n
baf0: 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20  ot been renamed 
bb00: 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a  or unlinked.**.*
bb10: 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f  * Issue sqlite3_
bb20: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
bb30: 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73  NG,...) messages
bb40: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20   if anything is 
bb50: 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74  not right..*/.st
bb60: 61 74 69 63 20 76 6f 69 64 20 76 65 72 69 66 79  atic void verify
bb70: 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  DbFile(unixFile 
bb80: 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63  *pFile){.  struc
bb90: 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e  t stat buf;.  in
bba0: 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 73  t rc;..  /* Thes
bbb0: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20  e verifications 
bbc0: 6f 63 63 75 72 73 20 66 6f 72 20 74 68 65 20 6d  occurs for the m
bbd0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 6c  ain database onl
bbe0: 79 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  y */.  if( pFile
bbf0: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
bc00: 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 20  IXFILE_NOLOCK ) 
bc10: 72 65 74 75 72 6e 3b 0a 0a 20 20 72 63 20 3d 20  return;..  rc = 
bc20: 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  osFstat(pFile->h
bc30: 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72  , &buf);.  if( r
bc40: 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  c!=0 ){.    sqli
bc50: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
bc60: 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20  ARNING, "cannot 
bc70: 66 73 74 61 74 20 64 62 20 66 69 6c 65 20 25 73  fstat db file %s
bc80: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
bc90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
bca0: 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e  }.  if( buf.st_n
bcb0: 6c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73  link==0 ){.    s
bcc0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
bcd0: 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65  E_WARNING, "file
bce0: 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20   unlinked while 
bcf0: 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65  open: %s", pFile
bd00: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
bd10: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
bd20: 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29  buf.st_nlink>1 )
bd30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
bd40: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
bd50: 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b  , "multiple link
bd60: 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20  s to file: %s", 
bd70: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
bd80: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
bd90: 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f 76 65   if( fileHasMove
bda0: 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  d(pFile) ){.    
bdb0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
bdc0: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c  TE_WARNING, "fil
bdd0: 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c 65 20  e renamed while 
bde0: 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65  open: %s", pFile
bdf0: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
be00: 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  turn;.  }.}.../*
be10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
be20: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
be30: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
be40: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
be50: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
be60: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
be70: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
be80: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
be90: 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
bea0: 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
beb0: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
bec0: 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
bed0: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
bee0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
bef0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
bf00: 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
bf10: 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
bf20: 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
bf30: 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
bf40: 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b  ic int unixCheck
bf50: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
bf60: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
bf70: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
bf80: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bf90: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
bfa0: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
bfb0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
bfc0: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
bfd0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
bfe0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
bff0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
c000: 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65  LOCK; );..  asse
c010: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
c020: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
c030: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
c040: 4c 4f 43 4b 20 29 3b 0a 20 20 75 6e 69 78 45 6e  LOCK );.  unixEn
c050: 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
c060: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
c070: 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
c080: 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
c090: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
c0a0: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
c0b0: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
c0c0: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
c0d0: 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
c0e0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
c0f0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
c100: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
c110: 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  }..  /* Otherwis
c120: 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
c130: 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
c140: 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  s it..  */.#ifnd
c150: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69  ef __DJGPP__.  i
c160: 66 28 20 21 72 65 73 65 72 76 65 64 20 26 26 20  f( !reserved && 
c170: 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  !pFile->pInode->
c180: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a  bProcessLock ){.
c190: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
c1a0: 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e   lock;.    lock.
c1b0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
c1c0: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
c1d0: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
c1e0: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
c1f0: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c  l_len = 1;.    l
c200: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
c210: 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73  RLCK;.    if( os
c220: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
c230: 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20  F_GETLK, &lock) 
c240: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
c250: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
c260: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20  RESERVEDLOCK;.  
c270: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
c280: 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
c290: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
c2a0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f   lock.l_type!=F_
c2b0: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  UNLCK ){.      r
c2c0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
c2d0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
c2e0: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
c2f0: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
c300: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
c310: 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22   %d %d (unix)\n"
c320: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
c330: 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a  reserved));..  *
c340: 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
c350: 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
c360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
c370: 74 20 74 6f 20 73 65 74 20 61 20 73 79 73 74 65  t to set a syste
c380: 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  m-lock on the fi
c390: 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c  le pFile.  The l
c3a0: 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72  ock is .** descr
c3b0: 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a  ibed by pLock..*
c3c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c  *.** If the pFil
c3d0: 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61  e was opened rea
c3e0: 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69  d/write from uni
c3f0: 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65  x-excl, then the
c400: 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76   only lock.** ev
c410: 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61  er obtained is a
c420: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
c430: 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61  , and it is obta
c440: 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  ined exactly onc
c450: 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  e.** the first t
c460: 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20  ime any lock is 
c470: 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20  attempted.  All 
c480: 73 75 62 73 65 71 75 65 6e 74 20 73 79 73 74 65  subsequent syste
c490: 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65  m locking.** ope
c4a0: 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e  rations become n
c4b0: 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20  o-ops.  Locking 
c4c0: 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c  operations still
c4d0: 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c   happen internal
c4e0: 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ly,.** in order 
c4f0: 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63  to coordinate ac
c500: 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70  cess between sep
c510: 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63  arate database c
c520: 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69  onnections.** wi
c530: 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  thin this proces
c540: 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68  s, but all of th
c550: 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e  at is handled in
c560: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a   memory and the.
c570: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
c580: 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72  tem does not par
c590: 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ticipate..**.** 
c5a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
c5b0: 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20   a pass-through 
c5c0: 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b  to fcntl(F_SETLK
c5d0: 29 20 69 66 20 70 46 69 6c 65 20 69 73 20 75 73  ) if pFile is us
c5e0: 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f  ing.** any VFS o
c5f0: 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d  ther than "unix-
c600: 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c  excl" or if pFil
c610: 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22  e is opened on "
c620: 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e  unix-excl".** an
c630: 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  d is read-only..
c640: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
c650: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61  turned if the ca
c660: 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63  ll completes suc
c670: 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31  cessfully, or -1
c680: 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f   if a call.** to
c690: 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20   fcntl() fails. 
c6a0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 72  In this case, er
c6b0: 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f  rno is set appro
c6c0: 70 72 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e  priately (by fcn
c6d0: 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tl())..*/.static
c6e0: 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63   int unixFileLoc
c6f0: 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
c700: 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  e, struct flock 
c710: 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  *pLock){.  int r
c720: 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  c;.  unixInodeIn
c730: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
c740: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
c750: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
c760: 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72  eld() );.  asser
c770: 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a  t( pInode!=0 );.
c780: 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 63 74    if( (pFile->ct
c790: 72 6c 46 6c 61 67 73 20 26 20 28 55 4e 49 58 46  rlFlags & (UNIXF
c7a0: 49 4c 45 5f 45 58 43 4c 7c 55 4e 49 58 46 49 4c  ILE_EXCL|UNIXFIL
c7b0: 45 5f 52 44 4f 4e 4c 59 29 29 3d 3d 55 4e 49 58  E_RDONLY))==UNIX
c7c0: 46 49 4c 45 5f 45 58 43 4c 20 29 7b 0a 20 20 20  FILE_EXCL ){.   
c7d0: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
c7e0: 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
c7f0: 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f        struct flo
c800: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61  ck lock;.      a
c810: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
c820: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
c830: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
c840: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
c850: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
c860: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
c870: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
c880: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
c890: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
c8a0: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20  = F_WRLCK;.     
c8b0: 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46   rc = osFcntl(pF
c8c0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
c8d0: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69   &lock);.      i
c8e0: 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e  f( rc<0 ) return
c8f0: 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64   rc;.      pInod
c900: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
c910: 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  = 1;.      pInod
c920: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
c930: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
c940: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
c950: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  se{.    rc = osF
c960: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
c970: 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a  _SETLK, pLock);.
c980: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
c9a0: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
c9b0: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
c9c0: 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
c9d0: 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
c9e0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
c9f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
ca00: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
ca10: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
ca20: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
ca30: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
ca40: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
ca50: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
ca60: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
ca70: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
ca80: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
ca90: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
caa0: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
cab0: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
cac0: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
cad0: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
cae0: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
caf0: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
cb00: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
cb10: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
cb20: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
cb30: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
cb40: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
cb50: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
cb60: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
cb70: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
cb80: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
cb90: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
cba0: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
cbb0: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
cbc0: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
cbd0: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
cbe0: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
cbf0: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
cc00: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
cc10: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
cc20: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
cc30: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
cc40: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
cc50: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
cc60: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
cc70: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
cc80: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
cc90: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
cca0: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
ccb0: 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
ccc0: 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69  nt unixLock(sqli
ccd0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
cce0: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
ccf0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
cd00: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
cd10: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
cd20: 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63   the various loc
cd30: 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b  ks and.  ** lock
cd40: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20   transitions in 
cd50: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53  terms of the POS
cd60: 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72  IX advisory shar
cd70: 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  ed and exclusive
cd80: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69  .  ** lock primi
cd90: 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65  tives (called re
cda0: 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69  ad-locks and wri
cdb0: 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20  te-locks below, 
cdc0: 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f  to avoid.  ** co
cdd0: 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c  nfusion with SQL
cde0: 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e  ite lock names).
cdf0: 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20   The algorithms 
ce00: 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a  are complicated.
ce10: 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e    ** slightly in
ce20: 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d   order to be com
ce30: 70 61 74 69 62 6c 65 20 77 69 74 68 20 57 69 6e  patible with Win
ce40: 64 6f 77 73 39 35 20 73 79 73 74 65 6d 73 20 73  dows95 systems s
ce50: 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20  imultaneously.  
ce60: 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  ** accessing the
ce70: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
ce80: 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61  ile, in case tha
ce90: 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72  t is ever requir
cea0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79  ed..  **.  ** Sy
ceb0: 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e  mbols defined in
cec0: 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20   os.h indentify 
ced0: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
cee0: 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65  e' and the 'rese
cef0: 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c  rved.  ** byte',
cf00: 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74   each single byt
cf10: 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e  es at well known
cf20: 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68   offsets, and th
cf30: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
cf40: 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61   ** range', a ra
cf50: 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73  nge of 510 bytes
cf60: 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e   at a well known
cf70: 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20   offset..  **.  
cf80: 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53  ** To obtain a S
cf90: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65  HARED lock, a re
cfa0: 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ad-lock is obtai
cfb0: 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ned on the 'pend
cfc0: 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20  ing.  ** byte'. 
cfd0: 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63   If this is succ
cfe0: 65 73 73 66 75 6c 2c 20 27 73 68 61 72 65 64 20  essful, 'shared 
cff0: 62 79 74 65 20 72 61 6e 67 65 27 20 69 73 20 72  byte range' is r
d000: 65 61 64 2d 6c 6f 63 6b 65 64 0a 20 20 2a 2a 20  ead-locked.  ** 
d010: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
d020: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
d030: 65 27 20 72 65 6c 65 61 73 65 64 2e 20 20 28 4c  e' released.  (L
d040: 65 67 61 63 79 20 6e 6f 74 65 3a 20 20 57 68 65  egacy note:  Whe
d050: 6e 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 77 61  n.  ** SQLite wa
d060: 73 20 66 69 72 73 74 20 64 65 76 65 6c 6f 70 65  s first develope
d070: 64 2c 20 57 69 6e 64 6f 77 73 39 35 20 73 79 73  d, Windows95 sys
d080: 74 65 6d 73 20 77 65 72 65 20 73 74 69 6c 6c 20  tems were still 
d090: 76 65 72 79 20 63 6f 6d 6d 6f 6e 2c 0a 20 20 2a  very common,.  *
d0a0: 2a 20 61 6e 64 20 57 69 64 6e 6f 77 73 39 35 20  * and Widnows95 
d0b0: 6c 61 63 6b 73 20 61 20 73 68 61 72 65 64 2d 6c  lacks a shared-l
d0c0: 6f 63 6b 20 63 61 70 61 62 69 6c 69 74 79 2e 20  ock capability. 
d0d0: 20 53 6f 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35   So on Windows95
d0e0: 2c 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20  , a.  ** single 
d0f0: 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65  randomly selecte
d100: 64 20 62 79 20 66 72 6f 6d 20 74 68 65 20 27 73  d by from the 's
d110: 68 61 72 65 64 20 62 79 74 65 20 72 61 6e 67 65  hared byte range
d120: 27 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a  ' is locked..  *
d130: 2a 20 57 69 6e 64 6f 77 73 39 35 20 69 73 20 6e  * Windows95 is n
d140: 6f 77 20 70 72 65 74 74 79 20 6d 75 63 68 20 65  ow pretty much e
d150: 78 74 69 6e 63 74 2c 20 62 75 74 20 74 68 69 73  xtinct, but this
d160: 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 66 6f 72   work-around for
d170: 20 74 68 65 0a 20 20 2a 2a 20 6c 61 63 6b 20 6f   the.  ** lack o
d180: 66 20 73 68 61 72 65 64 2d 6c 6f 63 6b 73 20 6f  f shared-locks o
d190: 6e 20 57 69 6e 64 6f 77 73 39 35 20 6c 69 76 65  n Windows95 live
d1a0: 73 20 6f 6e 2c 20 66 6f 72 20 62 61 63 6b 77 61  s on, for backwa
d1b0: 72 64 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69  rds.  ** compati
d1c0: 62 69 6c 69 74 79 2e 29 0a 20 20 2a 2a 0a 20 20  bility.).  **.  
d1d0: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
d1e0: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52   only obtain a R
d1f0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74  ESERVED lock aft
d200: 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52  er it has a SHAR
d210: 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20  ED lock..  ** A 
d220: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
d230: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
d240: 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65  grabbing a write
d250: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a  -lock on the.  *
d260: 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65  * 'reserved byte
d270: 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  '. .  **.  ** A 
d280: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
d290: 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e   obtain a PENDIN
d2a0: 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  G lock after it 
d2b0: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20  has obtained a. 
d2c0: 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e   ** SHARED lock.
d2d0: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
d2e0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
d2f0: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
d300: 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ite-lock.  ** on
d310: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
d320: 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65  te'. This ensure
d330: 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48  s that no new SH
d340: 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62  ARED locks can b
d350: 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c  e.  ** obtained,
d360: 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48   but existing SH
d370: 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61  ARED locks are a
d380: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
d390: 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a  t. A process.  *
d3a0: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
d3b0: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  to obtain a RESE
d3c0: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
d3d0: 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e   way to a PENDIN
d3e0: 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69  G lock..  ** Thi
d3f0: 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  s property is us
d400: 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69  ed by the algori
d410: 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20  thm for rolling 
d420: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
d430: 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61  ile.  ** after a
d440: 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a   crash..  **.  *
d450: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * An EXCLUSIVE l
d460: 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66  ock, obtained af
d470: 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ter a PENDING lo
d480: 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20  ck is held, is. 
d490: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   ** implemented 
d4a0: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
d4b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
d4c0: 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20   entire 'shared 
d4d0: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
d4e0: 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65  . Since all othe
d4f0: 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20  r locks require 
d500: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f  a read-lock on o
d510: 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a  ne of the bytes.
d520: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73    ** within this
d530: 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73   range, this ens
d540: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  ures that no oth
d550: 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  er locks are hel
d560: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  d on the.  ** da
d570: 74 61 62 61 73 65 2e 20 0a 20 20 2a 2f 0a 20 20  tabase. .  */.  
d580: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d590: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
d5a0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
d5b0: 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
d5c0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
d5d0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
d5e0: 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e  ock;.  int tErrn
d5f0: 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  o = 0;..  assert
d600: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
d610: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
d620: 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
d630: 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29  d) pid=%d (unix)
d640: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
d650: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
d660: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69  eFileLock), azFi
d670: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46  leLock(pFile->eF
d680: 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  ileLock),.      
d690: 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
d6a0: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
d6b0: 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  ock), pFile->pIn
d6c0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
d6d0: 20 20 20 20 6f 73 47 65 74 70 69 64 28 30 29 29      osGetpid(0))
d6e0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
d6f0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
d700: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
d710: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
d720: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
d730: 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
d740: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
d750: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
d760: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
d770: 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
d780: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
d790: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
d7a0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
d7b0: 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
d7c0: 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
d7d0: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
d7e0: 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
d7f0: 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  d) (unix)\n", pF
d800: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
d810: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
d820: 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
d830: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d840: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
d850: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
d860: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
d870: 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31  orrect..  **  (1
d880: 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
d890: 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
d8a0: 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
d8b0: 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
d8c0: 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
d8d0: 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
d8e0: 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
d8f0: 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
d900: 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
d910: 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
d920: 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
d930: 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
d940: 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
d950: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
d960: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
d970: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
d980: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
d990: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
d9a0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
d9b0: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
d9c0: 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
d9d0: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
d9e0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d9f0: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
da00: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
da10: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
da20: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
da30: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
da40: 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
da50: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
da60: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
da70: 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
da80: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
da90: 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
daa0: 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
dab0: 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
dac0: 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
dad0: 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
dae0: 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
daf0: 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
db00: 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
db10: 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
db20: 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
db30: 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d          (pInode-
db40: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
db50: 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
db60: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
db70: 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
db80: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
db90: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
dba0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
dbb0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
dbc0: 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
dbd0: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
dbe0: 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
dbf0: 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
dc00: 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
dc10: 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
dc20: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
dc30: 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
dc40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
dc50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
dc60: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
dc70: 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49  CK && .      (pI
dc80: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
dc90: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
dca0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
dcb0: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
dcc0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
dcd0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
dce0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
dcf0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
dd00: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
dd10: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
dd20: 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
dd30: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
dd40: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
dd50: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
dd60: 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
dd70: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
dd80: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
dd90: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50  ;.  }...  /* A P
dda0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
ddb0: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
ddc0: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
ddd0: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
dde0: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
ddf0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
de00: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
de10: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
de20: 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
de30: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
de40: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
de50: 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  L;.  lock.l_when
de60: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
de70: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
de80: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
de90: 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
dea0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
deb0: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
dec0: 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
ded0: 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  K).  ){.    lock
dee0: 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65  .l_type = (eFile
def0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
df00: 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43  K?F_RDLCK:F_WRLC
df10: 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  K);.    lock.l_s
df20: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
df30: 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  YTE;.    if( uni
df40: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
df50: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
df60: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
df70: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
df80: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
df90: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
dfa0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
dfb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
dfc0: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
dfd0: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
dfe0: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
dff0: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
e000: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
e010: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  k;.    }.  }... 
e020: 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67   /* If control g
e030: 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ets to this poin
e040: 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79  t, then actually
e050: 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61   go ahead and ma
e060: 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  ke.  ** operatin
e070: 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66  g system calls f
e080: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
e090: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   lock..  */.  if
e0a0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
e0b0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
e0c0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
e0d0: 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20  nShared==0 );.  
e0e0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
e0f0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
e100: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
e110: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
e120: 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
e130: 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a  he read-lock */.
e140: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
e150: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
e160: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
e170: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
e180: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
e190: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
e1a0: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
e1b0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e1c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
e1d0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
e1e0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
e1f0: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
e200: 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  }..    /* Drop t
e210: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
e220: 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
e230: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e240: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
e250: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
e260: 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  L;.    lock.l_ty
e270: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
e280: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e290: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e2a0: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
e2b0: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  K ){.      /* Th
e2c0: 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20  is could happen 
e2d0: 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d  with a network m
e2e0: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45  ount */.      tE
e2f0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
e300: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e310: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20  IOERR_UNLOCK; . 
e320: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
e330: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
e340: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
e350: 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
e360: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
e370: 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
e380: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
e390: 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
e3a0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
e3b0: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
e3c0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
e3d0: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
e3e0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
e3f0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
e400: 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
e410: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
e420: 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
e430: 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
e440: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
e450: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
e460: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
e470: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
e480: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
e490: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
e4a0: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
e4b0: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
e4c0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
e4d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
e4e0: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
e4f0: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
e500: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
e510: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
e520: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
e530: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
e540: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
e550: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
e560: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
e570: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
e580: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e590: 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
e5a0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a  ype = F_WRLCK;..
e5b0: 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
e5c0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
e5d0: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
e5e0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
e5f0: 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69  K );.    if( eFi
e600: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
e610: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
e620: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
e630: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
e640: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
e650: 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1L;.    }else{. 
e660: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
e670: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
e680: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
e690: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
e6a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
e6b0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
e6c0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
e6d0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
e6e0: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
e6f0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
e700: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
e710: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
e720: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
e730: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
e740: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
e750: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
e760: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
e770: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a  }.    }.  }.  ..
e780: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
e790: 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  BUG.  /* Set up 
e7a0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d  the transaction-
e7b0: 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63  counter change c
e7c0: 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68  hecking flags wh
e7d0: 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69  en.  ** transiti
e7e0: 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41  oning from a SHA
e7f0: 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45  RED to a RESERVE
e800: 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61  D lock.  The cha
e810: 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48  nge.  ** from SH
e820: 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
e830: 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e   marks the begin
e840: 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c  ning of a normal
e850: 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72  .  ** write oper
e860: 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74  ation (not a hot
e870: 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63   journal rollbac
e880: 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  k)..  */.  if( r
e890: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
e8a0: 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
e8b0: 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
e8c0: 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  .   && eFileLock
e8d0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ==RESERVED_LOCK.
e8e0: 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e    ){.    pFile->
e8f0: 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
e900: 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62  0;.    pFile->db
e910: 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
e920: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
e930: 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65  rite = 1;.  }.#e
e940: 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d  ndif...  if( rc=
e950: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e960: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
e970: 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
e980: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
e990: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
e9a0: 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  k;.  }else if( e
e9b0: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
e9c0: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
e9d0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e9e0: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
e9f0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
ea00: 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
ea10: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  _LOCK;.  }..end_
ea20: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
ea30: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
ea40: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
ea50: 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22   %s %s (unix)\n"
ea60: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
ea70: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
ea80: 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
ea90: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
eaa0: 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
eab0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
eac0: 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20  ** Add the file 
ead0: 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20  descriptor used 
eae0: 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70  by file handle p
eaf0: 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72  File to the corr
eb00: 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e  esponding.** pUn
eb10: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  used list..*/.st
eb20: 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e  atic void setPen
eb30: 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20  dingFd(unixFile 
eb40: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
eb50: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
eb60: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
eb70: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
eb80: 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 50 72   *p = pFile->pPr
eb90: 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
eba0: 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
ebb0: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  Inode->pUnused;.
ebc0: 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65    pInode->pUnuse
ebd0: 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e  d = p;.  pFile->
ebe0: 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d  h = -1;.  pFile-
ebf0: 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
ec00: 75 73 65 64 20 3d 20 30 3b 0a 20 20 6e 55 6e 75  used = 0;.  nUnu
ec10: 73 65 64 46 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  sedFd++;.}../*.*
ec20: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
ec30: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
ec40: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
ec50: 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
ec60: 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
ec70: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
ec80: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
ec90: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
eca0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
ecb0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
ecc0: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
ecd0: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
ece0: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
ecf0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
ed00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
ed10: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49   no-op..** .** I
ed20: 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  f handleNFSUnloc
ed30: 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  k is true, then 
ed40: 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61  on downgrading a
ed50: 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  n EXCLUSIVE_LOCK
ed60: 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68   to SHARED.** th
ed70: 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73 20  e byte range is 
ed80: 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70  divided into 2 p
ed90: 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69 72  arts and the fir
eda0: 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63  st part is unloc
edb0: 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20  ked then.** set 
edc0: 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  to a read lock, 
edd0: 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70  then the other p
ede0: 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e  art is simply un
edf0: 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f  locked.  This wo
ee00: 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61  rks .** around a
ee10: 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20   bug in BSD NFS 
ee20: 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e  lockd (also seen
ee30: 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b   on MacOSX 10.3+
ee40: 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20  ) that fails to 
ee50: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77  .** remove the w
ee60: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72  rite lock on a r
ee70: 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61  egion when a rea
ee80: 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a  d lock is set..*
ee90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
eea0: 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
eeb0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
eec0: 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61  FileLock, int ha
eed0: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a  ndleNFSUnlock){.
eee0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
eef0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
ef00: 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
ef10: 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74  fo *pInode;.  st
ef20: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
ef30: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ef40: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
ef50: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
ef60: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
ef70: 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25  d %d was %d(%d,%
ef80: 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29  d) pid=%d (unix)
ef90: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
efa0: 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
efb0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
efc0: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
efd0: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
efe0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
eff0: 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70  ed,.      osGetp
f000: 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73 65  id(0)));..  asse
f010: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
f020: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
f030: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
f040: 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock<=eFileLock 
f050: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f060: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
f070: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
f080: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
f090: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
f0a0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
f0b0: 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ared!=0 );.  if(
f0c0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
f0d0: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
f0e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
f0f0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
f100: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
f110: 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
f120: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
f130: 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
f140: 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
f150: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
f160: 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  an start.    ** 
f170: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
f180: 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c  base file again,
f190: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
f1a0: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
f1b0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
f1c0: 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e  as updated if an
f1d0: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
f1e0: 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
f1f0: 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  le changed.  If 
f200: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
f210: 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75  counter is not u
f220: 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f  pdated,.    ** o
f230: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
f240: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
f250: 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c  e might not real
f260: 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ize that.    ** 
f270: 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  the file has cha
f280: 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d  nged and hence m
f290: 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f  ight not know to
f2a0: 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20   flush their.   
f2b0: 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20   ** cache.  The 
f2c0: 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63  use of a stale c
f2d0: 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f  ache can lead to
f2e0: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
f2f0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
f300: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
f310: 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
f320: 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72  f..    /* downgr
f330: 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65  ading to a share
f340: 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e  d lock on NFS in
f350: 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20  volves clearing 
f360: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20  the write lock. 
f370: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74     ** before est
f380: 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65  ablishing the re
f390: 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69  adlock - to avoi
f3a0: 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  d a race conditi
f3b0: 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a  on we downgrade.
f3c0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20      ** the lock 
f3d0: 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20  in 2 blocks, so 
f3e0: 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65  that part of the
f3f0: 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63   range will be c
f400: 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20  overed by a .   
f410: 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75   ** write lock u
f420: 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73  ntil the rest is
f430: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65   covered by a re
f440: 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20  ad lock:.    ** 
f450: 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20   1:   [WWWWW].  
f460: 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e    **  2:   [....
f470: 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20  W].    **  3:   
f480: 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20  [RRRRW].    **  
f490: 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20  4:   [RRRR.].   
f4a0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c   */.    if( eFil
f4b0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
f4c0: 43 4b 20 29 7b 0a 23 69 66 20 21 64 65 66 69 6e  CK ){.#if !defin
f4d0: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
f4e0: 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   !SQLITE_ENABLE_
f4f0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
f500: 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65      (void)handle
f510: 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  NFSUnlock;.     
f520: 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e   assert( handleN
f530: 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23  FSUnlock==0 );.#
f540: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
f550: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
f560: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
f570: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
f580: 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55    if( handleNFSU
f590: 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  nlock ){.       
f5a0: 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20   int tErrno;    
f5b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
f5c0: 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79  ror code from sy
f5d0: 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73  stem call errors
f5e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f   */.        off_
f5f0: 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52  t divSize = SHAR
f600: 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20  ED_SIZE - 1;.   
f610: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f       .        lo
f620: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
f630: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
f640: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
f650: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
f660: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
f670: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
f680: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
f690: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
f6a0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f6b0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f6c0: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
f6d0: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
f6e0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
f6f0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f700: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
f710: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
f720: 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
f730: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
f740: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
f750: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
f760: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
f770: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
f780: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
f790: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
f7a0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
f7b0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
f7c0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
f7d0: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
f7e0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f7f0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f800: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
f810: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
f820: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
f830: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
f840: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
f850: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
f860: 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_RDLOCK);.     
f870: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
f880: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
f890: 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
f8a0: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
f8b0: 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
f8c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
f8d0: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
f8e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f8f0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f900: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_UNLCK;.       
f910: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
f920: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
f930: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
f940: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64  = SHARED_FIRST+d
f950: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
f960: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
f970: 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65  RED_SIZE-divSize
f980: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
f990: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
f9a0: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
f9b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
f9c0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
f9d0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f9e0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
f9f0: 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
fa00: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
fa10: 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
fa20: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
fa30: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
fa40: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
fa50: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
fa60: 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
fa70: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
fa80: 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b  STYLE */.      {
fa90: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
faa0: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
fab0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
fac0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
fad0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
fae0: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
faf0: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
fb00: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
fb10: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  ED_SIZE;.       
fb20: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
fb30: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
fb40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
fb50: 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63  In theory, the c
fb60: 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c  all to unixFileL
fb70: 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  ock() cannot fai
fb80: 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65  l because anothe
fb90: 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  r.          ** p
fba0: 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
fbb0: 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  g an incompatibl
fbc0: 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f  e lock. If it do
fbd0: 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20  es, this .      
fbe0: 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73      ** indicates
fbf0: 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20   that the other 
fc00: 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
fc10: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63  ollowing the loc
fc20: 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  king.          *
fc30: 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74  * protocol. If t
fc40: 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74  his happens, ret
fc50: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
fc60: 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69  _RDLOCK. Returni
fc70: 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
fc80: 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c  SQLITE_BUSY woul
fc90: 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70  d confuse the up
fca0: 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72  per layer (in pr
fcb0: 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65 73  actice it causes
fcc0: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
fcd0: 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c  n assert to fail
fce0: 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20  ). */ .         
fcf0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
fd00: 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_RDLOCK;.     
fd10: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
fd20: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
fd30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
fd40: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
fd50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
fd60: 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c      }.    lock.l
fd70: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
fd80: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
fd90: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
fda0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
fdb0: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
fdc0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
fdd0: 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45   2L;  assert( PE
fde0: 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45  NDING_BYTE+1==RE
fdf0: 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20  SERVED_BYTE );. 
fe00: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
fe10: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
fe20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  )==0 ){.      pI
fe30: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
fe40: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
fe50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fe60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
fe70: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
fe80: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
fe90: 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
fea0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
feb0: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ock;.    }.  }. 
fec0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
fed0: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f  NO_LOCK ){.    /
fee0: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
fef0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e  shared lock coun
ff00: 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68  ter.  Release th
ff10: 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a  e lock using an.
ff20: 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f      ** OS call o
ff30: 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72  nly when all thr
ff40: 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d  eads in this sam
ff50: 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72  e process have r
ff60: 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74  eleased.    ** t
ff70: 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  he lock..    */.
ff80: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
ff90: 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  red--;.    if( p
ffa0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
ffb0: 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  0 ){.      lock.
ffc0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
ffd0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
ffe0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
fff0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
10000 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65  tart = lock.l_le
10010 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66  n = 0L;.      if
10020 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
10030 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20  File, &lock)==0 
10040 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
10050 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
10060 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65  O_LOCK;.      }e
10070 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
10080 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
10090 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 73  NLOCK;.        s
100a0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
100b0 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
100c0 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
100d0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
100e0 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
100f0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
10100 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
10110 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
10120 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
10130 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
10140 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
10150 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
10160 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
10170 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
10180 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
10190 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
101a0 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
101b0 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
101c0 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
101d0 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
101e0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
101f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
10200 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
10210 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
10220 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
10230 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
10240 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ds(pFile);.    }
10250 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b  .  }..end_unlock
10260 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
10270 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex();.  if( rc==
10280 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c  SQLITE_OK ) pFil
10290 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
102a0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
102b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
102c0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
102d0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
102e0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
102f0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
10300 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
10310 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
10320 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
10330 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
10340 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
10350 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
10360 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
10370 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
10380 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
10390 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
103a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
103b0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
103c0 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73  int unixUnlock(s
103d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
103e0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
103f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
10400 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73  MMAP_SIZE>0.  as
10410 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
10420 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
10430 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 29  ((unixFile *)id)
10440 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
10450 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
10460 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
10470 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b  , eFileLock, 0);
10480 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
10490 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73  AX_MMAP_SIZE>0.s
104a0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61  tatic int unixMa
104b0 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
104c0 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b  pFd, i64 nByte);
104d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
104e0 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46  xUnmapfile(unixF
104f0 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69  ile *pFd);.#endi
10500 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
10510 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20  nction performs 
10520 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65  the parts of the
10530 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70   "close file" op
10540 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d  eration .** comm
10550 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
10560 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c  g schemes. It cl
10570 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f  oses the directo
10580 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68  ry and file.** h
10590 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20  andles, if they 
105a0 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73  are valid, and s
105b0 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  ets all fields o
105c0 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
105d0 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30  * structure to 0
105e0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e  ..**.** It is *n
105f0 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  ot* necessary to
10600 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20   hold the mutex 
10610 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
10620 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  e is called,.** 
10630 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  even on VxWorks.
10640 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62    A mutex will b
10650 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78  e acquired on Vx
10660 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20  Works by the.** 
10670 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
10680 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a  leId() routine..
10690 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
106a0 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69  oseUnixFile(sqli
106b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
106c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
106d0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
106e0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
106f0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
10700 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  nixUnmapfile(pFi
10710 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  le);.#endif.  if
10720 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
10730 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
10740 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  e(pFile, pFile->
10750 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
10760 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
10770 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .  }.#if OS_VXWO
10780 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  RKS.  if( pFile-
10790 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20  >pId ){.    if( 
107a0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
107b0 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45   & UNIXFILE_DELE
107c0 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e  TE ){.      osUn
107d0 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d  link(pFile->pId-
107e0 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29  >zCanonicalName)
107f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f  ;.    }.    vxwo
10800 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
10810 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20  (pFile->pId);.  
10820 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30    pFile->pId = 0
10830 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
10840 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e  def SQLITE_UNLIN
10850 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20  K_AFTER_CLOSE.  
10860 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
10870 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
10880 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f 73  DELETE ){.    os
10890 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50  Unlink(pFile->zP
108a0 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
108b0 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a 2a 29  3_free(*(char**)
108c0 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a  &pFile->zPath);.
108d0 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68      pFile->zPath
108e0 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
108f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
10900 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
10910 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e  ile->h));.  Open
10920 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73  Counter(-1);.  s
10930 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
10940 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  e->pPreallocated
10950 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65  Unused);.  memse
10960 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
10970 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
10980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10990 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
109a0 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
109b0 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73  tic int unixClos
109c0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
109d0 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  id){.  int rc = 
109e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
109f0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
10a00 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
10a10 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70 46   verifyDbFile(pF
10a20 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f  ile);.  unixUnlo
10a30 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
10a40 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
10a50 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46  x();..  /* unixF
10a60 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c  ile.pInode is al
10a70 77 61 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e  ways valid here.
10a80 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64 69   Otherwise, a di
10a90 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20  fferent close.  
10aa0 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e  ** routine (e.g.
10ab0 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20   nolockClose()) 
10ac0 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  would be called 
10ad0 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  instead..  */.  
10ae0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
10af0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c  Inode->nLock>0 |
10b00 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  | pFile->pInode-
10b10 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
10b20 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
10b30 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20  (pFile->pInode) 
10b40 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
10b50 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f  ->nLock ){.    /
10b60 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
10b70 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
10b80 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
10b90 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
10ba0 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74   just.    ** yet
10bb0 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
10bc0 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
10bd0 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
10be0 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
10bf0 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
10c00 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  to pInode->pUnus
10c10 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  ed list.  It wil
10c20 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
10c30 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a  ly closed .    *
10c40 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
10c50 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
10c60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50  .    */.    setP
10c70 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b  endingFd(pFile);
10c80 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e  .  }.  releaseIn
10c90 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
10ca0 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
10cb0 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78  File(id);.  unix
10cc0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
10cd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
10cf0 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61  d of the posix a
10d00 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70  dvisory lock imp
10d10 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
10d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
10d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
10df0 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  -op Locking ****
10e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10e20 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69  *.** Of the vari
10e30 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ous locking impl
10e40 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69  ementations avai
10e50 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62  lable, this is b
10e60 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d  y far the.** sim
10e70 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20  plest:  locking 
10e80 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20  is ignored.  No 
10e90 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
10ea0 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61  to lock the data
10eb0 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  base.** file for
10ec0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
10ed0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
10ee0 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
10ef0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
10f00 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  use on read-only
10f10 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65   databases.** (e
10f20 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61  x: databases tha
10f30 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74  t are burned int
10f40 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78  o CD-ROM, for ex
10f50 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a  ample.)  It can.
10f60 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  ** also be used 
10f70 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  if the applicati
10f80 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20  on employs some 
10f90 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69  external mechani
10fa0 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74  sm to.** prevent
10fb0 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63   simultaneous ac
10fc0 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65  cess of the same
10fd0 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f   database by two
10fe0 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61   or more.** data
10ff0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
11000 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
11010 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f  a serious risk o
11020 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  f database.** co
11030 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73  rruption if this
11040 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
11050 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69   used in situati
11060 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70  ons where multip
11070 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  le.** database c
11080 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61  onnections are a
11090 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
110a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
110b0 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  at the same.** t
110c0 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d  ime and one or m
110d0 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  ore of those con
110e0 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69  nections are wri
110f0 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ting..*/..static
11100 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b   int nolockCheck
11110 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
11120 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
11130 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  ed, int *pResOut
11140 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
11150 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
11160 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
11170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11180 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
11190 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69   nolockLock(sqli
111a0 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
111b0 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
111c0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
111d0 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
111e0 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
111f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11200 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
11210 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
11220 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
11230 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
11240 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
11250 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
11260 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
11270 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11280 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c  ** Close the fil
11290 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
112a0 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c   nolockClose(sql
112b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
112c0 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
112d0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
112e0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
112f0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
11300 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65  no-op lock imple
11310 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
11320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
11380 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
11390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113d0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
113e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
113f0 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e   dot-file Lockin
11400 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
11410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11420 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69  .**.** The dotfi
11430 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  le locking imple
11440 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74  mentation uses t
11450 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20  he existence of 
11460 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a  separate lock.**
11470 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61   files (really a
11480 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63   directory) to c
11490 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
114a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
114b0 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e  This works.** on
114c0 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65 72   just about ever
114d0 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61  y filesystem ima
114e0 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68  ginable.  But th
114f0 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20  ere are serious 
11500 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a  downsides:.**.**
11510 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69      (1)  There i
11520 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e  s zero concurren
11530 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65  cy.  A single re
11540 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20  ader blocks all 
11550 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
11560 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   connections fro
11570 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  m reading or wri
11580 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
11590 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
115a0 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20   An application 
115b0 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c  crash or power l
115c0 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74  oss can leave st
115d0 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a  ale lock files.*
115e0 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e  *         sittin
115f0 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65  g around that ne
11600 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64  ed to be cleared
11610 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a   manually..**.**
11620 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61   Nevertheless, a
11630 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61   dotlock is an a
11640 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
11650 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20  ng mode for use 
11660 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c  if no.** other l
11670 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
11680 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  is available..**
11690 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b  .** Dotfile lock
116a0 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65  ing works by cre
116b0 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65 63  ating a subdirec
116c0 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65  tory in the same
116d0 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a   directory as.**
116e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
116f0 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
11700 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20  name but with a 
11710 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f  ".lock" extensio
11720 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20  n added..** The 
11730 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c  existence of a l
11740 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d  ock directory im
11750 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49  plies an EXCLUSI
11760 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74  VE lock.  All ot
11770 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65  her.** lock type
11780 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52  s (SHARED, RESER
11790 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72  VED, PENDING) ar
117a0 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58  e mapped into EX
117b0 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a  CLUSIVE..*/../*.
117c0 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66  ** The file suff
117d0 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ix added to the 
117e0 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61  data base filena
117f0 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  me in order to c
11800 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  reate the.** loc
11810 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a  k directory..*/.
11820 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f  #define DOTLOCK_
11830 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a  SUFFIX ".lock"..
11840 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11850 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
11860 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
11870 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
11880 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
11890 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
118a0 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
118b0 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
118c0 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
118d0 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
118e0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
118f0 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
11900 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
11910 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
11920 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
11930 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
11940 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
11950 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
11960 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   checking..**.**
11970 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b   In dotfile lock
11980 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f  ing, either a lo
11990 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20  ck exists or it 
119a0 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e  does not.  So in
119b0 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69   this.** variati
119c0 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72  on of CheckReser
119d0 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73  vedLock(), *pRes
119e0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72  Out is set to tr
119f0 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a  ue if any lock.*
11a00 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  * is held on the
11a10 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20   file and false 
11a20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  if the file is u
11a30 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  nlocked..*/.stat
11a40 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68  ic int dotlockCh
11a50 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
11a60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11a70 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
11a80 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11a90 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
11aa0 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
11ab0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11ac0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
11ad0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
11ae0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
11af0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
11b00 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
11b10 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
11b20 29 3b 0a 20 20 72 65 73 65 72 76 65 64 20 3d 20  );.  reserved = 
11b30 6f 73 41 63 63 65 73 73 28 28 63 6f 6e 73 74 20  osAccess((const 
11b40 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  char*)pFile->loc
11b50 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29 3d  kingContext, 0)=
11b60 3d 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  =0;.  OSTRACE(("
11b70 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
11b80 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  %d %d (dotlock)\
11b90 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
11ba0 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
11bb0 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
11bc0 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
11bd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
11be0 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
11bf0 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
11c00 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
11c10 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
11c20 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
11c30 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
11c40 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
11c50 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
11c60 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
11c70 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
11c80 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
11c90 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
11ca0 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
11cb0 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
11cc0 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
11cd0 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
11ce0 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
11cf0 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
11d00 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
11d10 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
11d20 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
11d30 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
11d40 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
11d50 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
11d60 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
11d70 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
11d80 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
11d90 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
11da0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
11db0 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
11dc0 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
11dd0 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
11de0 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
11df0 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
11e00 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
11e10 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
11e20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
11e30 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
11e40 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
11e50 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
11e60 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
11e70 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
11e80 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
11e90 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
11ea0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
11eb0 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
11ec0 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
11ed0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
11ee0 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
11ef0 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
11f00 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
11f10 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
11f20 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
11f30 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
11f40 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
11f50 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
11f60 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
11f70 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
11f80 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
11f90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11fa0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
11fb0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11fc0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11fd0 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
11fe0 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
11ff0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
12000 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20  ntext;.  int rc 
12010 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20  = SQLITE_OK;... 
12020 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61   /* If we have a
12030 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ny lock, then th
12040 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65  e lock file alre
12050 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c  ady exists.  All
12060 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
12070 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75   do is adjust ou
12080 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  r internal recor
12090 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65  d of the lock le
120a0 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  vel..  */.  if( 
120b0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
120c0 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20   > NO_LOCK ){.  
120d0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
120e0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
120f0 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70      /* Always up
12100 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61  date the timesta
12110 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69  mp on the old fi
12120 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56  le */.#ifdef HAV
12130 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d  E_UTIME.    utim
12140 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c  e(zLockFile, NUL
12150 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74  L);.#else.    ut
12160 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  imes(zLockFile, 
12170 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
12180 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12190 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
121a0 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
121b0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d  e lock */.  rc =
121c0 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69   osMkdir(zLockFi
121d0 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28  le, 0777);.  if(
121e0 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   rc<0 ){.    /* 
121f0 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
12200 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64  reate the lock d
12210 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20  irectory */.    
12220 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
12230 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49  no;.    if( EEXI
12240 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  ST == tErrno ){.
12250 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12260 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c  E_BUSY;.    } el
12270 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  se {.      rc = 
12280 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
12290 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
122a0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
122b0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
122c0 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
122d0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
122e0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
122f0 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
12300 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
12310 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20  rn rc;.  } .  . 
12320 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
12330 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
12340 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
12350 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
12360 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
12370 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12380 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
12390 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
123a0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
123b0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
123c0 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
123d0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
123e0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
123f0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
12400 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
12410 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
12420 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
12430 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
12440 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
12450 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
12460 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
12470 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  o-op..**.** When
12480 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
12490 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f  el reaches NO_LO
124a0 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  CK, delete the l
124b0 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ock file..*/.sta
124c0 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
124d0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
124e0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
124f0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
12500 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12510 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
12520 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
12530 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
12540 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
12550 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
12560 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
12570 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
12580 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
12590 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d=%d (dotlock)\n
125a0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
125b0 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
125c0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
125d0 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29  ock, osGetpid(0)
125e0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
125f0 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
12600 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
12610 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
12620 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
12630 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
12640 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
12650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12660 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77    }..  /* To dow
12670 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65 64  ngrade to shared
12680 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20  , simply update 
12690 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74  our internal not
126a0 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
126b0 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20  lock state.  No 
126c0 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74  need to mess wit
126d0 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  h the file on di
126e0 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  sk..  */.  if( e
126f0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
12700 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
12710 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
12720 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
12730 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12740 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  K;.  }.  .  /* T
12750 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74  o fully unlock t
12760 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c  he database, del
12770 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  ete the lock fil
12780 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  e */.  assert( e
12790 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
127a0 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d  K );.  rc = osRm
127b0 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a  dir(zLockFile);.
127c0 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
127d0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
127e0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74 45  rrno;.    if( tE
127f0 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a  rrno==ENOENT ){.
12800 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12810 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
12820 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
12830 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
12840 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
12850 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
12860 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rno);.    }.    
12870 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
12880 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12890 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
128a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
128b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
128c0 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73   a file.  Make s
128d0 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  ure the lock has
128e0 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62   been released b
128f0 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a  efore closing..*
12900 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
12910 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
12920 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
12930 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
12940 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
12950 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
12960 20 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c   );.  dotlockUnl
12970 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
12980 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
12990 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
129a0 6f 6e 74 65 78 74 29 3b 0a 20 20 72 65 74 75 72  ontext);.  retur
129b0 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  n closeUnixFile(
129c0 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  id);.}./********
129d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
129e0 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c  f the dot-file l
129f0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
12a00 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
12a10 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a60 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
12a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ab0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
12ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ad0 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c  ** Begin flock L
12ae0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
12af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b00 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73  *******.**.** Us
12b10 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79  e the flock() sy
12b20 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20  stem call to do 
12b30 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  file locking..**
12b40 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  .** flock() lock
12b50 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
12b60 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20  file locking in 
12b70 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73  that the various
12b80 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c  .** fine-grain l
12b90 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75  ocking levels su
12ba0 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74  pported by SQLit
12bb0 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20  e are collapsed 
12bc0 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
12bd0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
12be0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
12bf0 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
12c00 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49  ED, and.** PENDI
12c10 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65  NG locks are the
12c20 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61   same thing as a
12c30 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
12c40 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69  .  SQLite.** sti
12c50 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f  ll works when yo
12c60 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63  u do this, but c
12c70 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65  oncurrency is re
12c80 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f  duced since.** o
12c90 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
12ca0 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64  cess can be read
12cb0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
12cc0 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   at a time..**.*
12cd0 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74  * Omit this sect
12ce0 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e  ion if SQLITE_EN
12cf0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
12d00 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  LE is turned off
12d10 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
12d20 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12d30 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79  YLE../*.** Retry
12d40 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74   flock() calls t
12d50 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49  hat fail with EI
12d60 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49  NTR.*/.#ifdef EI
12d70 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72  NTR.static int r
12d80 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20  obust_flock(int 
12d90 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69  fd, int op){.  i
12da0 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
12db0 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20  = flock(fd,op); 
12dc0 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
12dd0 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
12de0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
12df0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f  else.# define ro
12e00 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20  bust_flock(a,b) 
12e10 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69  flock(a,b).#endi
12e20 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  f.     ../*.** T
12e30 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
12e40 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
12e50 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
12e60 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
12e70 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
12e80 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
12e90 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
12ea0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
12eb0 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
12ec0 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
12ed0 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
12ee0 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
12ef0 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
12f00 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
12f10 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
12f20 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
12f30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
12f40 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
12f50 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
12f60 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  t flockCheckRese
12f70 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
12f80 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
12f90 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
12fa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12fb0 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
12fc0 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
12fd0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
12fe0 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
12ff0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
13000 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13010 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
13020 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
13030 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a  rt( pFile );.  .
13040 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
13050 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
13060 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
13070 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
13080 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
13090 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
130a0 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
130b0 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
130c0 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
130d0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
130e0 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f  ess holds it. */
130f0 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
13100 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d   ){.    /* attem
13110 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  pt to get the lo
13120 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  ck */.    int lr
13130 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
13140 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
13150 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
13160 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20     if( !lrc ){. 
13170 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20       /* got the 
13180 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
13190 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72  */.      lrc = r
131a0 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
131b0 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
131c0 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29        if ( lrc )
131d0 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74   {.        int t
131e0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
131f0 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b         /* unlock
13200 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20   failed with an 
13210 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  error */.       
13220 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f   lrc = SQLITE_IO
13230 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
13240 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
13250 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
13260 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o);.        rc =
13270 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   lrc;.      }.  
13280 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
13290 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
132a0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72  rno;.      reser
132b0 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f  ved = 1;.      /
132c0 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  * someone else m
132d0 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73  ight have it res
132e0 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c  erved */.      l
132f0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
13300 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
13310 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
13320 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  ERR_LOCK); .    
13330 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
13340 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
13350 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
13360 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
13370 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
13380 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lrc;.      }.   
13390 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
133a0 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
133b0 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29  %d %d %d (flock)
133c0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
133d0 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
133e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
133f0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13400 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
13410 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49   & 0xff) == SQLI
13420 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
13430 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13440 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a      reserved=1;.
13450 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
13460 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
13470 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
13480 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
13490 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
134a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
134b0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
134c0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
134d0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
134e0 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
134f0 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
13500 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
13510 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
13520 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
13530 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
13540 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
13550 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
13560 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
13570 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
13580 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
13590 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
135a0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
135b0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
135c0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
135d0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
135e0 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
135f0 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
13600 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
13610 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
13620 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
13630 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
13640 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
13650 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
13660 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
13670 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
13680 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
13690 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
136a0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
136b0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
136c0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
136d0 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
136e0 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
136f0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
13700 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
13710 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
13720 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
13730 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
13740 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
13750 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
13760 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65   flock() only re
13770 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43  ally support EXC
13780 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57  LUSIVE locks.  W
13790 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64  e track intermed
137a0 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61  iate.** lock sta
137b0 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74  tes in the sqlit
137c0 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72  e3_file structur
137d0 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73  e, but all locks
137e0 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62   SHARED or.** ab
137f0 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45  ove are really E
13800 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61  XCLUSIVE locks a
13810 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f  nd exclude all o
13820 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66  ther processes f
13830 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68  rom.** access th
13840 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
13850 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
13860 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
13870 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
13880 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
13890 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
138a0 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
138b0 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
138c0 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71  int flockLock(sq
138d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
138e0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
138f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13900 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
13910 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
13920 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
13930 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
13940 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
13950 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
13960 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
13970 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
13980 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
13990 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
139a0 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
139b0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
139c0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
139d0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
139e0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
139f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13a00 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
13a10 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
13a20 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72  ck */.  .  if (r
13a30 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
13a40 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
13a50 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20  LOCK_NB)) {.    
13a60 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
13a70 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27  no;.    /* didn'
13a80 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62  t get, must be b
13a90 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  usy */.    rc = 
13aa0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13ab0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13ac0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
13ad0 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
13ae0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
13af0 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
13b00 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
13b10 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
13b20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20  } else {.    /* 
13b30 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
13b40 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
13b50 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ok */.    pFile-
13b60 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
13b70 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53  leLock;.  }.  OS
13b80 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
13b90 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29  %d %s %s (flock)
13ba0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
13bb0 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
13bc0 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ock), .         
13bd0 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
13be0 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
13bf0 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  "));.#ifdef SQLI
13c00 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
13c10 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66  LOCK_ERRORS.  if
13c20 28 20 28 72 63 20 26 20 30 78 66 66 29 20 3d 3d  ( (rc & 0xff) ==
13c30 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
13c40 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13c50 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BUSY;.  }.#endi
13c60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
13c70 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
13c80 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  RORS */.  return
13c90 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c   rc;.}.../*.** L
13ca0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
13cb0 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
13cc0 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
13cd0 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
13ce0 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
13cf0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
13d00 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
13d10 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
13d20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
13d30 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
13d40 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
13d50 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
13d60 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
13d70 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
13d80 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
13d90 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
13da0 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  nt flockUnlock(s
13db0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
13dc0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
13dd0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
13de0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13df0 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  )id;.  .  assert
13e00 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
13e10 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
13e20 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
13e30 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %d (flock)\n", p
13e40 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
13e50 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
13e60 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
13e70 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
13e80 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
13e90 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
13ea0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
13eb0 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
13ec0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
13ed0 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
13ee0 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
13ef0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13f00 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
13f10 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
13f20 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
13f30 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
13f40 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
13f50 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
13f60 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
13f70 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
13f80 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
13f90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13fa0 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
13fb0 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  ally, unlock. */
13fc0 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c  .  if( robust_fl
13fd0 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
13fe0 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66  CK_UN) ){.#ifdef
13ff0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
14000 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
14010 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14020 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a  TE_OK;.#endif /*
14030 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
14040 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
14050 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
14060 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
14070 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  CK;.  }else{.   
14080 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14090 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
140a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
140b0 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
140c0 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
140d0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
140e0 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
140f0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 61 73 73  ile *id) {.  ass
14100 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
14110 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  flockUnlock(id, 
14120 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74 75  NO_LOCK);.  retu
14130 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
14140 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  (id);.}..#endif 
14150 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
14160 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
14170 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a  & !OS_VXWORK */.
14180 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
14190 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
141a0 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c   flock lock impl
141b0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
141c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141d0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
141e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
14220 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
14230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14270 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
14280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
14290 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65   Named Semaphore
142a0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
142b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142c0 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  *.**.** Named se
142d0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
142e0 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65  is only supporte
142f0 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  d on VxWorks..**
14300 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
14310 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
14320 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b  t-lock and flock
14330 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c   in that it real
14340 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f  ly only.** suppo
14350 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  rts EXCLUSIVE lo
14360 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73  cking.  Only a s
14370 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61  ingle process ca
14380 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a  n read or write.
14390 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
143a0 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20  file at a time. 
143b0 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f   This reduces po
143c0 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65  tential concurre
143d0 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65  ncy, but.** make
143e0 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  s the lock imple
143f0 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65  mentation much e
14400 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53  asier..*/.#if OS
14410 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
14420 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
14430 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
14440 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
14450 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
14460 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
14470 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
14480 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
14490 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
144a0 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
144b0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
144c0 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
144d0 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
144e0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
144f0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
14500 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
14510 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
14520 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
14530 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
14540 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
14550 6e 74 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65  nt semXCheckRese
14560 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
14570 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
14580 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74  pResOut) {.  int
14590 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
145a0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
145b0 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
145c0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
145d0 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
145e0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
145f0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
14600 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
14610 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
14620 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
14630 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
14640 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
14650 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
14660 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
14670 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
14680 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
14690 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
146a0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
146b0 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
146c0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
146d0 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20   holds it. */.  
146e0 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
146f0 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  .    sem_t *pSem
14700 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
14710 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28  ->pSem;..    if(
14720 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
14730 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  m)==-1 ){.      
14740 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
14750 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41  no;.      if( EA
14760 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29  GAIN != tErrno )
14770 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
14780 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
14790 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
147a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
147b0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
147c0 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  ;.        storeL
147d0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
147e0 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  tErrno);.      }
147f0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
14800 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
14810 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65  has the lock whe
14820 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c  n we are in NO_L
14830 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  OCK */.        r
14840 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65  eserved = (pFile
14850 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48  ->eFileLock < SH
14860 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
14870 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
14880 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64       /* we could
14890 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77   have it if we w
148a0 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ant it */.      
148b0 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a  sem_post(pSem);.
148c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
148d0 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
148e0 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65 6d  CK %d %d %d (sem
148f0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
14900 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
14910 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
14920 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
14930 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
14940 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
14950 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
14960 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
14970 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
14980 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
14990 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
149a0 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
149b0 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
149c0 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
149d0 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
149e0 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
149f0 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
14a00 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
14a10 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
14a20 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
14a30 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
14a40 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
14a50 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
14a60 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
14a70 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
14a80 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
14a90 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
14aa0 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
14ab0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
14ac0 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
14ad0 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
14ae0 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
14af0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
14b00 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
14b10 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
14b20 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
14b30 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
14b40 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
14b50 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
14b60 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
14b70 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
14b80 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
14b90 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
14ba0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
14bb0 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
14bc0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
14bd0 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
14be0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
14bf0 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73   Semaphore locks
14c00 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70   only really sup
14c10 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c  port EXCLUSIVE l
14c20 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20  ocks.  We track 
14c30 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20  intermediate.** 
14c40 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74  lock states in t
14c50 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
14c60 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61  structure, but a
14c70 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20  ll locks SHARED 
14c80 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20  or.** above are 
14c90 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45  really EXCLUSIVE
14ca0 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75   locks and exclu
14cb0 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f  de all other pro
14cc0 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61  cesses from.** a
14cd0 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a  ccess the file..
14ce0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14cf0 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
14d00 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
14d10 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
14d20 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
14d30 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
14d40 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
14d50 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58  .static int semX
14d60 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
14d70 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
14d80 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
14d90 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14da0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
14db0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
14dc0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
14dd0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14de0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77  E_OK;..  /* if w
14df0 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
14e00 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63   lock, it is exc
14e10 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a  lusive.  .  ** J
14e20 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c  ust adjust level
14e30 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74   and punt on out
14e40 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66  ta here. */.  if
14e50 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
14e60 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  ck > NO_LOCK) {.
14e70 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
14e80 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
14e90 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
14ea0 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73  E_OK;.    goto s
14eb0 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  em_end_lock;.  }
14ec0 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65  .  .  /* lock se
14ed0 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20  maphore now but 
14ee0 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c  bail out when al
14ef0 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f  ready locked. */
14f00 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61  .  if( sem_trywa
14f10 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
14f20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14f30 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73  BUSY;.    goto s
14f40 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  em_end_lock;.  }
14f50 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73  ..  /* got it, s
14f60 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
14f70 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
14f80 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
14f90 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73  = eFileLock;.. s
14fa0 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72  em_end_lock:.  r
14fb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14fc0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
14fd0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
14fe0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
14ff0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
15000 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
15010 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
15020 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
15030 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
15040 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
15050 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
15060 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
15070 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
15080 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
15090 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
150a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
150b0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
150c0 69 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f 63  ic int semXUnloc
150d0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
150e0 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
150f0 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
15100 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15110 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20  le*)id;.  sem_t 
15120 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
15130 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20  Inode->pSem;..  
15140 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
15150 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d 20  .  assert( pSem 
15160 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
15170 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
15180 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29   %d pid=%d (sem)
15190 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
151a0 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
151b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
151c0 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28  eLock, osGetpid(
151d0 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0)));.  assert( 
151e0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
151f0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
15200 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
15210 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
15220 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
15230 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
15240 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15250 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
15260 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
15270 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
15280 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
15290 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
152a0 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
152b0 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
152c0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
152d0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
152e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
152f0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
15300 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63  no, really unloc
15310 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d  k. */.  if ( sem
15320 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20  _post(pSem)==-1 
15330 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20  ) {.    int rc, 
15340 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
15350 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
15360 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
15370 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
15380 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
15390 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
153a0 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
153b0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
153c0 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
153d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
153e0 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
153f0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15400 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
15410 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15420 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
15430 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69   file.. */.stati
15440 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28  c int semXClose(
15450 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
15460 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  ) {.  if( id ){.
15470 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
15480 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
15490 29 69 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c  )id;.    semXUnl
154a0 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
154b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
154c0 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45  ile );.    unixE
154d0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
154e0 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
154f0 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e  o(pFile);.    un
15500 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
15510 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c      closeUnixFil
15520 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
15530 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15540 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  ..#endif /* OS_V
15550 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20  XWORKS */./*.** 
15560 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
15570 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
15580 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57  available on VxW
15590 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  orks..**.*******
155a0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
155b0 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68  the named semaph
155c0 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ore lock impleme
155d0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
155e0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
155f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15630 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
15640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
15690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156a0 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50  ****** Begin AFP
156b0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
156c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
156e0 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c   AFP is the Appl
156f0 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f  e Filing Protoco
15700 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74  l.  AFP is a net
15710 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20  work filesystem 
15720 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c  found.** on Appl
15730 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70  e Macintosh comp
15740 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39  uters - both OS9
15750 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20   and OSX..**.** 
15760 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c  Third-party impl
15770 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41  ementations of A
15780 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  FP are available
15790 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64 65  .  But this code
157a0 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f   here.** only wo
157b0 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a  rks on OSX..*/..
157c0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
157d0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
157e0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
157f0 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  STYLE./*.** The 
15800 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
15810 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  t structure cont
15820 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63  ains all afp loc
15830 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  k specific state
15840 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
15850 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
15860 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  text afpLockingC
15870 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61  ontext;.struct a
15880 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
15890 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65   {.  int reserve
158a0 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
158b0 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
158c0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
158d0 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f  the open file */
158e0 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65  .};..struct Byte
158f0 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20  RangeLockPB2.{. 
15900 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
15910 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20  ong offset;     
15920 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20     /* offset to 
15930 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f  first byte to lo
15940 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
15950 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
15960 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72  h;        /* nbr
15970 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
15980 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
15990 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e  long long retRan
159a0 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20  geStart; /* nbr 
159b0 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b  of 1st byte lock
159c0 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
159d0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
159e0 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20  har unLockFlag; 
159f0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75          /* 1 = u
15a00 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20  nlock, 0 = lock 
15a10 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
15a20 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b  ar startEndFlag;
15a30 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20         /* 1=rel 
15a40 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20  to end of fork, 
15a50 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a  0=rel to start *
15a60 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a80 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65        /* file de
15a90 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73  sc to assoc this
15aa0 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b   lock with */.};
15ab0 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42  ..#define afpfsB
15ac0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
15ad0 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28  TL        _IOWR(
15ae0 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
15af0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
15b00 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  )../*.** This is
15b10 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73   a utility for s
15b20 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69  etting or cleari
15b30 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c  ng a bit-range l
15b40 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50  ock on an.** AFP
15b50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20   filesystem..** 
15b60 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
15b70 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c  E_OK on success,
15b80 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20   SQLITE_BUSY on 
15b90 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
15ba0 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63  ic int afpSetLoc
15bb0 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  k(.  const char 
15bc0 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  *path,          
15bd0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
15be0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f  he file to be lo
15bf0 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64  cked or unlocked
15c00 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
15c10 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
15c20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
15c30 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
15c40 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  path */.  unsign
15c50 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66  ed long long off
15c60 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  set,     /* Firs
15c70 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63  t byte to be loc
15c80 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ked */.  unsigne
15c90 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
15ca0 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  th,     /* Numbe
15cb0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
15cc0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c  ck */.  int setL
15cd0 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20  ockFlag         
15ce0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
15cf0 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c  o set lock.  Fal
15d00 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b  se to clear lock
15d10 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
15d20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
15d30 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a   pb;.  int err;.
15d40 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c    .  pb.unLockFl
15d50 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67  ag = setLockFlag
15d60 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73   ? 0 : 1;.  pb.s
15d70 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b  tartEndFlag = 0;
15d80 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f  .  pb.offset = o
15d90 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67  ffset;.  pb.leng
15da0 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20  th = length; .  
15db0 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  pb.fd = pFile->h
15dc0 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28  ;.  .  OSTRACE((
15dd0 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d  "AFPSETLOCK [%s]
15de0 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e   for %d%s in ran
15df0 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c  ge %llx:%llx\n",
15e00 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c   .    (setLockFl
15e10 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20  ag?"ON":"OFF"), 
15e20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64  pFile->h, (pb.fd
15e30 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31  ==-1?"[testval-1
15e40 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73  ]":""),.    offs
15e50 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20  et, length));.  
15e60 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68  err = fsctl(path
15e70 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  , afpfsByteRange
15e80 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c  Lock2FSCTL, &pb,
15e90 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d   0);.  if ( err=
15ea0 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  =-1 ) {.    int 
15eb0 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72  rc;.    int tErr
15ec0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
15ed0 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54  OSTRACE(("AFPSET
15ee0 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66  LOCK failed to f
15ef0 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25  sctl() '%s' %d %
15f00 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
15f10 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c     path, tErrno,
15f20 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f   strerror(tErrno
15f30 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  )));.#ifdef SQLI
15f40 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
15f50 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63  CK_ERRORS.    rc
15f60 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
15f70 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73  #else.    rc = s
15f80 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
15f90 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
15fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15fb0 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67       setLockFlag
15fc0 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   ? SQLITE_IOERR_
15fd0 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f  LOCK : SQLITE_IO
15fe0 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e  ERR_UNLOCK);.#en
15ff0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
16000 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52  NORE_AFP_LOCK_ER
16010 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20  RORS */.    if( 
16020 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
16030 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  ) ){.      store
16040 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
16050 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a   tErrno);.    }.
16060 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16070 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
16080 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16090 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
160a0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
160b0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
160c0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
160d0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
160e0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
160f0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
16100 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
16110 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
16120 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
16130 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
16140 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
16150 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
16160 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
16170 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
16180 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
16190 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
161a0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
161b0 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
161c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
161d0 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
161e0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
161f0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
16200 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
16210 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
16220 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
16230 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
16240 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
16250 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  d;.  afpLockingC
16260 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b  ontext *context;
16270 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
16280 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
16290 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
162a0 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
162b0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
162c0 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74  ile );.  context
162d0 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
162e0 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
162f0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
16300 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72    if( context->r
16310 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a  eserved ){.    *
16320 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20  pResOut = 1;.   
16330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16340 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
16350 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
16360 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
16370 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
16380 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
16390 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
163a0 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
163b0 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
163c0 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
163d0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
163e0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
163f0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
16400 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
16410 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
16420 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
16430 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
16440 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20  olds it..   */. 
16450 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
16460 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68  {.    /* lock th
16470 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20  e RESERVED byte 
16480 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
16490 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
164a0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
164b0 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
164c0 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69  E, 1,1);  .    i
164d0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72  f( SQLITE_OK==lr
164e0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  c ){.      /* if
164f0 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
16500 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65   taking the rese
16510 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63  rved lock, unloc
16520 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a  k it to restore.
16530 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
16540 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20  ginal state */. 
16550 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65       lrc = afpSe
16560 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16570 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
16580 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
16590 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  0);.    } else {
165a0 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
165b0 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68  failed to get th
165c0 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65  e lock then some
165d0 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61  one else must ha
165e0 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72  ve it */.      r
165f0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
16600 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
16610 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
16620 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20  .      rc=lrc;. 
16630 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
16640 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
16650 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
16660 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
16670 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
16680 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
16690 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73  ed));.  .  *pRes
166a0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
166b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
166c0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
166d0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
166e0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
166f0 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
16700 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
16710 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
16720 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
16730 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
16740 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
16750 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
16760 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
16770 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
16780 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
16790 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
167a0 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
167b0 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
167c0 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
167d0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
167e0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
167f0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
16800 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
16810 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
16820 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
16830 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
16840 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
16850 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
16860 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
16870 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
16880 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
16890 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
168a0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
168b0 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
168c0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
168d0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
168e0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
168f0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
16900 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
16910 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
16920 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
16930 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
16940 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
16950 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
16960 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
16970 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
16980 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
16990 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
169a0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
169b0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
169c0 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
169d0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
169e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
169f0 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  fpLock(sqlite3_f
16a00 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
16a10 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  leLock){.  int r
16a20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16a30 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
16a40 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
16a50 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
16a60 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
16a70 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  e->pInode;.  afp
16a80 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
16a90 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
16aa0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
16ab0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
16ac0 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65  ntext;.  .  asse
16ad0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
16ae0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
16af0 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
16b00 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
16b10 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
16b20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
16b30 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
16b40 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
16b50 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
16b60 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
16b70 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
16b80 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
16b90 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47 65  ->nShared , osGe
16ba0 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a  tpid(0)));..  /*
16bb0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
16bc0 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
16bd0 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
16be0 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
16bf0 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
16c00 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
16c10 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70  on't use the afp
16c20 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20  _end_lock: exit 
16c30 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
16c40 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
16c50 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
16c60 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
16c70 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
16c80 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck>=eFileLock ){
16c90 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
16ca0 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20  OCK    %d %s ok 
16cb0 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28  (already held) (
16cc0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
16cd0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  h,.           az
16ce0 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
16cf0 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ck)));.    retur
16d00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16d10 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
16d20 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
16d30 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
16d40 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
16d50 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
16d60 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
16d70 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
16d80 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
16d90 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
16da0 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
16db0 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
16dc0 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
16dd0 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
16de0 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
16df0 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
16e00 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
16e10 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
16e20 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
16e30 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
16e40 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16e50 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
16e60 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
16e70 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
16e80 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
16e90 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
16ea0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16eb0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
16ec0 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75  .  .  /* This mu
16ed0 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65  tex is needed be
16ee0 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
16ef0 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
16f00 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
16f10 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
16f20 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
16f30 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
16f40 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68  .  /* If some th
16f50 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
16f60 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76  PID has a lock v
16f70 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75  ia a different u
16f80 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61  nixFile*.  ** ha
16f90 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75  ndle that preclu
16fa0 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65  des the requeste
16fb0 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42  d lock, return B
16fc0 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  USY..  */.  if( 
16fd0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
16fe0 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  k!=pInode->eFile
16ff0 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20  Lock && .       
17000 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
17010 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
17020 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
17030 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20  ARED_LOCK)).    
17040 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
17050 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
17060 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
17070 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
17080 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  a SHARED lock is
17090 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20   requested, and 
170a0 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
170b0 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61  g this PID alrea
170c0 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48  dy.  ** has a SH
170d0 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44  ARED or RESERVED
170e0 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72   lock, then incr
170f0 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20  ement reference 
17100 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20  counts and.  ** 
17110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17120 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
17130 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
17140 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49  OCK && .     (pI
17150 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
17160 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
17170 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17180 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
17190 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
171a0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
171b0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
171c0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
171d0 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
171e0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
171f0 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
17200 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
17210 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
17220 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
17230 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
17240 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
17250 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
17260 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20  lock;.  }.    . 
17270 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f   /* A PENDING lo
17280 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66  ck is needed bef
17290 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  ore acquiring a 
172a0 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SHARED lock and 
172b0 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75  before.  ** acqu
172c0 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  iring an EXCLUSI
172d0 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68  VE lock.  For th
172e0 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
172f0 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a  he PENDING will.
17300 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
17310 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
17320 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
17330 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
17340 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
17350 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
17360 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
17370 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
17380 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a      int failed;.
17390 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
173a0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
173b0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
173c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
173d0 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69   1);.    if (fai
173e0 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20  led) {.      rc 
173f0 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  = failed;.      
17400 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
17410 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  k;.    }.  }.  .
17420 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
17430 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
17440 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
17450 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
17460 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
17470 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
17480 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
17490 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
174a0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
174b0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
174c0 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c   int lrc1, lrc2,
174d0 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a   lrc1Errno = 0;.
174e0 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73      long lk, mas
174f0 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65  k;.    .    asse
17500 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
17510 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  red==0 );.    as
17520 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
17530 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
17540 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20        .    mask 
17550 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d  = (sizeof(long)=
17560 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e  =8) ? LARGEST_IN
17570 54 36 34 20 3a 20 30 78 37 66 66 66 66 66 66 66  T64 : 0x7fffffff
17580 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74  ;.    /* Now get
17590 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53   the read-lock S
175a0 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20  HARED_LOCK */.  
175b0 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74    /* note that t
175c0 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68  he quality of th
175d0 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65  e randomness doe
175e0 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74  sn't matter that
175f0 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20   much */.    lk 
17600 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20  = random(); .   
17610 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
17620 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b  yte = (lk & mask
17630 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d  )%(SHARED_SIZE -
17640 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20   1);.    lrc1 = 
17650 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17660 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17670 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 48  e, .          SH
17680 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
17690 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
176a0 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53  , 1);.    if( IS
176b0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
176c0 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45  ) ){.      lrc1E
176d0 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61  rrno = pFile->la
176e0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20  stErrno;.    }. 
176f0 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
17700 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
17710 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63   lock */.    lrc
17720 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
17730 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17740 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
17750 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
17760 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
17770 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b  _ERROR(lrc1) ) {
17780 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
17790 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63  Errno(pFile, lrc
177a0 31 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72  1Errno);.      r
177b0 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20  c = lrc1;.      
177c0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
177d0 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
177e0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
177f0 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72  lrc2) ){.      r
17800 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20  c = lrc2;.      
17810 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
17820 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
17830 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45  ( lrc1 != SQLITE
17840 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63  _OK ) {.      rc
17850 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65   = lrc1;.    } e
17860 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  lse {.      pFil
17870 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
17880 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
17890 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
178a0 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  +;.      pInode-
178b0 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  >nShared = 1;.  
178c0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
178d0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
178e0 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e  SIVE_LOCK && pIn
178f0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
17900 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
17910 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
17920 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
17930 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
17940 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20  in this.     ** 
17950 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
17960 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
17970 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
17980 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17990 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
179a0 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
179b0 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
179c0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
179d0 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
179e0 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
179f0 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
17a00 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
17a10 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
17a20 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
17a30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
17a40 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  failed = 0;.    
17a50 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
17a60 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
17a70 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b     if (eFileLock
17a80 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   >= RESERVED_LOC
17a90 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
17aa0 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44  eLock < RESERVED
17ab0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20  _LOCK) {.       
17ac0 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
17ad0 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20  SERVED lock */. 
17ae0 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
17af0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17b00 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17b10 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
17b20 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66  , 1,1);.      if
17b30 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  ( !failed ){.   
17b40 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65       context->re
17b50 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
17b60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
17b70 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46 69   (!failed && eFi
17b80 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53  leLock == EXCLUS
17b90 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  IVE_LOCK) {.    
17ba0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
17bb0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a  EXCLUSIVE lock *
17bc0 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  /.        .     
17bd0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
17be0 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72  hared lock befor
17bf0 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e  e trying the ran
17c00 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20  ge.  we'll need 
17c10 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65  to .      ** ree
17c20 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
17c30 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63  red lock if we c
17c40 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66  an't get the  af
17c50 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f  pUnlock.      */
17c60 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69  .      if( !(fai
17c70 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
17c80 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17c90 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
17ca0 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cc0 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
17cd0 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20  yte, 1, 0)) ){. 
17ce0 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65         int faile
17cf0 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  d2 = SQLITE_OK;.
17d00 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61          /* now a
17d10 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74  ttemmpt to get t
17d20 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
17d30 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20  k range */.     
17d40 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
17d50 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
17d60 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
17d70 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20  HARED_FIRST, .  
17d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d90 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
17da0 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20  RED_SIZE, 1);.  
17db0 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65 64        if( failed
17dc0 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61   && (failed2 = a
17dd0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17de0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17df0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
17e00 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
17e10 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d  _FIRST + pInode-
17e20 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
17e30 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  1)) ){.         
17e40 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61   /* Can't reesta
17e50 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
17e60 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63   lock.  Sqlite c
17e70 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20  an't deal, this 
17e80 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
17e90 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65  a critical I/O e
17ea0 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
17eb0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
17ec0 20 28 28 66 61 69 6c 65 64 20 26 20 30 78 66 66   ((failed & 0xff
17ed0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
17ee0 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a  R) ? failed2 : .
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17f00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
17f10 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
17f20 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
17f30 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
17f40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
17f50 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20  c = failed; .   
17f60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
17f70 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  f( failed ){.   
17f80 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
17f90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69      }.  }.  .  i
17fa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17fb0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
17fc0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
17fd0 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
17fe0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
17ff0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
18000 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
18010 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
18020 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
18030 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
18040 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
18050 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
18060 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
18070 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
18080 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
18090 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
180a0 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
180b0 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %s (afp)\n", pFi
180c0 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
180d0 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
180e0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
180f0 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
18100 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
18110 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18120 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
18130 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
18140 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
18150 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
18160 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
18170 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
18180 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
18190 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
181a0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
181b0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
181c0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
181d0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
181e0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
181f0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
18200 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
18210 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
18220 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73   int afpUnlock(s
18230 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
18240 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
18250 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18260 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
18270 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
18280 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
18290 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
182a0 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
182b0 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
182c0 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
182d0 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
182e0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
182f0 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64    int skipShared
18300 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
18310 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68  ITE_TEST.  int h
18320 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e   = pFile->h;.#en
18330 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
18340 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
18350 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
18360 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
18370 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
18380 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
18390 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
183a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
183b0 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
183c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
183d0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
183e0 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  red,.           
183f0 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a  osGetpid(0)));..
18400 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
18410 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
18420 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
18430 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c  >eFileLock<=eFil
18440 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
18450 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18460 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
18470 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
18480 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
18490 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
184a0 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b  e->nShared!=0 );
184b0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
184c0 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
184d0 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
184e0 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
184f0 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69  Lock==pFile->eFi
18500 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69  leLock );.    Si
18510 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
18520 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75  ign(1);.    Simu
18530 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
18540 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61  -1) ).    Simula
18550 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
18560 30 29 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20  0);.    .#ifdef 
18570 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
18580 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
18590 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
185a0 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
185b0 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
185c0 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
185d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
185e0 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
185f0 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
18600 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
18610 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
18620 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
18630 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
18640 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
18650 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
18660 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
18670 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
18680 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
18690 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
186a0 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
186b0 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
186c0 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
186d0 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
186e0 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
186f0 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
18700 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
18710 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
18720 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
18730 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
18740 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
18750 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
18760 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
18770 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
18780 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61  || pFile->dbUpda
18790 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
187a0 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73   || pFile->trans
187b0 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20  CntrChng==1 );. 
187c0 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
187d0 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
187e0 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28  dif.    .    if(
187f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18800 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
18810 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
18820 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18830 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18840 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
18850 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
18860 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
18870 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
18880 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
18890 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
188a0 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20  nShared>1) ){.  
188b0 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65        /* only re
188c0 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  -establish the s
188d0 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65  hared lock if ne
188e0 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20  cessary */.     
188f0 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63     int sharedLoc
18900 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
18910 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
18920 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20  redByte;.       
18930 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
18940 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18950 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
18960 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  ockByte, 1, 1);.
18970 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
18980 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65         skipShare
18990 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
189a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
189b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
189c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
189d0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
189e0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
189f0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18a00 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
18a10 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
18a20 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66  );.    } .    if
18a30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18a40 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
18a50 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
18a60 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72  CK && context->r
18a70 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20  eserved ){.     
18a80 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
18a90 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18aa0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
18ab0 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
18ac0 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20       if( !rc ){ 
18ad0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
18ae0 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20  ->reserved = 0; 
18af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18b00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18b10 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
18b20 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18b30 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
18b40 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49  ed>1)){.      pI
18b50 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
18b60 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
18b70 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
18b80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18b90 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
18ba0 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65  CK ){..    /* De
18bb0 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
18bc0 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
18bd0 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
18be0 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
18bf0 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
18c00 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
18c10 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
18c20 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
18c30 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
18c40 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
18c50 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
18c60 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  ng sharedLockByt
18c70 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
18c80 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
18c90 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  yte;.    pInode-
18ca0 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20  >nShared--;.    
18cb0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  if( pInode->nSha
18cc0 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
18cd0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18ce0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
18cf0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18d00 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20   h=(-1) ).      
18d10 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18d20 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
18d30 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20  if( !skipShared 
18d40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
18d50 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18d60 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18d70 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
18d80 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
18d90 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  }.      if( !rc 
18da0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
18db0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
18dc0 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  O_LOCK;.        
18dd0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18de0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
18df0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18e00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18e10 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
18e20 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20  >nLock--;.      
18e30 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
18e40 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
18e50 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
18e60 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
18e70 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
18e80 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
18e90 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  }.    }.  }.  . 
18ea0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
18eb0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
18ec0 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
18ed0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
18ee0 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
18ef0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
18f00 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61  se a file & clea
18f10 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63  nup AFP specific
18f20 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
18f30 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
18f40 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  afpClose(sqlite3
18f50 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
18f60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18f70 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
18f80 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
18f90 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
18fa0 69 64 21 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e  id!=0 );.  afpUn
18fb0 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
18fc0 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
18fd0 74 65 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69  tex();.  if( pFi
18fe0 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46  le->pInode && pF
18ff0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
19000 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ck ){.    /* If 
19010 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
19020 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
19030 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
19040 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
19050 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61  .    ** yet beca
19060 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
19070 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
19080 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
19090 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
190a0 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49  descriptor to pI
190b0 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20  node->aPending. 
190c0 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
190d0 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
190e0 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   when.    ** the
190f0 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
19100 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
19110 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
19120 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  File);.  }.  rel
19130 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
19140 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ile);.  sqlite3_
19150 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
19160 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72  ingContext);.  r
19170 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
19180 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
19190 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
191a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
191b0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
191c0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
191d0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
191e0 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
191f0 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
19200 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  s the AFP lock i
19210 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
19220 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
19230 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
19240 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
19250 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
19260 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
19270 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
19280 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49  is available.  I
19290 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70  f you don't comp
192a0 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74  ile for a mac, t
192b0 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66  hen the "unix-af
192c0 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74  p".** VFS is not
192d0 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
192e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192f0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
19300 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
19310 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
19320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
19330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
19380 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
19390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
193d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
193f0 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n NFS Locking **
19400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
19420 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
19430 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
19440 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
19450 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f  _STYLE./*. ** Lo
19460 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
19470 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
19480 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
19490 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
194a0 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74  ileLock. ** must
194b0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
194c0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
194d0 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68  K.. **. ** If th
194e0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
194f0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
19500 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
19510 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a  y at or below. *
19520 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
19530 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
19540 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
19550 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74   no-op.. */.stat
19560 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b  ic int nfsUnlock
19570 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
19580 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
19590 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69  ){.  return posi
195a0 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
195b0 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65  eLock, 1);.}..#e
195c0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
195d0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
195e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
195f0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
19600 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76  ** The code abov
19610 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63  e is the NFS loc
19620 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
19630 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73  .  The code is s
19640 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61  pecific.** to Ma
19650 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f  cOSX and does no
19660 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20  t work on other 
19670 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20  unix platforms. 
19680 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   No alternative.
19690 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ** is available.
196a0 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    .**.**********
196b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
196c0 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  of the NFS lock 
196d0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
196e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
196f0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
19700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19740 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
19750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19790 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
197a0 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b  ******* Non-lock
197b0 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ing sqlite3_file
197c0 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
197d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197e0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
197f0 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63   next division c
19800 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e  ontains implemen
19810 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20  tations for all 
19820 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a  methods of the .
19830 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ** sqlite3_file 
19840 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61  object other tha
19850 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  n the locking me
19860 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b  thods.  The lock
19870 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77  ing.** methods w
19880 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64  ere defined in d
19890 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28  ivisions above (
198a0 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  one locking meth
198b0 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69  od per.** divisi
198c0 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68  on).  Those meth
198d0 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d  ods that are com
198e0 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69  mon to all locki
198f0 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20  ng modes.** are 
19900 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72 20  gather together 
19910 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73 69  into this divisi
19920 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  on..*/../*.** Se
19930 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
19940 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
19950 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
19960 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a  then read cnt .*
19970 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  * bytes into pBu
19980 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  f. Return the nu
19990 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
199a0 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a  tually read..**.
199b0 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64  ** NB:  If you d
199c0 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20  efine USE_PREAD 
199d0 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20  or USE_PREAD64, 
199e0 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c  then it might al
199f0 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61  so.** be necessa
19a00 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  ry to define _XO
19a10 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65  PEN_SOURCE to be
19a20 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69   500.  This vari
19a30 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73  es from.** one s
19a40 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72  ystem to another
19a50 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20  .  Since SQLite 
19a60 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20  does not define 
19a70 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20  USE_PREAD.** in 
19a80 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61  any form by defa
19a90 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74  ult, we will not
19aa0 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69   attempt to defi
19ab0 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
19ac0 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73  ..** See tickets
19ad0 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31   #2741 and #2681
19ae0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
19af0 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
19b00 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
19b10 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c  ailed read the l
19b20 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
19b30 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
19b40 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
19b50 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
19b60 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69  Read(unixFile *i
19b70 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
19b80 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70   offset, void *p
19b90 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
19ba0 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20   int got;.  int 
19bb0 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28  prior = 0;.#if (
19bc0 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
19bd0 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
19be0 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
19bf0 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
19c00 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
19c10 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ART;.  assert( c
19c20 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66  nt==(cnt&0x1ffff
19c30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
19c40 64 2d 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a  d->h>2 );.  do{.
19c50 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
19c60 50 52 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d  PREAD).    got =
19c70 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20   osPread(id->h, 
19c80 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
19c90 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  t);.    Simulate
19ca0 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
19cb0 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  1 );.#elif defin
19cc0 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
19cd0 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61      got = osPrea
19ce0 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  d64(id->h, pBuf,
19cf0 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
19d00 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19d10 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a  or( got = -1 );.
19d20 23 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66  #else.    newOff
19d30 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
19d40 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
19d50 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
19d60 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
19d70 66 73 65 74 20 3d 20 2d 31 20 29 3b 0a 20 20 20  fset = -1 );.   
19d80 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 3c 30   if( newOffset<0
19d90 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
19da0 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69  astErrno((unixFi
19db0 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a  le*)id, errno);.
19dc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
19dd0 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d  .    }.    got =
19de0 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70   osRead(id->h, p
19df0 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69  Buf, cnt);.#endi
19e00 66 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63  f.    if( got==c
19e10 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  nt ) break;.    
19e20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
19e30 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49     if( errno==EI
19e40 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20  NTR ){ got = 1; 
19e50 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20  continue; }.    
19e60 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20    prior = 0;.   
19e70 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
19e80 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c  o((unixFile*)id,
19e90 20 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20    errno);.      
19ea0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
19eb0 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20   if( got>0 ){.  
19ec0 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a      cnt -= got;.
19ed0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
19ee0 67 6f 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72  got;.      prior
19ef0 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70   += got;.      p
19f00 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f  Buf = (void*)(go
19f10 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29  t + (char*)pBuf)
19f20 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
19f30 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d  ( got>0 );.  TIM
19f40 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43  ER_END;.  OSTRAC
19f50 45 28 28 22 52 45 41 44 20 20 20 20 25 2d 33 64  E(("READ    %-3d
19f60 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c   %5d %7lld %llu\
19f70 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
19f80 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72  id->h, got+prior
19f90 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20  , offset-prior, 
19fa0 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
19fb0 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72  .  return got+pr
19fc0 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ior;.}../*.** Re
19fd0 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
19fe0 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
19ff0 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
1a000 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
1a010 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
1a020 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
1a030 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
1a040 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
1a050 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
1a060 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a  c int unixRead(.
1a070 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1a080 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75  id, .  void *pBu
1a090 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
1a0a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1a0b0 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46  ffset.){.  unixF
1a0c0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1a0d0 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69  ixFile *)id;.  i
1a0e0 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  nt got;.  assert
1a0f0 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
1a100 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20  ( offset>=0 );. 
1a110 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
1a120 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1a130 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
1a140 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
1a150 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  l, master-journa
1a160 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66  l or temp.  ** f
1a170 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20  ile), the bytes 
1a180 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
1a190 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  ange should neve
1a1a0 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  r be read or wri
1a1b0 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  tten. */.#if 0. 
1a1c0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
1a1d0 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
1a1e0 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  sed==0.       ||
1a1f0 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47   offset>=PENDING
1a200 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20  _BYTE+512.      
1a210 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d   || offset+amt<=
1a220 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20  PENDING_BYTE .  
1a230 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  );.#endif..#if S
1a240 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1a250 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20  IZE>0.  /* Deal 
1a260 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20  with as much of 
1a270 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65 73  this read reques
1a280 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
1a290 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
1a2a0 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
1a2b0 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
1a2c0 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
1a2d0 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
1a2e0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1a2f0 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
1a300 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
1a310 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1a320 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
1a330 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
1a340 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
1a350 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  et], amt);.     
1a360 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a370 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1a380 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
1a390 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1a3a0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
1a3b0 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28  memcpy(pBuf, &((
1a3c0 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
1a3d0 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
1a3e0 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  ], nCopy);.     
1a3f0 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29   pBuf = &((u8 *)
1a400 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20  pBuf)[nCopy];.  
1a410 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79      amt -= nCopy
1a420 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
1a430 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20  = nCopy;.    }. 
1a440 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74   }.#endif..  got
1a450 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
1a460 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42  File, offset, pB
1a470 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20  uf, amt);.  if( 
1a480 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20  got==amt ){.    
1a490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a4a0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f  ;.  }else if( go
1a4b0 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61  t<0 ){.    /* la
1a4c0 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
1a4d0 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20  eekAndRead */.  
1a4e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a4f0 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65  IOERR_READ;.  }e
1a500 6c 73 65 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61  lse{.    storeLa
1a510 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30  stErrno(pFile, 0
1a520 29 3b 20 20 20 2f 2a 20 6e 6f 74 20 61 20 73 79  );   /* not a sy
1a530 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
1a540 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
1a550 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
1a560 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
1a570 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
1a580 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
1a590 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
1a5a0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
1a5b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1a5c0 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
1a5d0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
1a5e0 73 65 65 6b 20 74 68 65 20 66 69 6c 65 2d 64 65  seek the file-de
1a5f0 73 63 72 69 70 74 6f 72 20 70 61 73 73 65 64 20  scriptor passed 
1a600 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1a610 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f  ument to.** abso
1a620 6c 75 74 65 20 6f 66 66 73 65 74 20 69 4f 66 66  lute offset iOff
1a630 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74  , then attempt t
1a640 6f 20 77 72 69 74 65 20 6e 42 75 66 20 62 79 74  o write nBuf byt
1a650 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a  es of data from.
1a660 2a 2a 20 70 42 75 66 20 74 6f 20 69 74 2e 20 49  ** pBuf to it. I
1a670 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1a680 73 2c 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64  s, return -1 and
1a690 20 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f   set *piErrno. O
1a6a0 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65  therwise, .** re
1a6b0 74 75 72 6e 20 74 68 65 20 61 63 74 75 61 6c 20  turn the actual 
1a6c0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1a6d0 77 72 69 74 74 65 6e 20 28 77 68 69 63 68 20 6d  written (which m
1a6e0 61 79 20 62 65 20 6c 65 73 73 20 74 68 61 6e 0a  ay be less than.
1a6f0 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61  ** nBuf)..*/.sta
1a700 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57  tic int seekAndW
1a710 72 69 74 65 46 64 28 0a 20 20 69 6e 74 20 66 64  riteFd(.  int fd
1a720 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1a740 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
1a750 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36  write to */.  i6
1a760 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20  4 iOff,         
1a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a780 20 46 69 6c 65 20 6f 66 66 73 65 74 20 74 6f 20   File offset to 
1a790 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74  begin writing at
1a7a0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1a7b0 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
1a7c0 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61        /* Copy da
1a7d0 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66  ta from this buf
1a7e0 66 65 72 20 74 6f 20 74 68 65 20 66 69 6c 65 20  fer to the file 
1a7f0 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20 20  */.  int nBuf,  
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a810 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a820 62 75 66 66 65 72 20 70 42 75 66 20 69 6e 20 62  buffer pBuf in b
1a830 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ytes */.  int *p
1a840 69 45 72 72 6e 6f 20 20 20 20 20 20 20 20 20 20  iErrno          
1a850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1a860 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65 72 20 69  : Error number i
1a870 66 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a  f error occurs *
1a880 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
1a890 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1a8a0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1a8b0 72 65 74 75 72 6e 65 64 20 62 79 20 73 79 73 74  returned by syst
1a8c0 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73  em call */..  as
1a8d0 73 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75  sert( nBuf==(nBu
1a8e0 66 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20  f&0x1ffff) );.  
1a8f0 61 73 73 65 72 74 28 20 66 64 3e 32 20 29 3b 0a  assert( fd>2 );.
1a900 20 20 61 73 73 65 72 74 28 20 70 69 45 72 72 6e    assert( piErrn
1a910 6f 21 3d 30 20 29 3b 0a 20 20 6e 42 75 66 20 26  o!=0 );.  nBuf &
1a920 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d  = 0x1ffff;.  TIM
1a930 45 52 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20 64  ER_START;..#if d
1a940 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1a950 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e  ).  do{ rc = (in
1a960 74 29 6f 73 50 77 72 69 74 65 28 66 64 2c 20 70  t)osPwrite(fd, p
1a970 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29  Buf, nBuf, iOff)
1a980 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
1a990 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
1a9a0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1a9b0 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64  USE_PREAD64).  d
1a9c0 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50  o{ rc = (int)osP
1a9d0 77 72 69 74 65 36 34 28 66 64 2c 20 70 42 75 66  write64(fd, pBuf
1a9e0 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77  , nBuf, iOff);}w
1a9f0 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
1aa00 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c  rno==EINTR);.#el
1aa10 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34  se.  do{.    i64
1aa20 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66   iSeek = lseek(f
1aa30 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45  d, iOff, SEEK_SE
1aa40 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
1aa50 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b 20 3d  IOError( iSeek =
1aa60 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69   -1 );.    if( i
1aa70 53 65 65 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20  Seek<0 ){.      
1aa80 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62  rc = -1;.      b
1aa90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1aaa0 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c  rc = osWrite(fd,
1aab0 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20   pBuf, nBuf);.  
1aac0 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1aad0 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
1aae0 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f  #endif..  TIMER_
1aaf0 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  END;.  OSTRACE((
1ab00 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35  "WRITE   %-3d %5
1ab10 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
1ab20 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54   fd, rc, iOff, T
1ab30 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a  IMER_ELAPSED));.
1ab40 0a 20 20 69 66 28 20 72 63 3c 30 20 29 20 2a 70  .  if( rc<0 ) *p
1ab50 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  iErrno = errno;.
1ab60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ab70 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
1ab80 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d  he offset in id-
1ab90 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61  >offset then rea
1aba0 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f  d cnt bytes into
1abb0 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e   pBuf..** Return
1abc0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1abd0 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
1abe0 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20  ad.  Update the 
1abf0 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f  offset..**.** To
1ac00 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
1ac10 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
1ac20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74  on a failed writ
1ac30 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  e the lastErrno 
1ac40 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
1ac50 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1ac60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ac70 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69  seekAndWrite(uni
1ac80 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f  xFile *id, i64 o
1ac90 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69  ffset, const voi
1aca0 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
1acb0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65 65 6b  ){.  return seek
1acc0 41 6e 64 57 72 69 74 65 46 64 28 69 64 2d 3e 68  AndWriteFd(id->h
1acd0 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
1ace0 63 6e 74 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72  cnt, &id->lastEr
1acf0 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rno);.}.../*.** 
1ad00 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
1ad10 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
1ad20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
1ad30 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1ad40 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
1ad50 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
1ad60 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
1ad70 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69  atic int unixWri
1ad80 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
1ad90 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74  le *id, .  const
1ada0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
1adb0 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
1adc0 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
1add0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
1ade0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1adf0 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f  e*)id;.  int wro
1ae00 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  te = 0;.  assert
1ae10 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
1ae20 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ( amt>0 );..  /*
1ae30 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61   If this is a da
1ae40 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
1ae50 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74   a journal, mast
1ae60 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65  er-journal or te
1ae70 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74  mp.  ** file), t
1ae80 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
1ae90 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68  locking range sh
1aea0 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65  ould never be re
1aeb0 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a  ad or written. *
1aec0 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
1aed0 28 20 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c  ( pFile->pPreall
1aee0 6f 63 61 74 65 64 55 6e 75 73 65 64 3d 3d 30 0a  ocatedUnused==0.
1aef0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1af00 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
1af10 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
1af20 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
1af30 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
1af40 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1af50 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20  E_DEBUG.  /* If 
1af60 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
1af70 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
1af80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1af90 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
1afa0 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1afb0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1afc0 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1afd0 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1afe0 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
1aff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1b000 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
1b010 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
1b020 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
1b030 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
1b040 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1b050 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
1b060 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
1b070 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
1b080 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  /.  if( pFile->i
1b090 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a  nNormalWrite ){.
1b0a0 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
1b0b0 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ate = 1;  /* The
1b0c0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
1b0d0 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  en modified */. 
1b0e0 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32     if( offset<=2
1b0f0 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e  4 && offset+amt>
1b100 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =27 ){.      int
1b110 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
1b120 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20  oldCntr[4];.    
1b130 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b140 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
1b150 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65    rc = seekAndRe
1b160 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c  ad(pFile, 24, ol
1b170 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20  dCntr, 4);.     
1b180 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1b190 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1b1a0 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65   if( rc!=4 || me
1b1b0 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28  mcmp(oldCntr, &(
1b1c0 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d  (char*)pBuf)[24-
1b1d0 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29  offset], 4)!=0 )
1b1e0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1b1f0 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
1b200 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e   1;  /* The tran
1b210 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1b220 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  has changed */. 
1b230 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1b240 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
1b250 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41 50  ined(SQLITE_MMAP
1b260 5f 52 45 41 44 57 52 49 54 45 29 20 26 26 20 53  _READWRITE) && S
1b270 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1b280 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20  IZE>0.  /* Deal 
1b290 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20  with as much of 
1b2a0 74 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65  this write reque
1b2b0 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62  st as possible b
1b2c0 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20  y transfering.  
1b2d0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
1b2e0 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
1b2f0 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20  using memcpy(). 
1b300 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
1b310 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
1b320 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73   ){.    if( offs
1b330 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d  et+amt <= pFile-
1b340 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
1b350 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20     memcpy(&((u8 
1b360 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
1b370 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
1b380 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20  pBuf, amt);.    
1b390 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b3a0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
1b3b0 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
1b3c0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1b3d0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
1b3e0 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
1b3f0 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1b400 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
1b410 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  uf, nCopy);.    
1b420 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
1b430 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
1b440 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
1b450 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
1b460 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
1b470 20 20 7d 0a 23 65 6e 64 69 66 0a 20 0a 20 20 77    }.#endif. .  w
1b480 68 69 6c 65 28 20 28 77 72 6f 74 65 20 3d 20 73  hile( (wrote = s
1b490 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
1b4a0 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c  e, offset, pBuf,
1b4b0 20 61 6d 74 29 29 3c 61 6d 74 20 26 26 20 77 72   amt))<amt && wr
1b4c0 6f 74 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74  ote>0 ){.    amt
1b4d0 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f   -= wrote;.    o
1b4e0 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a  ffset += wrote;.
1b4f0 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68      pBuf = &((ch
1b500 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d  ar*)pBuf)[wrote]
1b510 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65  ;.  }.  Simulate
1b520 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  IOError(( wrote=
1b530 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a  (-1), amt=1 ));.
1b540 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
1b550 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  llError(( wrote=
1b560 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20  0, amt=1 ));..  
1b570 69 66 28 20 61 6d 74 3e 77 72 6f 74 65 20 29 7b  if( amt>wrote ){
1b580 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30  .    if( wrote<0
1b590 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45   && pFile->lastE
1b5a0 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a  rrno!=ENOSPC ){.
1b5b0 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72        /* lastErr
1b5c0 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
1b5d0 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  dWrite */.      
1b5e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1b5f0 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  ERR_WRITE;.    }
1b600 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72  else{.      stor
1b610 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
1b620 2c 20 30 29 3b 20 2f 2a 20 6e 6f 74 20 61 20 73  , 0); /* not a s
1b630 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
1b640 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b650 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
1b660 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
1b670 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
1b680 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
1b690 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
1b6a0 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
1b6b0 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
1b6c0 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
1b6d0 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
1b6e0 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
1b6f0 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
1b700 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
1b710 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
1b720 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
1b730 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
1b740 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1b750 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
1b760 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74  *.** We do not t
1b770 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20  rust systems to 
1b780 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e  provide a workin
1b790 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20  g fdatasync().  
1b7a0 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65  Some do..** Othe
1b7b0 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65  rs do no.  To be
1b7c0 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73   safe, we will s
1b7d0 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73  tick with the (s
1b7e0 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a  lightly slower).
1b7f0 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79  ** fsync(). If y
1b800 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75  ou know that you
1b810 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75  r system does su
1b820 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28  pport fdatasync(
1b830 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20  ) correctly,.** 
1b840 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70  then simply comp
1b850 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61  ile with -Dfdata
1b860 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 20 6f  sync=fdatasync o
1b870 72 20 2d 44 48 41 56 45 5f 46 44 41 54 41 53 59  r -DHAVE_FDATASY
1b880 4e 43 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  NC.*/.#if !defin
1b890 65 64 28 66 64 61 74 61 73 79 6e 63 29 20 26 26  ed(fdatasync) &&
1b8a0 20 21 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43   !HAVE_FDATASYNC
1b8b0 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73  .# define fdatas
1b8c0 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66  ync fsync.#endif
1b8d0 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48  ../*.** Define H
1b8e0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f  AVE_FULLFSYNC to
1b8f0 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e   0 or 1 dependin
1b900 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
1b910 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c  not.** the F_FUL
1b920 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20  LFSYNC macro is 
1b930 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c  defined.  F_FULL
1b940 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74  FSYNC is current
1b950 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c  ly.** only avail
1b960 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58  able on Mac OS X
1b970 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c  .  But that coul
1b980 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66  d change..*/.#if
1b990 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a  def F_FULLFSYNC.
1b9a0 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
1b9b0 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a  LLFSYNC 1.#else.
1b9c0 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
1b9d0 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66  LLFSYNC 0.#endif
1b9e0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79  .../*.** The fsy
1b9f0 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  nc() system call
1ba00 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61   does not work a
1ba10 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20  s advertised on 
1ba20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73  many.** unix sys
1ba30 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  tems.  The follo
1ba40 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69  wing procedure i
1ba50 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
1ba60 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20  make.** it work 
1ba70 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  better..**.** Th
1ba80 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
1ba90 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20   macro disables 
1baa0 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54  all fsync()s.  T
1bab0 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a  his is useful.**
1bac0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65   for testing whe
1bad0 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e  n we want to run
1bae0 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73   through the tes
1baf0 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e  t suite quickly.
1bb00 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f  .** You are stro
1bb10 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f  ngly advised *no
1bb20 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74  t* to deploy wit
1bb30 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
1bb40 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77  .** enabled, how
1bb50 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68  ever, since with
1bb60 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1bb70 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63  enabled, an OS c
1bb80 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  rash.** or power
1bb90 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69   failure will li
1bba0 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  kely corrupt the
1bbb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1bbc0 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74  **.** SQLite set
1bbd0 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  s the dataOnly f
1bbe0 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20  lag if the size 
1bbf0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  of the file is u
1bc00 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65  nchanged..** The
1bc10 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74   idea behind dat
1bc20 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74  aOnly is that it
1bc30 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69   should only wri
1bc40 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  te the file cont
1bc50 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20  ent.** to disk, 
1bc60 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20  not the inode.  
1bc70 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61  We only set data
1bc80 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65  Only if the file
1bc90 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63   size is .** unc
1bca0 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65  hanged since the
1bcb0 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61   file size is pa
1bcc0 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e  rt of the inode.
1bcd0 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54    However, .** T
1bce0 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73  ed Ts'o tells us
1bcf0 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
1bd00 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74  ) will also writ
1bd10 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74  e the inode if t
1bd20 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  he.** file size 
1bd30 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68  has changed.  Th
1bd40 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66  e only real diff
1bd50 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66  erence between f
1bd60 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e  datasync().** an
1bd70 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74  d fsync(), Ted t
1bd80 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74  ells us, is that
1bd90 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
1bda0 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a  l not flush the.
1bdb0 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20  ** inode if the 
1bdc0 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f  mtime or owner o
1bdd0 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74  r other inode at
1bde0 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68  tributes have ch
1bdf0 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c  anged..** We onl
1be00 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  y care about the
1be10 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20   file size, not 
1be20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61  the other file a
1be30 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a  ttributes, so.**
1be40 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74   as far as SQLit
1be50 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20  e is concerned, 
1be60 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  an fdatasync() i
1be70 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74  s always adequat
1be80 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77  e..** So, we alw
1be90 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e  ays use fdatasyn
1bea0 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61  c() if it is ava
1beb0 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65  ilable, regardle
1bec0 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c  ss of.** the val
1bed0 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e  ue of the dataOn
1bee0 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74  ly flag..*/.stat
1bef0 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  ic int full_fsyn
1bf00 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75  c(int fd, int fu
1bf10 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61  llSync, int data
1bf20 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
1bf30 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1bf40 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66  wing "ifdef/elif
1bf50 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61  /else/" block ha
1bf60 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63  s the same struc
1bf70 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  ture as.  ** the
1bf80 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69   one below. It i
1bf90 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72  s replicated her
1bfa0 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69  e solely to avoi
1bfb0 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20  d cluttering .  
1bfc0 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63  ** up the real c
1bfd0 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55  ode with the UNU
1bfe0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20  SED_PARAMETER() 
1bff0 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66  macros..  */.#if
1c000 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1c010 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
1c020 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
1c030 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
1c040 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
1c050 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1c060 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56  Only);.#elif HAV
1c070 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e  E_FULLFSYNC.  UN
1c080 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
1c090 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a  ataOnly);.#else.
1c0a0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1c0b0 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
1c0c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1c0d0 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64  (dataOnly);.#end
1c0e0 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  if..  /* Record 
1c0f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
1c100 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
1c110 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
1c120 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
1c130 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
1c140 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
1c150 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
1c160 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
1c170 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
1c180 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
1c190 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
1c1a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1c1b0 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
1c1c0 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
1c1d0 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
1c1e0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
1c1f0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
1c200 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
1c210 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
1c220 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
1c230 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
1c240 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 2e 20 20   a.  ** no-op.  
1c250 42 75 74 20 67 6f 20 61 68 65 61 64 20 61 6e 64  But go ahead and
1c260 20 63 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f   call fstat() to
1c270 20 76 61 6c 69 64 61 74 65 20 74 68 65 20 66 69   validate the fi
1c280 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  le.  ** descript
1c290 6f 72 20 61 73 20 77 65 20 6e 65 65 64 20 61 20  or as we need a 
1c2a0 6d 65 74 68 6f 64 20 74 6f 20 70 72 6f 76 6f 6b  method to provok
1c2b0 65 20 61 20 66 61 69 6c 75 72 65 20 64 75 72 69  e a failure duri
1c2c0 6e 67 0a 20 20 2a 2a 20 63 6f 76 65 72 61 74 65  ng.  ** coverate
1c2d0 20 74 65 73 74 69 6e 67 2e 0a 20 20 2a 2f 0a 23   testing..  */.#
1c2e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
1c2f0 53 59 4e 43 0a 20 20 7b 0a 20 20 20 20 73 74 72  SYNC.  {.    str
1c300 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
1c310 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66    rc = osFstat(f
1c320 64 2c 20 26 62 75 66 29 3b 0a 20 20 7d 0a 23 65  d, &buf);.  }.#e
1c330 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1c340 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  NC.  if( fullSyn
1c350 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  c ){.    rc = os
1c360 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  Fcntl(fd, F_FULL
1c370 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
1c380 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
1c390 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
1c3a0 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64  FULLFSYNC failed
1c3b0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61  , fall back to a
1c3c0 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79  ttempting an fsy
1c3d0 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68  nc()..  ** It sh
1c3e0 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69  ouldn't be possi
1c3f0 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e  ble for fullfsyn
1c400 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65  c to fail on the
1c410 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c   local .  ** fil
1c420 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58  e system (on OSX
1c430 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e  ), so failure in
1c440 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c  dicates that FUL
1c450 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27  LFSYNC.  ** isn'
1c460 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
1c470 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d  this file system
1c480 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e  . So, attempt an
1c490 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64   fsync .  ** and
1c4a0 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72   (for now) ignor
1c4b0 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  e the overhead o
1c4c0 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20  f a superfluous 
1c4d0 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20  fcntl call.  .  
1c4e0 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65  ** It'd be bette
1c4f0 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c  r to detect full
1c500 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e  fsync support on
1c510 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20  ce and avoid .  
1c520 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c  ** the fcntl cal
1c530 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e  l every time syn
1c540 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a  c is called..  *
1c550 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20  /.  if( rc ) rc 
1c560 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65  = fsync(fd);..#e
1c570 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
1c580 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74  PLE__).  /* fdat
1c590 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20  async() on HFS+ 
1c5a0 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73  doesn't yet flus
1c5b0 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  h the file size 
1c5c0 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f  if it changed co
1c5d0 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20  rrectly.  ** so 
1c5e0 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66  currently we def
1c5f0 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72  ault to the macr
1c600 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73  o that redefines
1c610 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73   fdatasync to fs
1c620 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ync.  */.  rc = 
1c630 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65  fsync(fd);.#else
1c640 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79   .  rc = fdatasy
1c650 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56  nc(fd);.#if OS_V
1c660 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d  XWORKS.  if( rc=
1c670 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  =-1 && errno==EN
1c680 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20  OTSUP ){.    rc 
1c690 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
1c6a0 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
1c6b0 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20  WORKS */.#endif 
1c6c0 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
1c6d0 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56  NO_SYNC elif HAV
1c6e0 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a  E_FULLFSYNC */..
1c6f0 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
1c700 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20   && rc!= -1 ){. 
1c710 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
1c720 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c730 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
1c740 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
1c750 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
1c760 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69  taining file zFi
1c770 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75  lename..** If su
1c780 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69  ccessful, *pFd i
1c790 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65  s set to the ope
1c7a0 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ned file descrip
1c7b0 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  tor and.** SQLIT
1c7c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1c7d0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1c7e0 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c  curs, either SQL
1c7f0 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20  ITE_NOMEM.** or 
1c800 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1c810 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1c820 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61  *pFd is set to a
1c830 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76  n undefined.** v
1c840 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alue..**.** The 
1c850 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
1c860 65 73 63 72 69 70 74 6f 72 20 69 73 20 75 73 65  escriptor is use
1c870 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74  d for only one t
1c880 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79  hing - to.** fsy
1c890 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f 72 79  nc() a directory
1c8a0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69   to make sure fi
1c8b0 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  le creation and 
1c8c0 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a  deletion events.
1c8d0 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ** are flushed t
1c8e0 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73  o disk.  Such fs
1c8f0 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65  yncs are not nee
1c900 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20  ded on newer.** 
1c910 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73  journaling files
1c920 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20  ystems, but are 
1c930 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65  required on olde
1c940 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a  r filesystems..*
1c950 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c960 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64  e can be overrid
1c970 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53  den using the xS
1c980 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66  etSysCall interf
1c990 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c  ace..** The abil
1c9a0 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20  ity to override 
1c9b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1c9c0 20 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72   added in suppor
1c9d0 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f  t of the.** chro
1c9e0 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f  mium sandbox.  O
1c9f0 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f  pening a directo
1ca00 72 79 20 69 73 20 61 20 73 65 63 75 72 69 74 79  ry is a security
1ca10 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a   risk (we are.**
1ca20 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67   told) so making
1ca30 20 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65   it overrideable
1ca40 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f   allows the chro
1ca50 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a  mium sandbox to.
1ca60 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73 20  ** replace this 
1ca70 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 68  routine with a h
1ca80 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20  armless no-op.  
1ca90 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75  To make this rou
1caa0 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c  tine.** a no-op,
1cab0 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68   replace it with
1cac0 20 61 20 73 74 75 62 20 74 68 61 74 20 72 65 74   a stub that ret
1cad0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62  urns SQLITE_OK b
1cae0 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46  ut leaves.** *pF
1caf0 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74  d set to a negat
1cb00 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  ive number..**.*
1cb10 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
1cb20 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
1cb30 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
1cb40 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e  sible for closin
1cb50 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  g.** the file de
1cb60 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73  scriptor *pFd us
1cb70 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a  ing close()..*/.
1cb80 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
1cb90 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
1cba0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1cbb0 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74  int *pFd){.  int
1cbc0 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20   ii;.  int fd = 
1cbd0 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e  -1;.  char zDirn
1cbe0 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
1cbf0 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  +1];..  sqlite3_
1cc00 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
1cc10 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c  HNAME, zDirname,
1cc20 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65   "%s", zFilename
1cc30 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74  );.  for(ii=(int
1cc40 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65  )strlen(zDirname
1cc50 29 3b 20 69 69 3e 30 20 26 26 20 7a 44 69 72 6e  ); ii>0 && zDirn
1cc60 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69  ame[ii]!='/'; ii
1cc70 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20  --);.  if( ii>0 
1cc80 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b  ){.    zDirname[
1cc90 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65  ii] = '\0';.  }e
1cca0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 7a 44 69  lse{.    if( zDi
1ccb0 72 6e 61 6d 65 5b 30 5d 21 3d 27 2f 27 20 29 20  rname[0]!='/' ) 
1ccc0 7a 44 69 72 6e 61 6d 65 5b 30 5d 20 3d 20 27 2e  zDirname[0] = '.
1ccd0 27 3b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b  ';.    zDirname[
1cce0 31 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 64  1] = 0;.  }.  fd
1ccf0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
1cd00 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  Dirname, O_RDONL
1cd10 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a  Y|O_BINARY, 0);.
1cd20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20    if( fd>=0 ){. 
1cd30 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
1cd40 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c  NDIR %-3d %s\n",
1cd50 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b   fd, zDirname));
1cd60 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64  .  }.  *pFd = fd
1cd70 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 20  ;.  if( fd>=0 ) 
1cd80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1cd90 3b 0a 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c  ;.  return unixL
1cda0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
1cdb0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
1cdc0 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 7a  penDirectory", z
1cdd0 44 69 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  Dirname);.}../*.
1cde0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
1cdf0 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
1ce00 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
1ce10 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
1ce20 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  sk..**.** If dat
1ce30 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f  aOnly==0 then bo
1ce40 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65  th the file itse
1ce50 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64  lf and its metad
1ce60 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a  ata (file.** siz
1ce70 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20  e, access time, 
1ce80 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e  etc) are synced.
1ce90 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30    If dataOnly!=0
1cea0 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a   then only the.*
1ceb0 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73  * file data is s
1cec0 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64  ynced..**.** Und
1ced0 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61  er Unix, also ma
1cee0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1cef0 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1cf00 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a   for the file.**
1cf10 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
1cf20 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74  d by fsync-ing t
1cf30 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
1cf40 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  t contains the f
1cf50 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f  ile..** If we do
1cf60 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64   not do this and
1cf70 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20   we encounter a 
1cf80 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
1cf90 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
1cfa0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
1cfb0 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
1cfc0 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72  exist after we r
1cfd0 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74  eboot.  The next
1cfe0 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63  .** SQLite to ac
1cff0 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69  cess the file wi
1d000 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74  ll not know that
1d010 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69   the journal exi
1d020 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  sts (because.** 
1d030 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
1d040 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
1d050 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72  nal was never cr
1d060 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74  eated) and the t
1d070 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69  ransaction.** wi
1d080 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b  ll not roll back
1d090 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64   - possibly lead
1d0a0 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
1d0b0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
1d0c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79  tatic int unixSy
1d0d0 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
1d0e0 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  *id, int flags){
1d0f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
1d100 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1d110 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
1d120 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20   int isDataOnly 
1d130 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  = (flags&SQLITE_
1d140 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a  SYNC_DATAONLY);.
1d150 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63    int isFullsync
1d160 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d   = (flags&0x0F)=
1d170 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1d180 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  L;..  /* Check t
1d190 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  hat one of SQLIT
1d1a0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  E_SYNC_NORMAL or
1d1b0 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64   FULL was passed
1d1c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c   */.  assert((fl
1d1d0 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
1d1e0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20  E_SYNC_NORMAL.  
1d1f0 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78      || (flags&0x
1d200 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
1d210 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  _FULL.  );..  /*
1d220 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
1d230 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
1d240 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1d250 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
1d260 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
1d270 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
1d280 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
1d290 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
1d2a0 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
1d2b0 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
1d2c0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1d2d0 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73  E_FULL );..  ass
1d2e0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1d2f0 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 20  OSTRACE(("SYNC  
1d300 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
1d310 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75  ->h));.  rc = fu
1d320 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e  ll_fsync(pFile->
1d330 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69  h, isFullsync, i
1d340 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69  sDataOnly);.  Si
1d350 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1d360 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20  c=1 );.  if( rc 
1d370 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  ){.    storeLast
1d380 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
1d390 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  no);.    return 
1d3a0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1d3b0 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c  ITE_IOERR_FSYNC,
1d3c0 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70   "full_fsync", p
1d3d0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1d3e0 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79  }..  /* Also fsy
1d3f0 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  nc the directory
1d400 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1d410 66 69 6c 65 20 69 66 20 74 68 65 20 44 49 52 53  file if the DIRS
1d420 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73  YNC flag.  ** is
1d430 20 73 65 74 2e 20 20 54 68 69 73 20 69 73 20 61   set.  This is a
1d440 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72   one-time occurr
1d450 65 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74  ence.  Many syst
1d460 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41  ems (examples: A
1d470 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61  IX).  ** are una
1d480 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64  ble to fsync a d
1d490 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e  irectory, so ign
1d4a0 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68  ore errors on th
1d4b0 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20  e fsync..  */.  
1d4c0 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
1d4d0 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
1d4e0 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69  DIRSYNC ){.    i
1d4f0 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53  nt dirfd;.    OS
1d500 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43 20  TRACE(("DIRSYNC 
1d510 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79  %s (have_fullfsy
1d520 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25  nc=%d fullsync=%
1d530 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  d)\n", pFile->zP
1d540 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ath,.           
1d550 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c   HAVE_FULLFSYNC,
1d560 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20   isFullsync));. 
1d570 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69     rc = osOpenDi
1d580 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a  rectory(pFile->z
1d590 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20  Path, &dirfd);. 
1d5a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d5b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 75  E_OK ){.      fu
1d5c0 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20  ll_fsync(dirfd, 
1d5d0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62  0, 0);.      rob
1d5e0 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
1d5f0 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   dirfd, __LINE__
1d600 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1d610 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1d620 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1d630 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1d640 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1d650 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1d660 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45  ags &= ~UNIXFILE
1d670 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20  _DIRSYNC;.  }.  
1d680 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d690 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
1d6a0 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
1d6b0 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
1d6c0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1d6d0 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
1d6e0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e  _file *id, i64 n
1d6f0 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c  Byte){.  unixFil
1d700 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1d710 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
1d720 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
1d730 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61  File );.  Simula
1d740 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
1d750 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  n SQLITE_IOERR_T
1d760 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a  RUNCATE );..  /*
1d770 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
1d780 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68   configured a ch
1d790 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69  unk-size for thi
1d7a0 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65  s file, truncate
1d7b0 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73   the.  ** file s
1d7c0 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73  o that it consis
1d7d0 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  ts of an integer
1d7e0 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b   number of chunk
1d7f0 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a  s (i.e. the.  **
1d800 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a   actual file siz
1d810 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72  e after the oper
1d820 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72  ation may be lar
1d830 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ger than the req
1d840 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65  uested.  ** size
1d850 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  )..  */.  if( pF
1d860 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
1d870 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28  {.    nByte = ((
1d880 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73  nByte + pFile->s
1d890 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c  zChunk - 1)/pFil
1d8a0 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
1d8b0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
1d8c0 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74  }..  rc = robust
1d8d0 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
1d8e0 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  ->h, nByte);.  i
1d8f0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f  f( rc ){.    sto
1d900 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1d910 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  e, errno);.    r
1d920 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1d930 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1d940 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e  TRUNCATE, "ftrun
1d950 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  cate", pFile->zP
1d960 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23  ath);.  }else{.#
1d970 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1d980 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  UG.    /* If we 
1d990 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
1d9a0 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
1d9b0 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
1d9c0 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a  opposed to.    *
1d9d0 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
1d9e0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
1d9f0 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
1da00 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
1da10 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61  n a.    ** norma
1da20 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
1da30 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65   and we truncate
1da40 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
1da50 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a  o length,.    **
1da60 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65 6c   that effectivel
1da70 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
1da80 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54  ange counter.  T
1da90 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1daa0 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73  .    ** when res
1dab0 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61 73  toring a databas
1dac0 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b  e using the back
1dad0 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65  up API from a ze
1dae0 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a  ro-length.    **
1daf0 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a   source..    */.
1db00 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69      if( pFile->i
1db10 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20  nNormalWrite && 
1db20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
1db30 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
1db40 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20  trChng = 1;.    
1db50 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
1db60 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1db70 5a 45 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74  ZE>0.    /* If t
1db80 68 65 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  he file was just
1db90 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20   truncated to a 
1dba0 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  size smaller tha
1dbb0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a  n the currently.
1dbc0 20 20 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65      ** mapped re
1dbd0 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65  gion, reduce the
1dbe0 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69   effective mappi
1dbf0 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e  ng size as well.
1dc00 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20   SQLite will.   
1dc10 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20 61   ** use read() a
1dc20 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61 63  nd write() to ac
1dc30 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64  cess data beyond
1dc40 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d   this point from
1dc50 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a   now on.  .    *
1dc60 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c  /.    if( nByte<
1dc70 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1dc80 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1dc90 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65  mmapSize = nByte
1dca0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1dcb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1dcc0 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
1dcd0 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
1dce0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1dcf0 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
1dd00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1dd10 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  nixFileSize(sqli
1dd20 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
1dd30 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  4 *pSize){.  int
1dd40 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74   rc;.  struct st
1dd50 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74  at buf;.  assert
1dd60 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f  ( id );.  rc = o
1dd70 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c  sFstat(((unixFil
1dd80 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29  e*)id)->h, &buf)
1dd90 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1dda0 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1ddb0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1ddc0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28  storeLastErrno((
1ddd0 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72  unixFile*)id, er
1dde0 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rno);.    return
1ddf0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1de00 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a  TAT;.  }.  *pSiz
1de10 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b  e = buf.st_size;
1de20 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e  ..  /* When open
1de30 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20  ing a zero-size 
1de40 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69  database, the fi
1de50 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72  ndInodeInfo() pr
1de60 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69  ocedure.  ** wri
1de70 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74  tes a single byt
1de80 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65  e into that file
1de90 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
1dea0 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20  k around a bug. 
1deb0 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20   ** in the OS-X 
1dec0 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
1ded0 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61  .  In order to a
1dee0 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69  void problems wi
1def0 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61  th upper.  ** la
1df00 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  yers, we need to
1df10 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c   report this fil
1df20 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65  e size as zero e
1df30 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
1df40 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20  .  ** really 1. 
1df50 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a    Ticket #3260..
1df60 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a    */.  if( *pSiz
1df70 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20  e==1 ) *pSize = 
1df80 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  0;...  return SQ
1df90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
1dfa0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1dfb0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1dfc0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1dfd0 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  )./*.** Handler 
1dfe0 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  for proxy-lockin
1dff0 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76  g file-control v
1e000 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62  erbs.  Defined b
1e010 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70  elow in the.** p
1e020 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
1e030 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  division..*/.sta
1e040 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
1e050 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1e060 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
1e070 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a  );.#endif../* .*
1e080 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1e090 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e  is called to han
1e0a0 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46  dle the SQLITE_F
1e0b0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a  CNTL_SIZE_HINT .
1e0c0 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ** file-control 
1e0d0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61  operation.  Enla
1e0e0 72 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rge the database
1e0f0 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69   to nBytes in si
1e100 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75  ze.** (rounded u
1e110 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68  p to the next ch
1e120 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74  unk-size).  If t
1e130 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
1e140 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73  lready.** nBytes
1e150 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73   or larger, this
1e160 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1e170 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
1e180 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74  nt fcntlSizeHint
1e190 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
1e1a0 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
1e1b0 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1e1c0 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20  nk>0 ){.    i64 
1e1d0 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
1e1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
1e1f0 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
1e200 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
1e210 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20 20  at buf;         
1e220 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1e230 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75  hold return valu
1e240 65 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f  es of fstat() */
1e250 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46  .   .    if( osF
1e260 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
1e270 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65  buf) ){.      re
1e280 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1e290 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 0a  R_FSTAT;.    }..
1e2a0 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42      nSize = ((nB
1e2b0 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75  yte+pFile->szChu
1e2c0 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73  nk-1) / pFile->s
1e2d0 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
1e2e0 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66  >szChunk;.    if
1e2f0 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66  ( nSize>(i64)buf
1e300 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66  .st_size ){..#if
1e310 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
1e320 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
1e330 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
1e340 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20  LOCATE.      /* 
1e350 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69  The code below i
1e360 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72  s handling the r
1e370 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f  eturn value of o
1e380 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20  sFallocate() .  
1e390 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79      ** correctly
1e3a0 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  . posix_fallocat
1e3b0 65 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  e() is defined t
1e3c0 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  o "returns zero 
1e3d0 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20  on success, .   
1e3e0 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f     ** or an erro
1e3f0 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69  r number on  fai
1e400 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d  lure". See the m
1e410 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61 69  anpage for detai
1e420 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ls. */.      int
1e430 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a   err;.      do{.
1e440 20 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73          err = os
1e450 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d  Fallocate(pFile-
1e460 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c  >h, buf.st_size,
1e470 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69   nSize-buf.st_si
1e480 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  ze);.      }whil
1e490 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b  e( err==EINTR );
1e4a0 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29  .      if( err )
1e4b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1e4c0 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73  OERR_WRITE;.#els
1e4d0 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  e.      /* If th
1e4e0 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61  e OS does not ha
1e4f0 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  ve posix_falloca
1e500 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 57  te(), fake it. W
1e510 72 69 74 65 20 61 20 0a 20 20 20 20 20 20 2a 2a  rite a .      **
1e520 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20   single byte to 
1e530 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e  the last byte in
1e540 20 65 61 63 68 20 62 6c 6f 63 6b 20 74 68 61 74   each block that
1e550 20 66 61 6c 6c 73 20 65 6e 74 69 72 65 6c 79 0a   falls entirely.
1e560 20 20 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20        ** within 
1e570 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 67  the extended reg
1e580 69 6f 6e 2e 20 54 68 65 6e 2c 20 69 66 20 72 65  ion. Then, if re
1e590 71 75 69 72 65 64 2c 20 61 20 73 69 6e 67 6c 65  quired, a single
1e5a0 20 62 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 61   byte.      ** a
1e5b0 74 20 6f 66 66 73 65 74 20 28 6e 53 69 7a 65 2d  t offset (nSize-
1e5c0 31 29 2c 20 74 6f 20 73 65 74 20 74 68 65 20 73  1), to set the s
1e5d0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1e5e0 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20  correctly..     
1e5f0 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73 69   ** This is a si
1e600 6d 69 6c 61 72 20 74 65 63 68 6e 69 71 75 65 20  milar technique 
1e610 74 6f 20 74 68 61 74 20 75 73 65 64 20 62 79 20  to that used by 
1e620 67 6c 69 62 63 20 6f 6e 20 73 79 73 74 65 6d 73  glibc on systems
1e630 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 64  .      ** that d
1e640 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61  o not have a rea
1e650 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 63 61  l fallocate() ca
1e660 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ll..      */.   
1e670 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75     int nBlk = bu
1e680 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f  f.st_blksize;  /
1e690 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c  * File-system bl
1e6a0 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ock size */.    
1e6b0 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
1e6c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e6d0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1e6e0 20 77 72 69 74 74 65 6e 20 62 79 20 73 65 65 6b   written by seek
1e6f0 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20  AndWrite */.    
1e700 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20    i64 iWrite;   
1e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e720 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20   Next offset to 
1e730 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20  write to */..   
1e740 20 20 20 69 57 72 69 74 65 20 3d 20 28 62 75 66     iWrite = (buf
1e750 2e 73 74 5f 73 69 7a 65 2f 6e 42 6c 6b 29 2a 6e  .st_size/nBlk)*n
1e760 42 6c 6b 20 2b 20 6e 42 6c 6b 20 2d 20 31 3b 0a  Blk + nBlk - 1;.
1e770 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 57        assert( iW
1e780 72 69 74 65 3e 3d 62 75 66 2e 73 74 5f 73 69 7a  rite>=buf.st_siz
1e790 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
1e7a0 74 28 20 28 28 69 57 72 69 74 65 2b 31 29 25 6e  t( ((iWrite+1)%n
1e7b0 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Blk)==0 );.     
1e7c0 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20   for(/*no-op*/; 
1e7d0 69 57 72 69 74 65 3c 6e 53 69 7a 65 2b 6e 42 6c  iWrite<nSize+nBl
1e7e0 6b 2d 31 3b 20 69 57 72 69 74 65 2b 3d 6e 42 6c  k-1; iWrite+=nBl
1e7f0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  k ){.        if(
1e800 20 69 57 72 69 74 65 3e 3d 6e 53 69 7a 65 20 29   iWrite>=nSize )
1e810 20 69 57 72 69 74 65 20 3d 20 6e 53 69 7a 65 20   iWrite = nSize 
1e820 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 57 72  - 1;.        nWr
1e830 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ite = seekAndWri
1e840 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65  te(pFile, iWrite
1e850 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20  , "", 1);.      
1e860 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20    if( nWrite!=1 
1e870 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1e880 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
1e890 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1e8a0 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  }.  }..#if SQLIT
1e8b0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1e8c0 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d  0.  if( pFile->m
1e8d0 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 26 26 20  mapSizeMax>0 && 
1e8e0 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61  nByte>pFile->mma
1e8f0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74  pSize ){.    int
1e900 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 46 69   rc;.    if( pFi
1e910 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20 29  le->szChunk<=0 )
1e920 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75  {.      if( robu
1e930 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69  st_ftruncate(pFi
1e940 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b  le->h, nByte) ){
1e950 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
1e960 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
1e970 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72  rrno);.        r
1e980 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1e990 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1e9a0 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e  TRUNCATE, "ftrun
1e9b0 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  cate", pFile->zP
1e9c0 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
1e9d0 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e    }..    rc = un
1e9e0 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c  ixMapfile(pFile,
1e9f0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74   nByte);.    ret
1ea00 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
1ea10 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  if..  return SQL
1ea20 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1ea30 20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69   If *pArg is ini
1ea40 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20  tially negative 
1ea50 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20 71  then this is a q
1ea60 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67  uery.  Set *pArg
1ea70 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65   to.** 1 or 0 de
1ea80 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1ea90 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61  er or not bit ma
1eaa0 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  sk of pFile->ctr
1eab0 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a  lFlags is set..*
1eac0 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1ead0 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c   0 or 1, then cl
1eae0 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d  ear or set the m
1eaf0 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65  ask bit of pFile
1eb00 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a  ->ctrlFlags..*/.
1eb10 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
1eb20 4d 6f 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65  ModeBit(unixFile
1eb30 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65   *pFile, unsigne
1eb40 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74  d char mask, int
1eb50 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a   *pArg){.  if( *
1eb60 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70  pArg<0 ){.    *p
1eb70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74  Arg = (pFile->ct
1eb80 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21  rlFlags & mask)!
1eb90 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  =0;.  }else if( 
1eba0 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20  (*pArg)==0 ){.  
1ebb0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1ebc0 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d  gs &= ~mask;.  }
1ebd0 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
1ebe0 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61  >ctrlFlags |= ma
1ebf0 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f  sk;.  }.}../* Fo
1ec00 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1ec10 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
1ec20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
1ec30 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1ec40 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  zBuf);../*.** In
1ec50 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f  formation and co
1ec60 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e  ntrol of an open
1ec70 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
1ec80 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1ec90 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
1eca0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1ecb0 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
1ecc0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1ecd0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1ece0 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20  *)id;.  switch( 
1ecf0 6f 70 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  op ){.#if define
1ed00 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20  d(__linux__) && 
1ed10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1ed20 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d  NABLE_BATCH_ATOM
1ed30 49 43 5f 57 52 49 54 45 29 0a 20 20 20 20 63 61  IC_WRITE).    ca
1ed40 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ed50 42 45 47 49 4e 5f 41 54 4f 4d 49 43 5f 57 52 49  BEGIN_ATOMIC_WRI
1ed60 54 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  TE: {.      int 
1ed70 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69  rc = osIoctl(pFi
1ed80 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f  le->h, F2FS_IOC_
1ed90 53 54 41 52 54 5f 41 54 4f 4d 49 43 5f 57 52 49  START_ATOMIC_WRI
1eda0 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  TE);.      retur
1edb0 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 49 4f  n rc ? SQLITE_IO
1edc0 45 52 52 5f 42 45 47 49 4e 5f 41 54 4f 4d 49 43  ERR_BEGIN_ATOMIC
1edd0 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   : SQLITE_OK;.  
1ede0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1edf0 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54  ITE_FCNTL_COMMIT
1ee00 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b  _ATOMIC_WRITE: {
1ee10 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1ee20 6f 73 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68  osIoctl(pFile->h
1ee30 2c 20 46 32 46 53 5f 49 4f 43 5f 43 4f 4d 4d 49  , F2FS_IOC_COMMI
1ee40 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 3b  T_ATOMIC_WRITE);
1ee50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ee60 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   ? SQLITE_IOERR_
1ee70 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 20 3a 20  COMMIT_ATOMIC : 
1ee80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1ee90 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1eea0 5f 46 43 4e 54 4c 5f 52 4f 4c 4c 42 41 43 4b 5f  _FCNTL_ROLLBACK_
1eeb0 41 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a  ATOMIC_WRITE: {.
1eec0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f        int rc = o
1eed0 73 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sIoctl(pFile->h,
1eee0 20 46 32 46 53 5f 49 4f 43 5f 41 42 4f 52 54 5f   F2FS_IOC_ABORT_
1eef0 56 4f 4c 41 54 49 4c 45 5f 57 52 49 54 45 29 3b  VOLATILE_WRITE);
1ef00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ef10 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   ? SQLITE_IOERR_
1ef20 52 4f 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49 43 20  ROLLBACK_ATOMIC 
1ef30 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  : SQLITE_OK;.   
1ef40 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c   }.#endif /* __l
1ef50 69 6e 75 78 5f 5f 20 26 26 20 53 51 4c 49 54 45  inux__ && SQLITE
1ef60 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
1ef70 4f 4d 49 43 5f 57 52 49 54 45 20 2a 2f 0a 0a 20  OMIC_WRITE */.. 
1ef80 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1ef90 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
1efa0 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1efb0 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69  Arg = pFile->eFi
1efc0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65  leLock;.      re
1efd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1efe0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1eff0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54  QLITE_FCNTL_LAST
1f000 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
1f010 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
1f020 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
1f030 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f040 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1f050 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1f060 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20  NTL_CHUNK_SIZE: 
1f070 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1f080 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a  zChunk = *(int *
1f090 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74  )pArg;.      ret
1f0a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f0b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1f0c0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1f0d0 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  HINT: {.      in
1f0e0 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75  t rc;.      Simu
1f0f0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1f100 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  n(1);.      rc =
1f110 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70   fcntlSizeHint(p
1f120 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41  File, *(i64 *)pA
1f130 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  rg);.      Simul
1f140 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1f150 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (0);.      retur
1f160 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1f170 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f180 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b  L_PERSIST_WAL: {
1f190 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42  .      unixModeB
1f1a0 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49  it(pFile, UNIXFI
1f1b0 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  LE_PERSIST_WAL, 
1f1c0 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
1f1d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f1e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1f1f0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1f200 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1f210 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  RITE: {.      un
1f220 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c  ixModeBit(pFile,
1f230 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20   UNIXFILE_PSOW, 
1f240 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
1f250 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f260 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1f270 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1f280 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  _VFSNAME: {.    
1f290 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
1f2a0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1f2b0 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70  f("%s", pFile->p
1f2c0 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Vfs->zName);.   
1f2d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f2e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1f2f0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1f300 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b  _TEMPFILENAME: {
1f310 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46  .      char *zTF
1f320 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
1f330 6c 6c 6f 63 36 34 28 20 70 46 69 6c 65 2d 3e 70  lloc64( pFile->p
1f340 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
1f350 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46  );.      if( zTF
1f360 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ile ){.        u
1f370 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  nixGetTempname(p
1f380 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  File->pVfs->mxPa
1f390 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b  thname, zTFile);
1f3a0 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a  .        *(char*
1f3b0 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b  *)pArg = zTFile;
1f3c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1f3d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f3e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f3f0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53  SQLITE_FCNTL_HAS
1f400 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20 20  _MOVED: {.      
1f410 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 66 69  *(int*)pArg = fi
1f420 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65  leHasMoved(pFile
1f430 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1f450 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1f460 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20  MMAP_SIZE>0.    
1f470 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f480 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20  L_MMAP_SIZE: {. 
1f490 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69       i64 newLimi
1f4a0 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b  t = *(i64*)pArg;
1f4b0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1f4c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1f4d0 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71   if( newLimit>sq
1f4e0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1f4f0 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20  g.mxMmap ){.    
1f500 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73      newLimit = s
1f510 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1f520 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20  ig.mxMmap;.     
1f530 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   }..      /* The
1f540 20 76 61 6c 75 65 20 6f 66 20 6e 65 77 4c 69 6d   value of newLim
1f550 69 74 20 6d 61 79 20 62 65 20 65 76 65 6e 74 75  it may be eventu
1f560 61 6c 6c 79 20 63 61 73 74 20 74 6f 20 28 73 69  ally cast to (si
1f570 7a 65 5f 74 29 20 61 6e 64 20 70 61 73 73 65 64  ze_t) and passed
1f580 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 6d 61  .      ** to mma
1f590 70 28 29 2e 20 52 65 73 74 72 69 63 74 20 69 74  p(). Restrict it
1f5a0 73 20 76 61 6c 75 65 20 74 6f 20 32 47 42 20 69  s value to 2GB i
1f5b0 66 20 28 73 69 7a 65 5f 74 29 20 69 73 20 6e 6f  f (size_t) is no
1f5c0 74 20 61 74 20 6c 65 61 73 74 20 61 0a 20 20 20  t at least a.   
1f5d0 20 20 20 2a 2a 20 36 34 2d 62 69 74 20 74 79 70     ** 64-bit typ
1f5e0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
1f5f0 6e 65 77 4c 69 6d 69 74 3e 30 20 26 26 20 73 69  newLimit>0 && si
1f600 7a 65 6f 66 28 73 69 7a 65 5f 74 29 3c 38 20 29  zeof(size_t)<8 )
1f610 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d  {.        newLim
1f620 69 74 20 3d 20 28 6e 65 77 4c 69 6d 69 74 20 26  it = (newLimit &
1f630 20 30 78 37 46 46 46 46 46 46 46 29 3b 0a 20 20   0x7FFFFFFF);.  
1f640 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2a 28 69      }..      *(i
1f650 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  64*)pArg = pFile
1f660 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20  ->mmapSizeMax;. 
1f670 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69       if( newLimi
1f680 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74  t>=0 && newLimit
1f690 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  !=pFile->mmapSiz
1f6a0 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e  eMax && pFile->n
1f6b0 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20  FetchOut==0 ){. 
1f6c0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d         pFile->mm
1f6d0 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c  apSizeMax = newL
1f6e0 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66  imit;.        if
1f6f0 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  ( pFile->mmapSiz
1f700 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
1f710 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70   unixUnmapfile(p
1f720 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
1f730 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
1f740 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20  e(pFile, -1);.  
1f750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f760 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f770 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
1f780 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1f790 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  G.    /* The pag
1f7a0 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65  er calls this me
1f7b0 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74  thod to signal t
1f7c0 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a  hat it has done.
1f7d0 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
1f7e0 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  k and that the d
1f7f0 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65  atabase is there
1f800 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61  fore unchanged a
1f810 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e  nd.    ** it hen
1f820 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  ce it is OK for 
1f830 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1f840 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74  change counter t
1f850 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68  o be.    ** unch
1f860 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  anged..    */.  
1f870 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1f880 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1f890 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78  : {.      ((unix
1f8a0 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64  File*)id)->dbUpd
1f8b0 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ate = 0;.      r
1f8c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f8d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
1f8e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f8f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1f900 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1f910 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  __).    case SQL
1f920 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f  ITE_FCNTL_SET_LO
1f930 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20  CKPROXYFILE:.   
1f940 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1f950 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_GET_LOCKPROXY
1f960 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65  FILE: {.      re
1f970 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f  turn proxyFileCo
1f980 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67  ntrol(id,op,pArg
1f990 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  );.    }.#endif 
1f9a0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
1f9b0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1f9c0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1f9d0 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  E__) */.  }.  re
1f9e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
1f9f0 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  OUND;.}../*.** I
1fa00 66 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a  f pFd->sectorSiz
1fa10 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68  e is non-zero wh
1fa20 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1fa30 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
1fa40 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74  s a.** no-op. Ot
1fa50 68 65 72 77 69 73 65 2c 20 74 68 65 20 76 61 6c  herwise, the val
1fa60 75 65 73 20 6f 66 20 70 46 64 2d 3e 73 65 63 74  ues of pFd->sect
1fa70 6f 72 53 69 7a 65 20 61 6e 64 20 0a 2a 2a 20 70  orSize and .** p
1fa80 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  Fd->deviceCharac
1fa90 74 65 72 69 73 74 69 63 73 20 61 72 65 20 73 65  teristics are se
1faa0 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  t according to t
1fab0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a  he file-system .
1fac0 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ** characteristi
1fad0 63 73 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  cs. .**.** There
1fae0 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
1faf0 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
1fb00 6f 6e 2e 20 4f 6e 65 20 66 6f 72 20 51 4e 58 20  on. One for QNX 
1fb10 61 6e 64 20 6f 6e 65 20 66 6f 72 20 61 6c 6c 0a  and one for all.
1fb20 2a 2a 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73  ** other systems
1fb30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51  ..*/.#ifndef __Q
1fb40 4e 58 4e 54 4f 5f 5f 0a 73 74 61 74 69 63 20 76  NXNTO__.static v
1fb50 6f 69 64 20 73 65 74 44 65 76 69 63 65 43 68 61  oid setDeviceCha
1fb60 72 61 63 74 65 72 69 73 74 69 63 73 28 75 6e 69  racteristics(uni
1fb70 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61  xFile *pFd){.  a
1fb80 73 73 65 72 74 28 20 70 46 64 2d 3e 64 65 76 69  ssert( pFd->devi
1fb90 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1fba0 73 3d 3d 30 20 7c 7c 20 70 46 64 2d 3e 73 65 63  s==0 || pFd->sec
1fbb0 74 6f 72 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20  torSize!=0 );.  
1fbc0 69 66 28 20 70 46 64 2d 3e 73 65 63 74 6f 72 53  if( pFd->sectorS
1fbd0 69 7a 65 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65  ize==0 ){.#if de
1fbe0 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
1fbf0 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
1fc00 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f  TE_ENABLE_BATCH_
1fc10 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20  ATOMIC_WRITE).  
1fc20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 75    int res;.    u
1fc30 33 32 20 66 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  32 f = 0;..    /
1fc40 2a 20 43 68 65 63 6b 20 66 6f 72 20 73 75 70 70  * Check for supp
1fc50 6f 72 74 20 66 6f 72 20 46 32 46 53 20 61 74 6f  ort for F2FS ato
1fc60 6d 69 63 20 62 61 74 63 68 20 77 72 69 74 65 73  mic batch writes
1fc70 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 6f  . */.    res = o
1fc80 73 49 6f 63 74 6c 28 70 46 64 2d 3e 68 2c 20 46  sIoctl(pFd->h, F
1fc90 32 46 53 5f 49 4f 43 5f 47 45 54 5f 46 45 41 54  2FS_IOC_GET_FEAT
1fca0 55 52 45 53 2c 20 26 66 29 3b 0a 20 20 20 20 69  URES, &f);.    i
1fcb0 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 66 20  f( res==0 && (f 
1fcc0 26 20 46 32 46 53 5f 46 45 41 54 55 52 45 5f 41  & F2FS_FEATURE_A
1fcd0 54 4f 4d 49 43 5f 57 52 49 54 45 29 20 29 7b 0a  TOMIC_WRITE) ){.
1fce0 20 20 20 20 20 20 70 46 64 2d 3e 64 65 76 69 63        pFd->devic
1fcf0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1fd00 20 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   = SQLITE_IOCAP_
1fd10 42 41 54 43 48 5f 41 54 4f 4d 49 43 3b 0a 20 20  BATCH_ATOMIC;.  
1fd20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f    }.#endif /* __
1fd30 6c 69 6e 75 78 5f 5f 20 26 26 20 53 51 4c 49 54  linux__ && SQLIT
1fd40 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41  E_ENABLE_BATCH_A
1fd50 54 4f 4d 49 43 5f 57 52 49 54 45 20 2a 2f 0a 0a  TOMIC_WRITE */..
1fd60 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 50      /* Set the P
1fd70 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1fd80 54 45 20 66 6c 61 67 20 69 66 20 72 65 71 75 65  TE flag if reque
1fd90 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sted. */.    if(
1fda0 20 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20   pFd->ctrlFlags 
1fdb0 26 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20  & UNIXFILE_PSOW 
1fdc0 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 64 65  ){.      pFd->de
1fdd0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1fde0 69 63 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f  ics |= SQLITE_IO
1fdf0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1fe00 45 52 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 0a  ERWRITE;.    }..
1fe10 20 20 20 20 70 46 64 2d 3e 73 65 63 74 6f 72 53      pFd->sectorS
1fe20 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
1fe30 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1fe40 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 69  ;.  }.}.#else.#i
1fe50 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d 64  nclude <sys/dcmd
1fe60 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  _blk.h>.#include
1fe70 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68 3e   <sys/statvfs.h>
1fe80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1fe90 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1fea0 73 74 69 63 73 28 75 6e 69 78 46 69 6c 65 20 2a  stics(unixFile *
1feb0 70 46 69 6c 65 29 7b 0a 20 20 69 66 28 20 70 46  pFile){.  if( pF
1fec0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1fed0 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 74 72 75  == 0 ){.    stru
1fee0 63 74 20 73 74 61 74 76 66 73 20 66 73 49 6e 66  ct statvfs fsInf
1fef0 6f 3b 0a 20 20 20 20 20 20 20 0a 20 20 20 20 2f  o;.       .    /
1ff00 2a 20 53 65 74 20 64 65 66 61 75 6c 74 73 20 66  * Set defaults f
1ff10 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64  or non-supported
1ff20 20 66 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a   filesystems */.
1ff30 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1ff40 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  rSize = SQLITE_D
1ff50 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
1ff60 5a 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64  ZE;.    pFile->d
1ff70 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1ff80 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  tics = 0;.    if
1ff90 28 20 66 73 74 61 74 76 66 73 28 70 46 69 6c 65  ( fstatvfs(pFile
1ffa0 2d 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ->h, &fsInfo) ==
1ffb0 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 72 65   -1 ) {.      re
1ffc0 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74  turn pFile->sect
1ffd0 6f 72 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20  orSize;.    }.. 
1ffe0 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 66     if( !strcmp(f
1fff0 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
20000 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a 20 20 20  , "tmp") ) {.   
20010 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
20020 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
20030 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
20040 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
20050 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
20060 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
20070 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20  _ATOMIC4K |     
20080 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c    /* All ram fil
20090 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20 61  esystem writes a
200a0 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20  re atomic */.   
200b0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
200c0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20  P_SAFE_APPEND | 
200d0 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68     /* growing th
200e0 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
200f0 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20  occur until.    
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20120 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73    ** the write s
20130 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20  ucceeds */.     
20140 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
20150 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
20160 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
20170 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
20180 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201b0 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
201c0 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
201d0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
201e0 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
201f0 5f 62 61 73 65 74 79 70 65 2c 20 22 65 74 66 73  _basetype, "etfs
20200 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
20210 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
20220 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
20230 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
20240 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
20250 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20  cs =.        /* 
20260 65 74 66 73 20 63 6c 75 73 74 65 72 20 73 69 7a  etfs cluster siz
20270 65 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  e writes are ato
20280 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  mic */.        (
20290 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
202a0 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
202b0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
202c0 29 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  ) |.        SQLI
202d0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
202e0 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
202f0 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
20300 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
20310 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20330 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
20340 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
20350 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
20360 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
20370 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
20380 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
20390 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
203a0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
203b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203c0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
203d0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
203e0 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
203f0 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
20400 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
20410 65 2c 20 22 71 6e 78 36 22 29 20 29 7b 0a 20 20  e, "qnx6") ){.  
20420 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
20430 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
20440 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
20450 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
20460 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
20470 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
20480 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20 20 20 20  P_ATOMIC |      
20490 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79     /* All filesy
204a0 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20  stem writes are 
204b0 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
204c0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
204d0 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
204e0 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
204f0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
20500 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
20510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
20530 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
20540 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
20550 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
20560 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
20570 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
20580 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
20590 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
205c0 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
205d0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
205e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73      }else if( !s
205f0 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62  trcmp(fsInfo.f_b
20600 61 73 65 74 79 70 65 2c 20 22 71 6e 78 34 22 29  asetype, "qnx4")
20610 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
20620 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
20630 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
20640 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
20650 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
20660 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75   =.        /* fu
20670 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f  ll bitset of ato
20680 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65  mics from max se
20690 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d  ctor size and sm
206a0 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  aller */.       
206b0 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72   ((pFile->sector
206c0 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c  Size / 512 * SQL
206d0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
206e0 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c  512) << 1) - 2 |
206f0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
20700 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
20710 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
20720 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
20730 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
20740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20760 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
20770 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
20780 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
20790 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66 73  se if( strstr(fs
207a0 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
207b0 20 22 64 6f 73 22 29 20 29 7b 0a 20 20 20 20 20   "dos") ){.     
207c0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
207d0 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
207e0 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
207f0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
20800 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
20810 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74    /* full bitset
20820 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d   of atomics from
20830 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65   max sector size
20840 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a   and smaller */.
20850 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d          ((pFile-
20860 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
20870 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
20880 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31  _ATOMIC512) << 1
20890 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20  ) - 2 |.        
208a0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
208b0 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
208c0 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
208d0 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
208e0 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
208f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
20910 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
20920 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
20930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20940 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
20950 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
20960 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
20970 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c  OCAP_ATOMIC512 |
20980 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20        /* blocks 
20990 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
209a0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
209b0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
209c0 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
209d0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
209e0 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
209f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a10 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
20a20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
20a30 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d      0;.    }.  }
20a40 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63  .  /* Last chanc
20a50 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 2e 20  e verification. 
20a60 20 49 66 20 74 68 65 20 73 65 63 74 6f 72 20 73   If the sector s
20a70 69 7a 65 20 69 73 6e 27 74 20 61 20 6d 75 6c 74  ize isn't a mult
20a80 69 70 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a  iple of 512.  **
20a90 20 74 68 65 6e 20 69 74 20 69 73 6e 27 74 20 76   then it isn't v
20aa0 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46  alid.*/.  if( pF
20ab0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
20ac0 25 20 35 31 32 20 21 3d 20 30 20 29 7b 0a 20 20  % 512 != 0 ){.  
20ad0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
20ae0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
20af0 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73   0;.    pFile->s
20b00 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49  ectorSize = SQLI
20b10 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
20b20 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 23 65  R_SIZE;.  }.}.#e
20b30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
20b40 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
20b50 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
20b60 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
20b70 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
20b80 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
20b90 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
20ba0 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
20bb0 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
20bc0 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
20bd0 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
20be0 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
20bf0 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
20c00 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
20c10 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
20c20 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
20c30 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
20c40 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
20c50 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
20c60 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
20c70 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
20c80 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
20c90 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
20ca0 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
20cb0 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
20cc0 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
20cd0 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
20ce0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
20cf0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
20d00 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
20d10 69 64 3b 0a 20 20 73 65 74 44 65 76 69 63 65 43  id;.  setDeviceC
20d20 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
20d30 46 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  Fd);.  return pF
20d40 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d  d->sectorSize;.}
20d50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
20d60 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
20d70 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68  teristics for th
20d80 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
20d90 69 73 20 56 46 53 20 69 73 20 73 65 74 20 75 70  is VFS is set up
20da0 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
20db0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
20dc0 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79 20 64  E_OVERWRITE by d
20dd0 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76  efault..** Howev
20de0 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20  er, that choice 
20df0 69 73 20 63 6f 6e 74 72 6f 76 65 72 73 69 61 6c  is controversial
20e00 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c   since technical
20e10 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ly the underlyin
20e20 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d  g.** file system
20e30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 73   does not always
20e40 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72 73 61   provide powersa
20e50 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e 20 20  fe overwrites.  
20e60 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72  (In other.** wor
20e70 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f 77 65  ds, after a powe
20e80 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70 61  r-loss event, pa
20e90 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c 65 20  rts of the file 
20ea0 74 68 61 74 20 77 65 72 65 20 6e 65 76 65 72 0a  that were never.
20eb0 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  ** written might
20ec0 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 61 6c   end up being al
20ed0 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76 65 72  tered.)  However
20ee0 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76  , non-PSOW behav
20ef0 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20  ior is very,.** 
20f00 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e 64 20  very rare.  And 
20f10 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57 20 6d  asserting PSOW m
20f20 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72 65 64  akes a large red
20f30 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d  uction in the am
20f40 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69  ount.** of requi
20f50 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72  red I/O for jour
20f60 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61 20  naling, since a 
20f70 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67 20 69  lot of padding i
20f80 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a  s eliminated..**
20f90 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65 20 50    Hence, while P
20fa0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
20fb0 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61  TE is on by defa
20fc0 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20 61 20  ult, there is a 
20fd0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20  file-control.** 
20fe0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72  available to tur
20ff0 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55 52 49  n it off and URI
21000 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
21010 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75   available to tu
21020 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74  rn it off..*/.st
21030 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76  atic int unixDev
21040 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
21050 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
21060 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
21070 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c   *pFd = (unixFil
21080 65 2a 29 69 64 3b 0a 20 20 73 65 74 44 65 76 69  e*)id;.  setDevi
21090 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
210a0 73 28 70 46 64 29 3b 0a 20 20 72 65 74 75 72 6e  s(pFd);.  return
210b0 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72   pFd->deviceChar
210c0 61 63 74 65 72 69 73 74 69 63 73 3b 0a 7d 0a 0a  acteristics;.}..
210d0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
210e0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
210f0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
21100 5f 53 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52  _SIZE>0../*.** R
21110 65 74 75 72 6e 20 74 68 65 20 73 79 73 74 65 6d  eturn the system
21120 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
21130 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
21140 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61  should not be ca
21150 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20 62 79  lled directly by
21160 20 6f 74 68 65 72 20 63 6f 64 65 20 69 6e 20 74   other code in t
21170 68 69 73 20 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e  his file. .** In
21180 73 74 65 61 64 2c 20 69 74 20 73 68 6f 75 6c 64  stead, it should
21190 20 62 65 20 63 61 6c 6c 65 64 20 76 69 61 20 6d   be called via m
211a0 61 63 72 6f 20 6f 73 47 65 74 70 61 67 65 73 69  acro osGetpagesi
211b0 7a 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ze()..*/.static 
211c0 69 6e 74 20 75 6e 69 78 47 65 74 70 61 67 65 73  int unixGetpages
211d0 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69 66 20 4f  ize(void){.#if O
211e0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75  S_VXWORKS.  retu
211f0 72 6e 20 31 30 32 34 3b 0a 23 65 6c 69 66 20 64  rn 1024;.#elif d
21200 65 66 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52  efined(_BSD_SOUR
21210 43 45 29 0a 20 20 72 65 74 75 72 6e 20 67 65 74  CE).  return get
21220 70 61 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73  pagesize();.#els
21230 65 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  e.  return (int)
21240 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45  sysconf(_SC_PAGE
21250 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  SIZE);.#endif.}.
21260 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
21270 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
21280 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
21290 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
212a0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
212b0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a  E_OMIT_WAL../*.*
212c0 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
212d0 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68   represent an sh
212e0 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  ared memory buff
212f0 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  er.  .**.** When
21300 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
21310 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
21320 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64  the same wal-ind
21330 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a  ex, each thread.
21340 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75  ** has its own u
21350 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62  nixShm object, b
21360 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e  ut they all poin
21370 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
21380 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69  stance.** of thi
21390 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
213a0 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
213b0 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d  words, each wal-
213c0 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a  index is opened.
213d0 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ** only once per
213e0 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
213f0 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Each unixShmNode
21400 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65   object is conne
21410 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  cted to a single
21420 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
21430 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75  bject..** We cou
21440 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73  ld coalesce this
21450 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69   object into uni
21460 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20  xInodeInfo, but 
21470 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a  that would mean.
21480 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69  ** every open fi
21490 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
214a0 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   use shared memo
214b0 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ry (in other wor
214c0 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e  ds, most.** open
214d0 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61   files) would ha
214e0 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75  ve to carry arou
214f0 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e  nd this extra in
21500 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a  formation.  So.*
21510 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * the unixInodeI
21520 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  nfo object conta
21530 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
21540 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
21550 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20  e object.** and 
21560 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
21570 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
21580 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64  d only when need
21590 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ed..**.** unixMu
215a0 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
215b0 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
215c0 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
215d0 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
215e0 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
215f0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
21600 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
21610 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
21620 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  Ref.**.** The fo
21630 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
21640 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
21650 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
21660 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
21670 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
21680 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
21690 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d  * Either unixShm
216a0 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
216b0 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53  be held or unixS
216c0 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
216d0 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  nd.** unixMutexH
216e0 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
216f0 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
21700 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
21710 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
21720 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
21730 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
21740 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e {.  unixInodeI
21750 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
21760 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66   /* unixInodeInf
21770 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  o that owns this
21780 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73   SHM node */.  s
21790 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
217a0 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
217b0 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
217c0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
217d0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
217e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
217f0 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20   of the mmapped 
21800 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  file */.  int h;
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21820 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
21830 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
21840 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21860 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
21870 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
21880 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20  .  u16 nRegion; 
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
218a0 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
218b0 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  pRegion */.  u8 
218c0 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20  isReadonly;     
218d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
218e0 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  if read-only */.
218f0 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f    char **apRegio
21900 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
21910 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20  Array of mapped 
21920 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
21930 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  gions */.  int n
21940 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
21950 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21960 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  of unixShm objec
21970 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
21980 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  his */.  unixShm
21990 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
219a0 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53      /* All unixS
219b0 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
219c0 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23  ing to this */.#
219d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
219e0 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b  UG.  u8 exclMask
219f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21a00 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
21a10 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
21a20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61  */.  u8 sharedMa
21a30 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
21a40 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
21a50 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
21a60 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21a80 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75  Next available u
21a90 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  nixShm.id value 
21aa0 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
21ab0 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
21ac0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
21ad0 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
21ae0 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
21af0 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
21b00 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
21b10 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
21b20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
21b30 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
21b40 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
21b50 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
21b60 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
21b70 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
21b80 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70  .**    unixShm.p
21b90 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53  File.**    unixS
21ba0 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  hm.id.**.** All 
21bb0 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
21bc0 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68   read/write.  Th
21bd0 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d  e unixShm.pFile-
21be0 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
21bf0 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
21c00 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
21c10 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
21c20 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20  .struct unixShm 
21c30 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
21c40 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f  *pShmNode;     /
21c50 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
21c60 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
21c70 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ect */.  unixShm
21c80 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
21c90 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78      /* Next unix
21ca0 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
21cb0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  e unixShmNode */
21cc0 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21ce0 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
21cf0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
21d00 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69   mutex */.  u8 i
21d10 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
21d20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
21d30 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
21d40 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53  within its unixS
21d50 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  hmNode */.  u16 
21d60 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
21d70 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
21d80 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
21d90 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
21da0 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
21db0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
21dc0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
21dd0 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  eld */.};../*.**
21de0 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
21df0 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
21e00 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
21e10 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
21e20 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
21e30 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73           /* firs
21e40 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23  t lock byte */.#
21e50 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
21e60 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d  DMS    (UNIX_SHM
21e70 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
21e80 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
21e90 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
21ea0 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78  *.** Apply posix
21eb0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
21ec0 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72  for all bytes fr
21ed0 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20  om ofst through 
21ee0 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20  ofst+n-1..**.** 
21ef0 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74  Locks block if t
21f00 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74  he mask is exact
21f10 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e  ly UNIX_SHM_C an
21f20 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69  d are non-blocki
21f30 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  ng.** otherwise.
21f40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
21f50 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
21f60 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
21f70 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 4f 70  ile,       /* Op
21f80 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  en connection to
21f90 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f   the WAL file */
21fa0 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c  .  int lockType,
21fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55            /* F_U
21fc0 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f  NLCK, F_RDLCK, o
21fd0 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69  r F_WRLCK */.  i
21fe0 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
21ff0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
22000 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69  yte of the locki
22010 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e  ng range */.  in
22020 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  t n             
22030 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22040 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
22050 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e  */.){.  unixShmN
22060 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f  ode *pShmNode; /
22070 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
22080 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
22090 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
220a0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f   */.  struct flo
220b0 63 6b 20 66 3b 20 20 20 20 20 20 20 20 2f 2a 20  ck f;        /* 
220c0 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  The posix adviso
220d0 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ry locking struc
220e0 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ture */.  int rc
220f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
22100 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
22110 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a  form fcntl() */.
22120 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20  .  /* Access to 
22130 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
22140 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
22150 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
22160 65 72 20 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64 65  er */.  pShmNode
22170 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
22180 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73  ->pShmNode;.  as
22190 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
221a0 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64  tex_held(pShmNod
221b0 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68  e->mutex) || pSh
221c0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
221d0 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c  ;..  /* Shared l
221e0 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20  ocks never span 
221f0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79  more than one by
22200 74 65 20 2a 2f 0a 20 20 2f 2a 20 61 73 73 65 72  te */.  /* asser
22210 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54  t( n==1 || lockT
22220 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 20  ype!=F_RDLCK ); 
22230 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61  */..  /* Locks a
22240 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20  re within range 
22250 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  */.  assert( n>=
22260 31 20 26 26 20 6e 3c 3d 53 51 4c 49 54 45 5f 53  1 && n<=SQLITE_S
22270 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69  HM_NLOCK );..  i
22280 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
22290 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  0 ){.    /* Init
222a0 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
222b0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
222c0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20  .    memset(&f, 
222d0 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20  0, sizeof(f));. 
222e0 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f     f.l_type = lo
222f0 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f  ckType;.    f.l_
22300 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
22310 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74  T;.    f.l_start
22320 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c   = ofst;.    f.l
22330 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72  _len = n;..    r
22340 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d  c = osFcntl(pShm
22350 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  Node->h, F_SETLK
22360 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20 3d 20  , &f);.    rc = 
22370 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c  (rc!=(-1)) ? SQL
22380 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
22390 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BUSY;.  }..  /* 
223a0 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61  Update the globa
223b0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64  l lock state and
223c0 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e   do debug tracin
223d0 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  g */.#ifdef SQLI
223e0 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36  TE_DEBUG.  { u16
223f0 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45   mask;.  OSTRACE
22400 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b  (("SHM-LOCK "));
22410 0a 20 20 6d 61 73 6b 20 3d 20 6f 66 73 74 3e 33  .  mask = ofst>3
22420 31 20 3f 20 30 78 66 66 66 66 20 3a 20 28 31 3c  1 ? 0xffff : (1<
22430 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
22440 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63  <ofst);.  if( rc
22450 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22460 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
22470 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
22480 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
22490 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
224a0 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
224b0 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  e->exclMask &= ~
224c0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
224d0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
224e0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
224f0 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
22500 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
22510 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
22520 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  ad-lock %d ok", 
22530 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
22540 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
22550 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
22560 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
22570 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
22580 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22590 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
225a0 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
225b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
225c0 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  te-lock %d ok", 
225d0 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
225e0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
225f0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
22600 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
22610 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
22620 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
22630 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
22640 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
22650 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
22660 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66  k %d failed", of
22670 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  st));.    }else 
22680 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
22690 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
226a0 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
226b0 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  ck failed"));.  
226c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
226d0 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
226e0 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
226f0 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
22700 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  e-lock %d failed
22710 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
22720 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
22730 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25  " - afterwards %
22740 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
22750 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
22760 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53  ->sharedMask, pS
22770 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
22780 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ));.  }.#endif..
22790 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20    return rc;    
227a0 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65      .}../*.** Re
227b0 74 75 72 6e 20 74 68 65 20 6d 69 6e 69 6d 75 6d  turn the minimum
227c0 20 6e 75 6d 62 65 72 20 6f 66 20 33 32 4b 42 20   number of 32KB 
227d0 73 68 6d 20 72 65 67 69 6f 6e 73 20 74 68 61 74  shm regions that
227e0 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 70 70 65   should be mappe
227f0 64 20 61 74 0a 2a 2a 20 61 20 74 69 6d 65 2c 20  d at.** a time, 
22800 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 65 61  assuming that ea
22810 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20  ch mapping must 
22820 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  be an integer mu
22830 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 0a 2a 2a  ltiple of the.**
22840 20 63 75 72 72 65 6e 74 20 73 79 73 74 65 6d 20   current system 
22850 70 61 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page-size..**.**
22860 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69   Usually, this i
22870 73 20 31 2e 20 54 68 65 20 65 78 63 65 70 74 69  s 1. The excepti
22880 6f 6e 20 73 65 65 6d 73 20 74 6f 20 62 65 20 73  on seems to be s
22890 79 73 74 65 6d 73 20 74 68 61 74 20 61 72 65 20  ystems that are 
228a0 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f  configured.** to
228b0 20 75 73 65 20 36 34 4b 42 20 70 61 67 65 73 20   use 64KB pages 
228c0 2d 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 65  - in this case e
228d0 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74  ach mapping must
228e0 20 63 6f 76 65 72 20 61 74 20 6c 65 61 73 74 20   cover at least 
228f0 74 77 6f 0a 2a 2a 20 73 68 6d 20 72 65 67 69 6f  two.** shm regio
22900 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
22910 74 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50  t unixShmRegionP
22920 65 72 4d 61 70 28 76 6f 69 64 29 7b 0a 20 20 69  erMap(void){.  i
22930 6e 74 20 73 68 6d 73 7a 20 3d 20 33 32 2a 31 30  nt shmsz = 32*10
22940 32 34 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  24;            /
22950 2a 20 53 48 4d 20 72 65 67 69 6f 6e 20 73 69 7a  * SHM region siz
22960 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
22970 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28  = osGetpagesize(
22980 29 3b 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 70  );   /* System p
22990 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73  age size */.  as
229a0 73 65 72 74 28 20 28 28 70 67 73 7a 2d 31 29 26  sert( ((pgsz-1)&
229b0 70 67 73 7a 29 3d 3d 30 20 29 3b 20 20 20 2f 2a  pgsz)==0 );   /*
229c0 20 50 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   Page size must 
229d0 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
229e0 2a 2f 0a 20 20 69 66 28 20 70 67 73 7a 3c 73 68  */.  if( pgsz<sh
229f0 6d 73 7a 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  msz ) return 1;.
22a00 20 20 72 65 74 75 72 6e 20 70 67 73 7a 2f 73 68    return pgsz/sh
22a10 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75  msz;.}../*.** Pu
22a20 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  rge the unixShmN
22a30 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
22a40 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
22a50 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
22a60 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
22a70 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
22a80 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
22a90 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
22aa0 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
22ab0 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
22ac0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
22ad0 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
22ae0 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65  oid unixShmPurge
22af0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
22b00 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
22b10 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d  p = pFd->pInode-
22b20 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
22b30 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
22b40 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20  ld() );.  if( p 
22b50 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 52 65  && ALWAYS(p->nRe
22b60 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 6e 74  f==0) ){.    int
22b70 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e   nShmPerMap = un
22b80 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61  ixShmRegionPerMa
22b90 70 28 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p();.    int i;.
22ba0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
22bb0 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f  Inode==pFd->pIno
22bc0 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  de );.    sqlite
22bd0 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
22be0 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28  mutex);.    for(
22bf0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f  i=0; i<p->nRegio
22c00 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61 70  n; i+=nShmPerMap
22c10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
22c20 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
22c30 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65  osMunmap(p->apRe
22c40 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65  gion[i], p->szRe
22c50 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gion);.      }el
22c60 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
22c70 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
22c80 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20  gion[i]);.      
22c90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
22ca0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
22cb0 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  gion);.    if( p
22cc0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
22cd0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64  robust_close(pFd
22ce0 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  , p->h, __LINE__
22cf0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20  );.      p->h = 
22d00 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  -1;.    }.    p-
22d10 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
22d20 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
22d30 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
22d40 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
22d50 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
22d60 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ea associated wi
22d70 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  th open database
22d80 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a   file pDbFd.  .*
22d90 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
22da0 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
22db0 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69   uses mmapped fi
22dc0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  les..**.** The f
22dd0 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  ile used to impl
22de0 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d  ement shared-mem
22df0 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73 61  ory is in the sa
22e00 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  me directory.** 
22e10 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
22e20 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61  base file and ha
22e30 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
22e40 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
22e50 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74  base.** file wit
22e60 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66  h the "-shm" suf
22e70 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20  fix added.  For 
22e80 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
22e90 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
22ea0 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31   is "/home/user1
22eb0 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e  /config.db" then
22ec0 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 69   the file that i
22ed0 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d  s created and mm
22ee0 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61  apped.** for sha
22ef0 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
22f00 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65  be called "/home
22f10 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
22f20 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  -shm".  .**.** A
22f30 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68 20  nother approach 
22f40 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c  to is to use fil
22f50 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f  es in /dev/shm o
22f60 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e  r /dev/tmp or an
22f70 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74  .** some other t
22f80 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20  mpfs mount. But 
22f90 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64  if a file in a d
22fa0 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f  ifferent directo
22fb0 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  ry.** from the d
22fc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
22fd0 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65  used, then diffe
22fe0 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d  ring access perm
22ff0 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20  issions.** or a 
23000 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63  chroot() might c
23010 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72 65  ause two differe
23020 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20  nt processes on 
23030 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61  the same.** data
23040 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75  base to end up u
23050 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66  sing different f
23060 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64 20  iles for shared 
23070 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61  memory - .** mea
23080 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72 20  ning that their 
23090 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74  memory would not
230a0 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65   really be share
230b0 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  d - resulting.**
230c0 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72   in database cor
230d0 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74  ruption.  Nevert
230e0 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70  heless, this tmp
230f0 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a  fs file usage.**
23100 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20   can be enabled 
23110 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
23120 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53  using -DSQLITE_S
23130 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64  HM_DIRECTORY="/d
23140 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68  ev/shm".** or th
23150 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54  e equivalent.  T
23160 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53 51  he use of the SQ
23170 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
23180 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  RY compile-time.
23190 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74  ** option result
231a0 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  s in an incompat
231b0 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51  ible build of SQ
231c0 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66  Lite;  builds of
231d0 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20   SQLite.** that 
231e0 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20 53  with differing S
231f0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
23200 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74 74  ORY settings att
23210 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a  empt to use the.
23220 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  ** same database
23230 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
23240 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65  e time, database
23250 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c   corruption will
23260 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
23270 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48  t. The SQLITE_SH
23280 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
23290 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
232a0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a  is considered.**
232b0 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61   "unsupported" a
232c0 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69  nd may go away i
232d0 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69 74  n a future SQLit
232e0 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a  e release..**.**
232f0 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
23300 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
23310 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
23320 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
23330 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
23340 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
23350 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
23360 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
23370 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
23380 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
23390 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
233a0 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
233b0 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
233c0 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eared..**.** If 
233d0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
233e0 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62 46  abase file (pDbF
233f0 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65 20  d) is using the 
23400 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a  "unix-excl" VFS.
23410 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  ** that means th
23420 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  at an exclusive 
23430 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20  lock is held on 
23440 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23450 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f  e and.** that no
23460 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
23470 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61   are able to rea
23480 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 64  d or write the d
23490 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20  atabase.  In.** 
234a0 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f  that case, we do
234b0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64   not really need
234c0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
234d0 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   No shared memor
234e0 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65  y.** file is cre
234f0 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72 65  ated.  The share
23500 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
23510 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20   simulated with 
23520 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  heap memory..*/.
23530 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
23540 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
23550 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29  unixFile *pDbFd)
23560 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  {.  struct unixS
23570 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  hm *p = 0;      
23580 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
23590 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e  ction to be open
235a0 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ed */.  struct u
235b0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
235c0 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75  Node;   /* The u
235d0 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
235e0 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
235f0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
23600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
23610 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
23620 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
23630 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  Inode;          
23640 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20  /* The inode of 
23650 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  fd */.  char *zS
23660 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  hmFilename;     
23670 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
23680 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65 64  of the file used
23690 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e   for SHM */.  in
236a0 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20  t nShmFilename; 
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
236c0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d   Size of the SHM
236d0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74   filename in byt
236e0 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  es */..  /* Allo
236f0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
23700 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f  he new unixShm o
23710 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20  bject. */.  p = 
23720 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
23730 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
23740 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
23750 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
23760 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 73 65 74 28  _BKPT;.  memset(
23770 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
23780 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
23790 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a  Fd->pShm==0 );..
237a0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
237b0 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f  e if a unixShmNo
237c0 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64  de object alread
237d0 79 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20  y exists. Reuse 
237e0 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a  an existing.  **
237f0 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e   one if present.
23800 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
23810 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
23820 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
23830 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
23840 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64  e = pDbFd->pInod
23850 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  e;.  pShmNode = 
23860 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
23870 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
23880 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
23890 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
238b0 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f   fstat() info fo
238c0 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
238d0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
238e0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
238f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
23900 7a 42 61 73 65 50 61 74 68 20 3d 20 70 44 62 46  zBasePath = pDbF
23910 64 2d 3e 7a 50 61 74 68 3b 0a 23 65 6e 64 69 66  d->zPath;.#endif
23920 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73  ..    /* Call fs
23930 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20  tat() to figure 
23940 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69  out the permissi
23950 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ons on the datab
23960 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20  ase file. If.   
23970 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20   ** a new *-shm 
23980 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
23990 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c   an attempt will
239a0 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61   be made to crea
239b0 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74  te it.    ** wit
239c0 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69  h the same permi
239d0 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20  ssions..    */. 
239e0 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
239f0 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29  DbFd->h, &sStat)
23a00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
23a10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
23a20 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  T;.      goto sh
23a30 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
23a40 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
23a50 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20  _SHM_DIRECTORY. 
23a60 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
23a70 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f  = sizeof(SQLITE_
23a80 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b  SHM_DIRECTORY) +
23a90 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e   31;.#else.    n
23aa0 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20  ShmFilename = 6 
23ab0 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42  + (int)strlen(zB
23ac0 61 73 65 50 61 74 68 29 3b 0a 23 65 6e 64 69 66  asePath);.#endif
23ad0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
23ae0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
23af0 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  ( sizeof(*pShmNo
23b00 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61  de) + nShmFilena
23b10 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53  me );.    if( pS
23b20 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
23b30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
23b40 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
23b50 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
23b60 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rr;.    }.    me
23b70 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30  mset(pShmNode, 0
23b80 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  , sizeof(*pShmNo
23b90 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  de)+nShmFilename
23ba0 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e  );.    zShmFilen
23bb0 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ame = pShmNode->
23bc0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
23bd0 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b  r*)&pShmNode[1];
23be0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
23bf0 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
23c00 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
23c10 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
23c20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  zShmFilename, . 
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c40 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44      SQLITE_SHM_D
23c50 49 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74  IRECTORY "/sqlit
23c60 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20  e-shm-%x-%x",.  
23c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c80 20 20 20 28 75 33 32 29 73 53 74 61 74 2e 73 74     (u32)sStat.st
23c90 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74  _ino, (u32)sStat
23ca0 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a  .st_dev);.#else.
23cb0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
23cc0 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d  intf(nShmFilenam
23cd0 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  e, zShmFilename,
23ce0 20 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65   "%s-shm", zBase
23cf0 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
23d00 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44  e3FileSuffix3(pD
23d10 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d  bFd->zPath, zShm
23d20 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
23d30 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  f.    pShmNode->
23d40 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46  h = -1;.    pDbF
23d50 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
23d60 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
23d70 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49      pShmNode->pI
23d80 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49  node = pDbFd->pI
23d90 6e 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 73 71  node;.    if( sq
23da0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
23db0 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
23dc0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
23dd0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
23de0 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
23df0 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
23e00 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
23e10 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
23e20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23e30 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
23e40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
23e50 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20  _open_err;.     
23e60 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
23e70 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ( pInode->bProce
23e80 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
23e90 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73     int openFlags
23ea0 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52   = O_RDWR | O_CR
23eb0 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28 20 73  EAT;.      if( s
23ec0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
23ed0 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  an(pDbFd->zPath,
23ee0 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c   "readonly_shm",
23ef0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6f   0) ){.        o
23f00 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f  penFlags = O_RDO
23f10 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53 68  NLY;.        pSh
23f20 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
23f30 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 1;.      }. 
23f40 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68       pShmNode->h
23f50 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
23f60 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65  ShmFilename, ope
23f70 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e 73  nFlags, (sStat.s
23f80 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20  t_mode&0777));. 
23f90 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
23fa0 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20  e->h<0 ){.      
23fb0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
23fc0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
23fd0 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
23fe0 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
23ff0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
24000 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
24010 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
24020 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
24030 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74   running as root
24040 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
24050 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20 20   the SHM file.  
24060 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20      ** is owned 
24070 62 79 20 74 68 65 20 73 61 6d 65 20 75 73 65 72  by the same user
24080 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20 6f   that owns the o
24090 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
240a0 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  .  Otherwise,.  
240b0 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
240c0 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e  nal owner will n
240d0 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63 6f  ot be able to co
240e0 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  nnect..      */.
240f0 20 20 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f        robustFcho
24100 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  wn(pShmNode->h, 
24110 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53  sStat.st_uid, sS
24120 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a  tat.st_gid);.  .
24130 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
24140 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
24150 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
24160 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
24170 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a   switch..      *
24180 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
24190 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
241a0 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
241b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
241c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
241d0 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73    if( unixShmSys
241e0 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
241f0 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _WRLCK, UNIX_SHM
24200 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
24210 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
24220 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
24230 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
24240 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
24250 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
24260 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
24270 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63  SHMOPEN, "ftrunc
24280 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  ate", zShmFilena
24290 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
242a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
242b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
242c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
242d0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
242e0 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c  (pDbFd, F_RDLCK,
242f0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
24300 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24310 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
24320 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
24330 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
24340 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
24350 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
24360 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
24370 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
24380 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
24390 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
243a0 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
243b0 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
243c0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
243d0 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
243e0 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
243f0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
24400 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
24410 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
24420 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
24430 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
24440 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
24450 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
24460 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
24470 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
24480 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
24490 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
244a0 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a  uct unixShm) obj
244b0 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
244c0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
244d0 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
244e0 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
244f0 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
24500 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
24510 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
24520 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
24530 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
24540 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
24550 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
24560 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
24570 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
24580 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
24590 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
245a0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
245b0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
245c0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
245d0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
245e0 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
245f0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
24600 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
24610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24620 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
24630 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
24640 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
24650 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
24660 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54  bFd);       /* T
24670 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
24680 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
24690 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
246a0 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78  _free(p);.  unix
246b0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
246c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
246d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
246e0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
246f0 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
24700 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
24710 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
24720 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
24730 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
24740 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
24750 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
24760 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
24770 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
24780 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
24790 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
247a0 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
247b0 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
247c0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
247d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
247e0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
247f0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
24800 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
24810 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
24820 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
24830 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
24840 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
24850 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
24860 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
24870 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
24880 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
24890 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
248a0 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
248b0 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
248c0 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
248d0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
248e0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
248f0 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64  . If .** bExtend
24900 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
24910 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
24920 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
24930 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
24940 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
24950 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
24960 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
24970 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
24980 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
24990 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
249a0 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
249b0 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
249c0 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
249d0 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
249e0 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
249f0 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
24a00 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
24a10 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
24a20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
24a30 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
24a40 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
24a50 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
24a60 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
24a70 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
24a80 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
24a90 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
24aa0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
24ab0 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
24ac0 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
24ad0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
24ae0 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24b00 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
24b10 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
24b20 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
24b30 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
24b40 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
24b50 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20  int bExtend,    
24b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b70 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
24b80 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
24b90 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
24ba0 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
24bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
24bc0 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
24bd0 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
24be0 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
24bf0 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
24c00 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  m *p;.  unixShmN
24c10 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
24c20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24c30 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50  _OK;.  int nShmP
24c40 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52  erMap = unixShmR
24c50 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20  egionPerMap();. 
24c60 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b   int nReqRegion;
24c70 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
24c80 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
24c90 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
24ca0 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
24cb0 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
24cc0 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
24cd0 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  {.    rc = unixO
24ce0 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
24cf0 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
24d00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
24d10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
24d20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
24d30 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  m;.  pShmNode = 
24d40 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73  p->pShmNode;.  s
24d50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
24d60 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
24d70 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
24d80 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
24d90 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
24da0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
24db0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
24dc0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
24dd0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
24de0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
24df0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
24e00 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
24e10 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
24e20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
24e30 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
24e40 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
24e50 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
24e60 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d    /* Minimum num
24e70 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72  ber of regions r
24e80 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61  equired to be ma
24e90 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52  pped. */.  nReqR
24ea0 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f  egion = ((iRegio
24eb0 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20  n+nShmPerMap) / 
24ec0 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53  nShmPerMap) * nS
24ed0 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28  hmPerMap;..  if(
24ee0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
24ef0 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b  on<nReqRegion ){
24f00 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65  .    char **apNe
24f10 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
24f20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
24f30 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  pRegion[] array 
24f40 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
24f50 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a   = nReqRegion*sz
24f60 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e  Region;   /* Min
24f70 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
24f80 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
24f90 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
24fa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24fb0 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74    /* Used by fst
24fc0 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68  at() */..    pSh
24fd0 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
24fe0 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
24ff0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
25000 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >=0 ){.      /* 
25010 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
25020 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
25030 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
25040 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
25050 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43  pace..      ** C
25060 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
25070 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
25080 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
25090 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
250a0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72   is.      ** lar
250b0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
250c0 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
250d0 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
250e0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
250f0 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d  sFstat(pShmNode-
25100 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
25110 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25120 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
25130 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
25140 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
25150 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
25160 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e   sStat.st_size<n
25170 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
25180 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
25190 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
251a0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
251b0 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74  f bExtend is set
251c0 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   to.        ** f
251d0 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
251e0 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
251f0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
25200 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
25210 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
25220 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
25230 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  d ){.          g
25240 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
25250 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
25260 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
25270 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
25280 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64   is true, extend
25290 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68   the file. Do th
252a0 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  is by.        **
252b0 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
252c0 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e  e byte to the en
252d0 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70  d of each (OS) p
252e0 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20  age being.      
252f0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f    ** allocated o
25300 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68  r extended. Tech
25310 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64  nically, we need
25320 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74   only write to t
25330 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61  he.        ** la
25340 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  st page in order
25350 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66   to extend the f
25360 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67  ile. But writing
25370 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20   to all new.    
25380 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72      ** pages for
25390 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c  ces the OS to al
253a0 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65  locate them imme
253b0 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72  diately, which r
253c0 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a  educes.        *
253d0 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66  * the chances of
253e0 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63   SIGBUS while ac
253f0 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70  cessing the mapp
25400 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20  ed region later 
25410 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
25420 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20         else{.   
25430 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
25440 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34  nst int pgsz = 4
25450 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69  096;.          i
25460 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20  nt iPg;..       
25470 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
25480 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  he last byte of 
25490 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63  each newly alloc
254a0 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
254b0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
254c0 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74     assert( (nByt
254d0 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a  e % pgsz)==0 );.
254e0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50            for(iP
254f0 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  g=(sStat.st_size
25500 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79  /pgsz); iPg<(nBy
25510 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29  te/pgsz); iPg++)
25520 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
25530 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t x = 0;.       
25540 20 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64       if( seekAnd
25550 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65  WriteFd(pShmNode
25560 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20  ->h, iPg*pgsz + 
25570 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 26  pgsz-1, "", 1, &
25580 78 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  x)!=1 ){.       
25590 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
255a0 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e  r *zFile = pShmN
255b0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ode->zFilename;.
255c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
255d0 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
255e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
255f0 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a  SIZE, "write", z
25600 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
25610 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
25620 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  e_out;.         
25630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
25640 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25650 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
25660 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
25670 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
25680 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
25690 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
256a0 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
256b0 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69   = (char **)sqli
256c0 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
256d0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
256e0 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67  pRegion, nReqReg
256f0 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20  ion*sizeof(char 
25700 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  *).    );.    if
25710 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
25720 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
25730 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
25740 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
25750 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
25760 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
25770 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20  gion = apNew;.  
25780 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
25790 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52  e->nRegion<nReqR
257a0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69  egion ){.      i
257b0 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69  nt nMap = szRegi
257c0 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20  on*nShmPerMap;. 
257d0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
257e0 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20    void *pMem;.  
257f0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
25800 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
25810 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28    pMem = osMmap(
25820 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20  0, nMap,.       
25830 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
25840 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54  sReadonly ? PROT
25850 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41  _READ : PROT_REA
25860 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20  D|PROT_WRITE, . 
25870 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53             MAP_S
25880 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d  HARED, pShmNode-
25890 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36  >h, szRegion*(i6
258a0 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  4)pShmNode->nReg
258b0 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ion.        );. 
258c0 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
258d0 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
258e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
258f0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
25900 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20  E_IOERR_SHMMAP, 
25910 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65  "mmap", pShmNode
25920 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
25930 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
25940 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
25950 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
25960 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
25970 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
25980 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  (szRegion);.    
25990 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20      if( pMem==0 
259a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
259b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
259c0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
259d0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
259e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
259f0 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20     memset(pMem, 
25a00 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  0, szRegion);.  
25a10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72      }..      for
25a20 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d  (i=0; i<nShmPerM
25a30 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ap; i++){.      
25a40 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
25a50 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
25a60 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63  Region+i] = &((c
25a70 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67  har*)pMem)[szReg
25a80 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  ion*i];.      }.
25a90 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
25aa0 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50  nRegion += nShmP
25ab0 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  erMap;.    }.  }
25ac0 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
25ad0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
25ae0 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
25af0 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d  {.    *pp = pShm
25b00 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  Node->apRegion[i
25b10 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65  Region];.  }else
25b20 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
25b30 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
25b40 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26  e->isReadonly &&
25b50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25b60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
25b70 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33  DONLY;.  sqlite3
25b80 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
25b90 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
25ba0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25bb0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
25bc0 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
25bd0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
25be0 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  egment..**.** No
25bf0 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61  te that the rela
25c00 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
25c10 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c   SHAREd and EXCL
25c20 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61  USIVE locks is a
25c30 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65   little.** diffe
25c40 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69  rent here than i
25c50 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68  n posix.  In xSh
25c60 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e  mLock(), one can
25c70 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   go from unlocke
25c80 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61  d.** to shared a
25c90 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20  nd back or from 
25ca0 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c  unlocked to excl
25cb0 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20  usive and back. 
25cc0 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20   But one may.** 
25cd0 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72  not go from shar
25ce0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
25cf0 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76  or from exclusiv
25d00 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a  e to shared..*/.
25d10 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
25d20 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
25d30 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
25d40 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
25d50 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
25d60 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
25d70 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d90 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
25da0 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
25db0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dd0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25de0 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
25df0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
25e00 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
25e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25e20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
25e30 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
25e40 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
25e50 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
25e60 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;      /* Connec
25e70 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
25e80 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
25e90 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62  unixShm *p = pDb
25ea0 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20  Fd->pShm;       
25eb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
25ec0 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
25ed0 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69   locked */.  uni
25ee0 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20  xShm *pX;       
25ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f00 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
25f10 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
25f20 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ngs */.  unixShm
25f30 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
25f40 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f   p->pShmNode;  /
25f50 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
25f60 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20   file iNode */. 
25f70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25f80 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
25f90 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
25fa0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
25fb0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
25fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fd0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
25fe0 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
25ff0 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
26000 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
26010 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
26020 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
26030 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
26040 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
26050 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  e );.  assert( o
26060 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
26070 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
26080 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
26090 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
260a0 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
260b0 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
260c0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
260d0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
260e0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
260f0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
26100 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
26110 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
26120 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
26130 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
26140 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
26150 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
26160 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
26170 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
26180 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20 6e 3d  .  /* assert( n=
26190 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  =1 || (flags & S
261a0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
261b0 49 56 45 29 21 3d 30 20 29 3b 20 2a 2f 0a 20 20  IVE)!=0 ); */.  
261c0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
261d0 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d  ->h>=0 || pDbFd-
261e0 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
261f0 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73  sLock==1 );.  as
26200 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
26210 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  h<0 || pDbFd->pI
26220 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
26230 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b  ck==0 );..  mask
26240 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   = (1<<(ofst+n))
26250 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
26260 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d  assert( n>1 || m
26270 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29  ask==(1<<ofst) )
26280 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
26290 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
262a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
262b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
262c0 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  HM_UNLOCK ){.   
262d0 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30   u16 allMask = 0
262e0 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63  ; /* Mask of loc
262f0 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69  ks held by sibli
26300 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ngs */..    /* S
26310 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e  ee if any siblin
26320 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d  gs hold this sam
26330 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f  e lock */.    fo
26340 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
26350 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
26360 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
26370 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74  if( pX==p ) cont
26380 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
26390 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  rt( (pX->exclMas
263a0 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b  k & (p->exclMask
263b0 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29  |p->sharedMask))
263c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c  ==0 );.      all
263d0 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72  Mask |= pX->shar
263e0 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
263f0 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65     /* Unlock the
26400 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
26410 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  cks */.    if( (
26420 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d  mask & allMask)=
26430 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
26440 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
26450 63 6b 28 70 44 62 46 64 2c 20 46 5f 55 4e 4c 43  ck(pDbFd, F_UNLC
26460 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
26470 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
26480 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
26490 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
264a0 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
264b0 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
264c0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
264d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
264e0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
264f0 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
26500 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
26510 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
26520 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
26530 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
26540 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
26550 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
26560 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
26570 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
26580 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
26590 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
265a0 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
265b0 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
265c0 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
265d0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
265e0 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
265f0 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
26600 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
26610 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
26620 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
26630 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
26640 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
26650 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
26660 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
26670 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
26680 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
26690 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
266a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
266b0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
266c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
266d0 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
266e0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
266f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
26700 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
26710 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
26720 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
26730 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
26740 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26750 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
26760 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
26770 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
26780 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
26790 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c  (pDbFd, F_RDLCK,
267a0 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42   ofst+UNIX_SHM_B
267b0 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
267c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
267d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
267e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
267f0 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
26800 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
26810 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
26820 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26830 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
26840 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
26850 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
26860 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
26870 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
26880 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
26890 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
268a0 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
268b0 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
268c0 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
268d0 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
268e0 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
268f0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
26900 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
26910 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
26920 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
26930 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
26940 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
26950 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
26960 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
26970 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
26980 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
26990 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
269a0 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
269b0 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
269c0 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
269d0 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ful.    ** also 
269e0 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
269f0 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
26a00 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a  ng locked..    *
26a10 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
26a20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26a30 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
26a40 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
26a50 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _WRLCK, ofst+UNI
26a60 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
26a70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
26a80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26a90 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
26aa0 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
26ab0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
26ac0 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  p->exclMask |= m
26ad0 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
26ae0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
26af0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
26b00 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
26b10 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
26b20 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69  OCK shmid-%d, pi
26b30 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30  d-%d got %03x,%0
26b40 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3x\n",.         
26b50 20 20 70 2d 3e 69 64 2c 20 6f 73 47 65 74 70 69    p->id, osGetpi
26b60 64 28 30 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d  d(0), p->sharedM
26b70 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b  ask, p->exclMask
26b80 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
26b90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
26ba0 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72  ent a memory bar
26bb0 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66  rier or memory f
26bc0 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d  ence on shared m
26bd0 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  emory.  .**.** A
26be0 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f  ll loads and sto
26bf0 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65  res begun before
26c00 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73   the barrier mus
26c10 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72  t complete befor
26c20 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72  e.** any load or
26c30 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74   store begun aft
26c40 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a  er the barrier..
26c50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
26c60 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20  nixShmBarrier(. 
26c70 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
26c80 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
26c90 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
26ca0 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
26cb0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
26cc0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
26cd0 45 54 45 52 28 66 64 29 3b 0a 20 20 73 71 6c 69  ETER(fd);.  sqli
26ce0 74 65 33 4d 65 6d 6f 72 79 42 61 72 72 69 65 72  te3MemoryBarrier
26cf0 28 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 63  ();         /* c
26d00 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65 64 20  ompiler-defined 
26d10 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 2a  memory barrier *
26d20 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
26d30 65 78 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  ex();           
26d40 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74 65      /* Also mute
26d50 78 2c 20 66 6f 72 20 72 65 64 75 6e 64 61 6e 63  x, for redundanc
26d60 79 20 2a 2f 0a 20 20 75 6e 69 78 4c 65 61 76 65  y */.  unixLeave
26d70 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mutex();.}../*.*
26d80 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  * Close a connec
26d90 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
26da0 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74  emory.  Delete t
26db0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a  he underlying .*
26dc0 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c  * storage if del
26dd0 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e  eteFlag is true.
26de0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
26df0 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d  is no shared mem
26e00 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
26e10 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ith the connecti
26e20 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  on then this.** 
26e30 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
26e40 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
26e50 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
26e60 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
26e70 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
26e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26e90 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
26ea0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
26eb0 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ed0 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65 64  /* Delete shared
26ee0 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20  -memory if true 
26ef0 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20  */.){.  unixShm 
26f00 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
26f10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
26f20 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
26f30 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78  closed */.  unix
26f40 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
26f50 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
26f60 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68  he underlying sh
26f70 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
26f80 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a   */.  unixShm **
26f90 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pp;             
26fa0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
26fb0 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
26fc0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
26fd0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
26fe0 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Fd;             
26ff0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
27000 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
27010 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d  le */..  pDbFd =
27020 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a   (unixFile*)fd;.
27030 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
27040 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  m;.  if( p==0 ) 
27050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27060 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
27070 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61  ->pShmNode;..  a
27080 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d  ssert( pShmNode=
27090 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e  =pDbFd->pInode->
270a0 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73  pShmNode );.  as
270b0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
270c0 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
270d0 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52  Inode );..  /* R
270e0 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
270f0 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
27100 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
27110 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
27120 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
27130 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
27140 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
27150 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
27160 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
27170 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
27180 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
27190 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
271a0 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
271b0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
271c0 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
271d0 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
271e0 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
271f0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
27200 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
27210 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
27220 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
27230 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
27240 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
27250 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
27260 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
27270 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
27280 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
27290 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
272a0 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
272b0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
272c0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
272d0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c  0 ){.    if( del
272e0 65 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e  eteFlag && pShmN
272f0 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
27300 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d     osUnlink(pShm
27310 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
27320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  ;.    }.    unix
27330 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b  ShmPurge(pDbFd);
27340 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
27350 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75  Mutex();..  retu
27360 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27370 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ..#else.# define
27380 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20   unixShmMap     
27390 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
273a0 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65  hmLock    0.# de
273b0 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72  fine unixShmBarr
273c0 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75  ier 0.# define u
273d0 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a  nixShmUnmap   0.
273e0 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
273f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
27400 4c 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45  L */..#if SQLITE
27410 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
27420 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  ./*.** If it is 
27430 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d 6f 72 79  currently memory
27440 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61 70 20 66   mapped, unmap f
27450 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73 74 61 74  ile pFd..*/.stat
27460 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61  ic void unixUnma
27470 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
27480 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pFd){.  assert( 
27490 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
274a0 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e  0 );.  if( pFd->
274b0 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20  pMapRegion ){.  
274c0 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46 64 2d 3e    osMunmap(pFd->
274d0 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70 46 64 2d  pMapRegion, pFd-
274e0 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 29  >mmapSizeActual)
274f0 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52  ;.    pFd->pMapR
27500 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70  egion = 0;.    p
27510 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30  Fd->mmapSize = 0
27520 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53  ;.    pFd->mmapS
27530 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20  izeActual = 0;. 
27540 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65   }.}../*.** Atte
27550 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 73  mpt to set the s
27560 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72  ize of the memor
27570 79 20 6d 61 70 70 69 6e 67 20 6d 61 69 6e 74 61  y mapping mainta
27580 69 6e 65 64 20 62 79 20 66 69 6c 65 20 0a 2a 2a  ined by file .**
27590 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20   descriptor pFd 
275a0 74 6f 20 6e 4e 65 77 20 62 79 74 65 73 2e 20 41  to nNew bytes. A
275b0 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  ny existing mapp
275c0 69 6e 67 20 69 73 20 64 69 73 63 61 72 64 65 64  ing is discarded
275d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
275e0 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e 63  ssful, this func
275f0 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 66 6f  tion sets the fo
27600 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
27610 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 75  s:.**.**       u
27620 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52 65 67 69  nixFile.pMapRegi
27630 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78  on.**       unix
27640 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 0a 2a 2a  File.mmapSize.**
27650 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
27660 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 0a 2a  mmapSizeActual.*
27670 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63 63 65 73  *.** If unsucces
27680 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f 72 20 6d  sful, an error m
27690 65 73 73 61 67 65 20 69 73 20 6c 6f 67 67 65 64  essage is logged
276a0 20 76 69 61 20 73 71 6c 69 74 65 33 5f 6c 6f 67   via sqlite3_log
276b0 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 68  () and.** the th
276c0 72 65 65 20 76 61 72 69 61 62 6c 65 73 20 61 62  ree variables ab
276d0 6f 76 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ove are zeroed. 
276e0 49 6e 20 74 68 69 73 20 63 61 73 65 20 53 51 4c  In this case SQL
276f0 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 63 6f  ite should.** co
27700 6e 74 69 6e 75 65 20 61 63 63 65 73 73 69 6e 67  ntinue accessing
27710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
27720 69 6e 67 20 74 68 65 20 78 52 65 61 64 28 29 20  ing the xRead() 
27730 61 6e 64 20 78 57 72 69 74 65 28 29 0a 2a 2a 20  and xWrite().** 
27740 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
27750 69 63 20 76 6f 69 64 20 75 6e 69 78 52 65 6d 61  ic void unixRema
27760 70 66 69 6c 65 28 0a 20 20 75 6e 69 78 46 69 6c  pfile(.  unixFil
27770 65 20 2a 70 46 64 2c 20 20 20 20 20 20 20 20 20  e *pFd,         
27780 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
27790 20 64 65 73 63 72 69 70 74 6f 72 20 6f 62 6a 65   descriptor obje
277a0 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4e 65 77  ct */.  i64 nNew
277b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
277d0 72 65 64 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  red mapping size
277e0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
277f0 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 6d 6d 61  har *zErr = "mma
27800 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d 20 70 46  p";.  int h = pF
27810 64 2d 3e 68 3b 20 20 20 20 20 20 20 20 20 20 20  d->h;           
27820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
27830 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70  le descriptor op
27840 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65 20 2a 2f  en on db file */
27850 0a 20 20 75 38 20 2a 70 4f 72 69 67 20 3d 20 28  .  u8 *pOrig = (
27860 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
27870 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f 69 6e 74  gion;   /* Point
27880 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 66 69  er to current fi
27890 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20  le mapping */.  
278a0 69 36 34 20 6e 4f 72 69 67 20 3d 20 70 46 64 2d  i64 nOrig = pFd-
278b0 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b  >mmapSizeActual;
278c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
278d0 70 4f 72 69 67 20 72 65 67 69 6f 6e 20 69 6e 20  pOrig region in 
278e0 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70  bytes */.  u8 *p
278f0 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
27900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27910 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 6e  /* Location of n
27920 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20  ew mapping */.  
27930 69 6e 74 20 66 6c 61 67 73 20 3d 20 50 52 4f 54  int flags = PROT
27940 5f 52 45 41 44 3b 20 20 20 20 20 20 20 20 20 20  _READ;          
27950 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f       /* Flags to
27960 20 70 61 73 73 20 74 6f 20 6d 6d 61 70 28 29 20   pass to mmap() 
27970 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
27980 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  d->nFetchOut==0 
27990 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
279a0 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  w>pFd->mmapSize 
279b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
279c0 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  w<=pFd->mmapSize
279d0 4d 61 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Max );.  assert(
279e0 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 61 73 73   nNew>0 );.  ass
279f0 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ert( pFd->mmapSi
27a00 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64 2d 3e 6d  zeActual>=pFd->m
27a10 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  mapSize );.  ass
27a20 65 72 74 28 20 4d 41 50 5f 46 41 49 4c 45 44 21  ert( MAP_FAILED!
27a30 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  =0 );..#ifdef SQ
27a40 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52  LITE_MMAP_READWR
27a50 49 54 45 0a 20 20 69 66 28 20 28 70 46 64 2d 3e  ITE.  if( (pFd->
27a60 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
27a70 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20  FILE_RDONLY)==0 
27a80 29 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f  ) flags |= PROT_
27a90 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a 0a 20  WRITE;.#endif.. 
27aa0 20 69 66 28 20 70 4f 72 69 67 20 29 7b 0a 23 69   if( pOrig ){.#i
27ab0 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20  f HAVE_MREMAP.  
27ac0 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20 70    i64 nReuse = p
27ad0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 23 65  Fd->mmapSize;.#e
27ae0 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  lse.    const in
27af0 74 20 73 7a 53 79 73 70 61 67 65 20 3d 20 6f 73  t szSyspage = os
27b00 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 20  Getpagesize();. 
27b10 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20     i64 nReuse = 
27b20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 26  (pFd->mmapSize &
27b30 20 7e 28 73 7a 53 79 73 70 61 67 65 2d 31 29 29   ~(szSyspage-1))
27b40 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20  ;.#endif.    u8 
27b50 2a 70 52 65 71 20 3d 20 26 70 4f 72 69 67 5b 6e  *pReq = &pOrig[n
27b60 52 65 75 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a 20  Reuse];..    /* 
27b70 55 6e 6d 61 70 20 61 6e 79 20 70 61 67 65 73 20  Unmap any pages 
27b80 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  of the existing 
27b90 6d 61 70 70 69 6e 67 20 74 68 61 74 20 63 61 6e  mapping that can
27ba0 6e 6f 74 20 62 65 20 72 65 75 73 65 64 2e 20 2a  not be reused. *
27bb0 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 75 73 65  /.    if( nReuse
27bc0 21 3d 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  !=nOrig ){.     
27bd0 20 6f 73 4d 75 6e 6d 61 70 28 70 52 65 71 2c 20   osMunmap(pReq, 
27be0 6e 4f 72 69 67 2d 6e 52 65 75 73 65 29 3b 0a 20  nOrig-nReuse);. 
27bf0 20 20 20 7d 0a 0a 23 69 66 20 48 41 56 45 5f 4d     }..#if HAVE_M
27c00 52 45 4d 41 50 0a 20 20 20 20 70 4e 65 77 20 3d  REMAP.    pNew =
27c10 20 6f 73 4d 72 65 6d 61 70 28 70 4f 72 69 67 2c   osMremap(pOrig,
27c20 20 6e 52 65 75 73 65 2c 20 6e 4e 65 77 2c 20 4d   nReuse, nNew, M
27c30 52 45 4d 41 50 5f 4d 41 59 4d 4f 56 45 29 3b 0a  REMAP_MAYMOVE);.
27c40 20 20 20 20 7a 45 72 72 20 3d 20 22 6d 72 65 6d      zErr = "mrem
27c50 61 70 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70  ap";.#else.    p
27c60 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70 52 65  New = osMmap(pRe
27c70 71 2c 20 6e 4e 65 77 2d 6e 52 65 75 73 65 2c 20  q, nNew-nReuse, 
27c80 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45  flags, MAP_SHARE
27c90 44 2c 20 68 2c 20 6e 52 65 75 73 65 29 3b 0a 20  D, h, nReuse);. 
27ca0 20 20 20 69 66 28 20 70 4e 65 77 21 3d 4d 41 50     if( pNew!=MAP
27cb0 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
27cc0 20 69 66 28 20 70 4e 65 77 21 3d 70 52 65 71 20   if( pNew!=pReq 
27cd0 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e  ){.        osMun
27ce0 6d 61 70 28 70 4e 65 77 2c 20 6e 4e 65 77 20 2d  map(pNew, nNew -
27cf0 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 20 20   nReuse);.      
27d00 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
27d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27d20 20 70 4e 65 77 20 3d 20 70 4f 72 69 67 3b 0a 20   pNew = pOrig;. 
27d30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
27d40 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  dif..    /* The 
27d50 61 74 74 65 6d 70 74 20 74 6f 20 65 78 74 65 6e  attempt to exten
27d60 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  d the existing m
27d70 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2e 20 46  apping failed. F
27d80 72 65 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  ree it. */.    i
27d90 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49  f( pNew==MAP_FAI
27da0 4c 45 44 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29  LED || pNew==0 )
27db0 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70  {.      osMunmap
27dc0 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 29 3b  (pOrig, nReuse);
27dd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
27de0 20 49 66 20 70 4e 65 77 20 69 73 20 73 74 69 6c   If pNew is stil
27df0 6c 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f 20 63  l NULL, try to c
27e00 72 65 61 74 65 20 61 6e 20 65 6e 74 69 72 65 6c  reate an entirel
27e10 79 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a  y new mapping. *
27e20 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  /.  if( pNew==0 
27e30 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  ){.    pNew = os
27e40 4d 6d 61 70 28 30 2c 20 6e 4e 65 77 2c 20 66 6c  Mmap(0, nNew, fl
27e50 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c  ags, MAP_SHARED,
27e60 20 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69   h, 0);.  }..  i
27e70 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49  f( pNew==MAP_FAI
27e80 4c 45 44 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  LED ){.    pNew 
27e90 3d 20 30 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20  = 0;.    nNew = 
27ea0 30 3b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  0;.    unixLogEr
27eb0 72 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a  ror(SQLITE_OK, z
27ec0 45 72 72 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29  Err, pFd->zPath)
27ed0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
27ee0 20 6d 6d 61 70 28 29 20 61 62 6f 76 65 20 66 61   mmap() above fa
27ef0 69 6c 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61  iled, assume tha
27f00 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  t all subsequent
27f10 20 6d 6d 61 70 28 29 20 63 61 6c 6c 73 0a 20 20   mmap() calls.  
27f20 20 20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62 61 62    ** will probab
27f30 6c 79 20 66 61 69 6c 20 74 6f 6f 2e 20 46 61 6c  ly fail too. Fal
27f40 6c 20 62 61 63 6b 20 74 6f 20 75 73 69 6e 67 20  l back to using 
27f50 78 52 65 61 64 2f 78 57 72 69 74 65 20 65 78 63  xRead/xWrite exc
27f60 6c 75 73 69 76 65 6c 79 0a 20 20 20 20 2a 2a 20  lusively.    ** 
27f70 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
27f80 2f 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53  /.    pFd->mmapS
27f90 69 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20 7d 0a  izeMax = 0;.  }.
27fa0 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f    pFd->pMapRegio
27fb0 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70 4e 65 77  n = (void *)pNew
27fc0 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  ;.  pFd->mmapSiz
27fd0 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  e = pFd->mmapSiz
27fe0 65 41 63 74 75 61 6c 20 3d 20 6e 4e 65 77 3b 0a  eActual = nNew;.
27ff0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20  }../*.** Memory 
28000 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65  map or remap the
28010 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20   file opened by 
28020 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
28030 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65  pFd (if the file
28040 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d  .** is already m
28050 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74  apped, the exist
28060 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72  ing mapping is r
28070 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e  eplaced by the n
28080 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20  ew). Or, if .** 
28090 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78  there already ex
280a0 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66  ists a mapping f
280b0 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e  or this file, an
280c0 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  d there are stil
280d0 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  l .** outstandin
280e0 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72  g xFetch() refer
280f0 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69  ences to it, thi
28100 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
28110 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
28120 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20  parameter nByte 
28130 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c  is non-negative,
28140 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
28150 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
28160 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e  f .** the mappin
28170 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68  g to create. Oth
28180 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65  erwise, if nByte
28190 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
281a0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  ro, then the .**
281b0 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
281c0 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
281d0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
281e0 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   The actual size
281f0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74   of the.** creat
28200 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69  ed mapping is ei
28210 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74  ther the request
28220 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76  ed size or the v
28230 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20  alue configured 
28240 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45  .** using SQLITE
28250 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49  _FCNTL_MMAP_LIMI
28260 54 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20  T, whichever is 
28270 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53  smaller..**.** S
28280 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
28290 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
282a0 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66   occurs (even if
282b0 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20   the mapping is 
282c0 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64  not.** recreated
282d0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
282e0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
282f0 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51  rences) or an SQ
28300 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
28310 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
28320 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
28330 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  Mapfile(unixFile
28340 20 2a 70 46 64 2c 20 69 36 34 20 6e 4d 61 70 29   *pFd, i64 nMap)
28350 7b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70  {.  assert( nMap
28360 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74  >=0 || pFd->nFet
28370 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73  chOut==0 );.  as
28380 73 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c 7c 20  sert( nMap>0 || 
28390 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d  (pFd->mmapSize==
283a0 30 20 26 26 20 70 46 64 2d 3e 70 4d 61 70 52 65  0 && pFd->pMapRe
283b0 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66  gion==0) );.  if
283c0 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
283d0 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >0 ) return SQLI
283e0 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d  TE_OK;..  if( nM
283f0 61 70 3c 30 20 29 7b 0a 20 20 20 20 73 74 72 75  ap<0 ){.    stru
28400 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
28410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
28420 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f  -level file info
28430 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
28440 66 28 20 6f 73 46 73 74 61 74 28 70 46 64 2d 3e  f( osFstat(pFd->
28450 68 2c 20 26 73 74 61 74 62 75 66 29 20 29 7b 0a  h, &statbuf) ){.
28460 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28470 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
28480 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20  .    }.    nMap 
28490 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  = statbuf.st_siz
284a0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61  e;.  }.  if( nMa
284b0 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  p>pFd->mmapSizeM
284c0 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d  ax ){.    nMap =
284d0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
284e0 78 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  x;.  }..  assert
284f0 28 20 6e 4d 61 70 3e 30 20 7c 7c 20 28 70 46 64  ( nMap>0 || (pFd
28500 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30 20 26 26  ->mmapSize==0 &&
28510 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
28520 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 6e 4d  ==0) );.  if( nM
28530 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  ap!=pFd->mmapSiz
28540 65 20 29 7b 0a 20 20 20 20 75 6e 69 78 52 65 6d  e ){.    unixRem
28550 61 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d 61 70  apfile(pFd, nMap
28560 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
28570 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
28580 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
28590 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
285a0 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73  /../*.** If poss
285b0 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70  ible, return a p
285c0 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70  ointer to a mapp
285d0 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73  ing of file fd s
285e0 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65  tarting at offse
285f0 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d  t.** iOff. The m
28600 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76  apping must be v
28610 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73  alid for at leas
28620 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a  t nAmt bytes..**
28630 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f  .** If such a po
28640 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74  inter can be obt
28650 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20  ained, store it 
28660 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72  in *pp and retur
28670 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
28680 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f  Or, if one canno
28690 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  t but no error o
286a0 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74  ccurs, set *pp t
286b0 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53  o 0 and return S
286c0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e  QLITE_OK..** Fin
286d0 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
286e0 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65  r does occur, re
286f0 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
28700 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66  rror code. The f
28710 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  inal.** value of
28720 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65   *pp is undefine
28730 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
28740 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
28750 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75  nction does retu
28760 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68  rn a pointer, th
28770 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76  e caller must ev
28780 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c  entually .** rel
28790 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
287a0 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75 6e  ce by calling un
287b0 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a  ixUnfetch()..*/.
287c0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
287d0 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c  etch(sqlite3_fil
287e0 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c  e *fd, i64 iOff,
287f0 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20   int nAmt, void 
28800 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  **pp){.#if SQLIT
28810 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
28820 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  0.  unixFile *pF
28830 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  d = (unixFile *)
28840 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
28850 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
28860 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a   file */.#endif.
28870 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66 20    *pp = 0;..#if 
28880 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
28890 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64  SIZE>0.  if( pFd
288a0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20  ->mmapSizeMax>0 
288b0 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e  ){.    if( pFd->
288c0 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b  pMapRegion==0 ){
288d0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
288e0 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64 2c  unixMapfile(pFd,
288f0 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20   -1);.      if( 
28900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28910 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
28920 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  .    if( pFd->mm
28930 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e  apSize >= iOff+n
28940 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  Amt ){.      *pp
28950 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e   = &((u8 *)pFd->
28960 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
28970 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46  ];.      pFd->nF
28980 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d  etchOut++;.    }
28990 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
289a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
289b0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
289c0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
289d0 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
289e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
289f0 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65  eleases a .** re
28a00 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64  ference obtained
28a10 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
28a20 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63 68  all to unixFetch
28a30 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a  (). The second.*
28a40 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  * argument passe
28a50 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
28a60 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  on must be the s
28a70 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65  ame as the corre
28a80 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75  sponding.** argu
28a90 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61  ment that was pa
28aa0 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69 78  ssed to the unix
28ab0 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69  Fetch() invocati
28ac0 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  on. .**.** Or, i
28ad0 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
28ae0 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ment is NULL, th
28af0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
28b00 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
28b10 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74   .** to inform t
28b20 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61  he VFS layer tha
28b30 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  t, according to 
28b40 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74  POSIX, any exist
28b50 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20  ing mapping .** 
28b60 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c  may now be inval
28b70 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
28b80 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74   unmapped..*/.st
28b90 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 66  atic int unixUnf
28ba0 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c  etch(sqlite3_fil
28bb0 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c  e *fd, i64 iOff,
28bc0 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53   void *p){.#if S
28bd0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
28be0 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65  IZE>0.  unixFile
28bf0 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c   *pFd = (unixFil
28c00 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  e *)fd;   /* The
28c10 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
28c20 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 55  base file */.  U
28c30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
28c40 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  iOff);..  /* If 
28c50 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20  p==0 (unmap the 
28c60 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65  entire file) the
28c70 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
28c80 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a  no outstanding .
28c90 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65    ** xFetch refe
28ca0 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70  rences. Or, if p
28cb0 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20  !=0 (meaning it 
28cc0 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66  is an xFetch ref
28cd0 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68  erence),.  ** th
28ce0 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
28cf0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
28d00 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20  tstanding.  */. 
28d10 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d   assert( (p==0)=
28d20 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  =(pFd->nFetchOut
28d30 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
28d40 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d   p!=0, it must m
28d50 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61  atch the iOff va
28d60 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lue. */.  assert
28d70 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28  ( p==0 || p==&((
28d80 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
28d90 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a  gion)[iOff] );..
28da0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
28db0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b  Fd->nFetchOut--;
28dc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
28dd0 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  ixUnmapfile(pFd)
28de0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
28df0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
28e00 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  =0 );.#else.  UN
28e10 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
28e20 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
28e30 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55  AMETER(p);.  UNU
28e40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 4f  SED_PARAMETER(iO
28e50 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ff);.#endif.  re
28e60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28e70 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e  }../*.** Here en
28e80 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ds the implement
28e90 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c  ation of all sql
28ea0 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
28eb0 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
28ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
28ed0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65   sqlite3_file Me
28ee0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
28ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28f00 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
28f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28f50 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ****/../*.** Thi
28f60 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
28f70 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  ins definitions 
28f80 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  of sqlite3_io_me
28f90 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68  thods objects th
28fa0 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  at.** implement 
28fb0 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63  various file loc
28fc0 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
28fd0 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69    It also contai
28fe0 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ns definitions.*
28ff0 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75  * of "finder" fu
29000 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64  nctions.  A find
29010 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  er-function is u
29020 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  sed to locate th
29030 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
29040 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
29050 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61  ods object for a
29060 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
29070 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20  base file.  The 
29080 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c  pAppData.** fiel
29090 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  d of the sqlite3
290a0 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73  _vfs VFS objects
290b0 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
290c0 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20   to be pointers 
290d0 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  to.** the correc
290e0 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  t finder-functio
290f0 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a  n for that VFS..
29100 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65  **.** Most finde
29110 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  r functions retu
29120 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
29130 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f  a fixed sqlite3_
29140 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
29150 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ject.  The only 
29160 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64  interesting find
29170 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  er-function is a
29180 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  utolockIoFinder,
29190 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20   which.** looks 
291a0 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  at the filesyste
291b0 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73  m type and tries
291c0 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65   to guess the be
291d0 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  st locking.** st
291e0 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74  rategy from that
291f0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64  ..**.** For find
29200 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c 20 74  er-function F, t
29210 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  wo objects are c
29220 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  reated:.**.**   
29230 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69   (1) The real fi
29240 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61  nder-function na
29250 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a  med "FImpt()"..*
29260 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f  *.**    (2) A co
29270 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74  nstant pointer t
29280 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
29290 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a  named just "F"..
292a0 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  **.**.** A point
292b0 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e  er to the F poin
292c0 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74  ter is used as t
292d0 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75  he pAppData valu
292e0 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a  e for VFS.** obj
292f0 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74  ects.  We have t
29300 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61  o do this instea
29310 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70  d of letting pAp
29320 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64  pData point.** d
29330 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66  irectly at the f
29340 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73  inder-function s
29350 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70  ince C90 rules p
29360 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a  revent a void*.*
29370 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69  * from be cast i
29380 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  nto a function p
29390 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  ointer..**.**.**
293a0 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
293b0 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e  f this macro gen
293c0 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63  erates two objec
293d0 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  ts:.**.**   *  A
293e0 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65   constant sqlite
293f0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
29400 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20  ect call METHOD 
29410 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67  that has locking
29420 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73  .**      methods
29430 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
29440 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e  LOCK, CKRESLOCK.
29450 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49  .**.**   *  An I
29460 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  /O method finder
29470 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
29480 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74   FINDER that ret
29490 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  urns a pointer.*
294a0 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45  *      to the ME
294b0 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74  THOD object in t
294c0 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c  he previous bull
294d0 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  et..*/.#define I
294e0 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c  OMETHODS(FINDER,
294f0 4d 45 54 48 4f 44 2c 56 45 52 53 49 4f 4e 2c 43  METHOD,VERSION,C
29500 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f 43 4b  LOSE,LOCK,UNLOCK
29510 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41 50 29 20  ,CKLOCK,SHMMAP) 
29520 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
29530 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
29540 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b  thods METHOD = {
29550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29570 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c     \.   VERSION,
29580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29590 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
295a0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
295b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295c0 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20    \.   CLOSE,   
295d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295e0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20     /* xClose */ 
295f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29610 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20   \.   unixRead, 
29620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29630 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20    /* xRead */   
29640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29660 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20  \.   unixWrite, 
29670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29680 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20   /* xWrite */   
29690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
296b0 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65  .   unixTruncate
296c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
296d0 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20  /* xTruncate */ 
296e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29700 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20     unixSync,    
29710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29720 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20  * xSync */      
29730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29740 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
29750 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20    unixFileSize, 
29760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29770 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20   xFileSize */   
29780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29790 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
297a0 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20   LOCK,          
297b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
297c0 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  xLock */        
297d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297e0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
297f0 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  UNLOCK,         
29800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29810 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  Unlock */       
29820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29830 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
29840 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  KLOCK,          
29850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
29860 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
29870 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
29880 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
29890 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  ixFileControl,  
298a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
298b0 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20  leControl */    
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298d0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
298e0 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  xSectorSize,    
298f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
29900 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  torSize */      
29910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29920 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
29930 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
29940 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69  stics,  /* xDevi
29950 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a  ceCapabilities *
29960 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
29970 20 20 20 20 20 20 5c 0a 20 20 20 53 48 4d 4d 41        \.   SHMMA
29980 50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  P,              
29990 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
299a0 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
299b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299c0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
299d0 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
299e0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63        /* xShmLoc
299f0 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
29a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a10 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
29a20 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20  Barrier,        
29a30 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
29a40 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ier */          
29a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a60 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55     \.   unixShmU
29a70 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  nmap,           
29a80 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70      /* xShmUnmap
29a90 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
29aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ab0 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74 63 68    \.   unixFetch
29ac0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29ad0 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20     /* xFetch */ 
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b00 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65 74 63   \.   unixUnfetc
29b10 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
29b20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f    /* xUnfetch */
29b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b50 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  \.};            
29b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
29ba0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
29bb0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29bc0 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63   *FINDER##Impl(c
29bd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e  onst char *z, un
29be0 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a  ixFile *p){   \.
29bf0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
29c00 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41  ER(z); UNUSED_PA
29c10 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20  RAMETER(p);     
29c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c30 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
29c40 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b   return &METHOD;
29c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c80 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20              \.} 
29c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cd0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
29ce0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
29cf0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
29d00 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f  const FINDER)(co
29d10 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
29d20 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20  le *p)    \.    
29d30 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a  = FINDER##Impl;.
29d40 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20  ./*.** Here are 
29d50 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74  all of the sqlit
29d60 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
29d70 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f  jects for each o
29d80 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  f the.** locking
29d90 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75   strategies.  Fu
29da0 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
29db0 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  urn pointers to 
29dc0 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a  these methods.**
29dd0 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65   are also create
29de0 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28  d..*/.IOMETHODS(
29df0 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72  .  posixIoFinder
29e00 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
29e10 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
29e20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49  name */.  posixI
29e30 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
29e40 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
29e50 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
29e60 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20   name */.  3,   
29e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e80 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
29e90 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20 61  emory and mmap a
29ea0 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  re enabled */.  
29eb0 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
29ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
29ed0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
29ee0 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
29ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
29f00 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
29f10 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nixUnlock,      
29f20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
29f30 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29f40 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
29f50 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68  dLock,    /* xCh
29f60 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29f70 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
29f80 53 68 6d 4d 61 70 20 20 20 20 20 20 20 20 20 20  ShmMap          
29f90 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
29fa0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
29fb0 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b  ETHODS(.  nolock
29fc0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
29fd0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
29fe0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
29ff0 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73   nolockIoMethods
2a000 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ,          /* sq
2a010 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a020 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
2a030 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
2a040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2a050 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
2a060 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f  disabled */.  no
2a070 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
2a080 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
2a090 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  e method */.  no
2a0a0 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
2a0b0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
2a0c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
2a0d0 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
2a0e0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2a0f0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  k method */.  no
2a100 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
2a110 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43 68 65 63  dLock,  /* xChec
2a120 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
2a130 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
2a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a150 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
2a160 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54  ethod */.).IOMET
2a170 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49  HODS(.  dotlockI
2a180 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
2a190 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
2a1a0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64  tion name */.  d
2a1b0 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c  otlockIoMethods,
2a1c0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2a1d0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2a1e0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
2a1f0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
2a200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
2a210 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
2a220 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c  sabled */.  dotl
2a230 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
2a240 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
2a250 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
2a260 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
2a270 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
2a280 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
2a290 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
2a2a0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
2a2b0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
2a2c0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
2a2d0 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68 65 63 6b 52  Lock, /* xCheckR
2a2e0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
2a2f0 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
2a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a310 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
2a320 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51  hod */.)..#if SQ
2a330 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2a340 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
2a350 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69  ODS(.  flockIoFi
2a360 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2a370 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2a380 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c  ion name */.  fl
2a390 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
2a3a0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2a3b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2a3c0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
2a3d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2a3f0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2a400 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  abled */.  flock
2a410 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2a420 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2a430 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
2a440 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2a450 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2a460 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55  thod */.  flockU
2a470 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2a480 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2a490 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
2a4a0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2a4b0 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k,   /* xCheckRe
2a4c0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2a4d0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4f0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2a500 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
2a510 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49  #if OS_VXWORKS.I
2a520 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49  OMETHODS(.  semI
2a530 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
2a540 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2a550 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2a560 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c  .  semIoMethods,
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a580 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2a590 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
2a5a0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
2a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a5c0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2a5d0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2a5e0 73 65 6d 58 43 6c 6f 73 65 2c 20 20 20 20 20 20  semXClose,      
2a5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
2a600 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
2a610 73 65 6d 58 4c 6f 63 6b 2c 20 20 20 20 20 20 20  semXLock,       
2a620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2a630 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
2a640 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  emXUnlock,      
2a650 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2a660 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2a670 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76 65  semXCheckReserve
2a680 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68  dLock,    /* xCh
2a690 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2a6a0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6c0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
2a6d0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
2a6e0 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
2a6f0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2a700 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2a710 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
2a720 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e  HODS(.  afpIoFin
2a730 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
2a740 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
2a750 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61  tion name */.  a
2a760 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fpIoMethods,    
2a770 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2a780 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2a790 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
2a7a0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
2a7b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
2a7c0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
2a7d0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43  sabled */.  afpC
2a7e0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2a7f0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
2a800 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c  method */.  afpL
2a810 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2a820 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
2a830 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e  ethod */.  afpUn
2a840 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
2a850 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
2a860 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43  method */.  afpC
2a870 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2a880 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ,     /* xCheckR
2a890 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
2a8a0 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
2a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8c0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
2a8d0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
2a8e0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  ./*.** The proxy
2a8f0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
2a900 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68  is a "super-meth
2a910 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65  od" in the sense
2a920 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e   that it.** open
2a930 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65  s secondary file
2a940 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
2a950 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c   the conch and l
2a960 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a  ock files and.**
2a970 20 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20   it uses proxy, 
2a980 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61  dot-file, AFP, a
2a990 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  nd flock() locki
2a9a0 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  ng methods on th
2a9b0 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79  ose.** secondary
2a9c0 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69   files.  For thi
2a9d0 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69  s reason, the di
2a9e0 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c  vision that impl
2a9f0 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20  ements.** proxy 
2aa00 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74  locking is locat
2aa10 65 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20  ed much further 
2aa20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65  down in the file
2aa30 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a  .  But we need.*
2aa40 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e  * to go ahead an
2aa50 64 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c  d define the sql
2aa60 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2aa70 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  and finder funct
2aa80 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79  ion.** for proxy
2aa90 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20   locking here.  
2aaa0 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65  So we forward de
2aab0 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65  clare the I/O me
2aac0 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65  thods..*/.#if de
2aad0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2aae0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2aaf0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2ab00 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2ab10 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
2ab20 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  le*);.static int
2ab30 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74   proxyLock(sqlit
2ab40 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
2ab50 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2ab60 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
2ab70 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74  ile*, int);.stat
2ab80 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63  ic int proxyChec
2ab90 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
2aba0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
2abb0 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  *);.IOMETHODS(. 
2abc0 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20   proxyIoFinder, 
2abd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2abe0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
2abf0 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d  me */.  proxyIoM
2ac00 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2ac10 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
2ac20 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
2ac30 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
2ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac50 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
2ac60 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
2ac70 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c  */.  proxyClose,
2ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ac90 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
2aca0 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20  */.  proxyLock, 
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2acc0 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
2acd0 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c  /.  proxyUnlock,
2ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2acf0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
2ad00 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52  */.  proxyCheckR
2ad10 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f  eservedLock,   /
2ad20 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
2ad30 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2ad40 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
2ad50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2ad60 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
2ad70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73  ).#endif../* nfs
2ad80 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30   lockd on OSX 10
2ad90 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61  .3+ doesn't clea
2ada0 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68  r write locks wh
2adb0 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
2adc0 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66  s set */.#if def
2add0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2ade0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2adf0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
2ae00 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49  OMETHODS(.  nfsI
2ae10 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
2ae20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
2ae30 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
2ae40 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73  /.  nfsIoMethods
2ae50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2ae60 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2ae70 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2ae80 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
2ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aea0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
2aeb0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
2aec0 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20  .  unixClose,   
2aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aee0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2aef0 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
2af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2af10 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
2af20 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20  /.  nfsUnlock,  
2af30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2af40 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2af50 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
2af60 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
2af70 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2af80 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2af90 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2afb0 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
2afc0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
2afd0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2afe0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2aff0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2b000 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22  LE./* .** This "
2b010 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
2b020 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
2b030 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20  ermine the best 
2b040 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
2b050 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74   .** for the dat
2b060 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65  abase file "file
2b070 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20  Path".  It then 
2b080 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69  returns the sqli
2b090 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
2b0a0 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  * object that im
2b0b0 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74  plements that st
2b0c0 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rategy..**.** Th
2b0d0 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58  is is for MacOSX
2b0e0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
2b0f0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2b100 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c  o_methods *autol
2b110 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28  ockIoFinderImpl(
2b120 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
2b130 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e  ilePath,    /* n
2b140 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2b150 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ase file */.  un
2b160 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20  ixFile *pNew    
2b170 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66         /* open f
2b180 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  ile object for t
2b190 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b1a0 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20   */.){.  static 
2b1b0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70  const struct Map
2b1c0 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ping {.    const
2b1d0 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74   char *zFilesyst
2b1e0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
2b1f0 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74   /* Filesystem t
2b200 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ype name */.    
2b210 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2b220 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f  _methods *pMetho
2b230 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72  ds;   /* Appropr
2b240 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  iate locking met
2b250 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b  hod */.  } aMap[
2b260 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73  ] = {.    { "hfs
2b270 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65  ",    &posixIoMe
2b280 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
2b290 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49  ufs",    &posixI
2b2a0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
2b2b0 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70  { "afpfs",  &afp
2b2c0 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2b2d0 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66   { "smbfs",  &af
2b2e0 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  pIoMethods },.  
2b2f0 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e    { "webdav", &n
2b300 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d  olockIoMethods }
2b310 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20  ,.    { 0, 0 }. 
2b320 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73   };.  int i;.  s
2b330 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
2b340 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  nfo;.  struct fl
2b350 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20  ock lockInfo;.. 
2b360 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29   if( !filePath )
2b370 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65  {.    /* If file
2b380 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Path==NULL that 
2b390 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
2b3a0 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e  ling with a tran
2b3b0 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a  sient file.    *
2b3c0 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  * that does not 
2b3d0 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
2b3e0 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
2b3f0 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2b400 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61  s;.  }.  if( sta
2b410 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66  tfs(filePath, &f
2b420 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a  sInfo) != -1 ){.
2b430 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66      if( fsInfo.f
2b440 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f  _flags & MNT_RDO
2b450 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74  NLY ){.      ret
2b460 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
2b470 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  hods;.    }.    
2b480 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d  for(i=0; aMap[i]
2b490 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b  .zFilesystem; i+
2b4a0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
2b4b0 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
2b4c0 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69  typename, aMap[i
2b4d0 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d  ].zFilesystem)==
2b4e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
2b4f0 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74  urn aMap[i].pMet
2b500 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  hods;.      }.  
2b510 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65    }.  }..  /* De
2b520 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64  fault case. Hand
2b530 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68  les, amongst oth
2b540 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a  ers, "nfs"..  **
2b550 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65   Test byte-range
2b560 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74   lock using fcnt
2b570 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  l(). If the call
2b580 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a   succeeds, .  **
2b590 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
2b5a0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
2b5b0 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c  ports POSIX styl
2b5c0 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20  e locks. .  */. 
2b5d0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
2b5e0 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
2b5f0 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
2b600 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
2b610 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
2b620 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
2b630 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
2b640 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c  osFcntl(pNew->h,
2b650 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49   F_GETLK, &lockI
2b660 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20  nfo)!=-1 ) {.   
2b670 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
2b680 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
2b690 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20   "nfs")==0 ){.  
2b6a0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49      return &nfsI
2b6b0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20  oMethods;.    } 
2b6c0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74  else {.      ret
2b6d0 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68  urn &posixIoMeth
2b6e0 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ods;.    }.  }el
2b6f0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
2b700 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
2b710 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63  ;.  }.}.static c
2b720 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2b730 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f  methods .  *(*co
2b740 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  nst autolockIoFi
2b750 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72  nder)(const char
2b760 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61  *,unixFile*) = a
2b770 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
2b780 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  mpl;..#endif /* 
2b790 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2b7a0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2b7b0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2b7c0 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57  E */..#if OS_VXW
2b7d0 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ORKS./*.** This 
2b7e0 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
2b7f0 6e 20 66 6f 72 20 56 78 57 6f 72 6b 73 20 63 68  n for VxWorks ch
2b800 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 70  ecks to see if p
2b810 6f 73 69 78 20 61 64 76 69 73 6f 72 79 0a 2a 2a  osix advisory.**
2b820 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 2e 20   locking works. 
2b830 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65   If it does, the
2b840 6e 20 74 68 61 74 20 69 73 20 77 68 61 74 20 69  n that is what i
2b850 73 20 75 73 65 64 2e 20 20 49 66 20 69 74 20 64  s used.  If it d
2b860 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77 6f 72 6b 2c  oes not.** work,
2b870 20 74 68 65 6e 20 66 61 6c 6c 62 61 63 6b 20 74   then fallback t
2b880 6f 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  o named semaphor
2b890 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74  e locking..*/.st
2b8a0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2b8b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 76  e3_io_methods *v
2b8c0 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d  xworksIoFinderIm
2b8d0 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pl(.  const char
2b8e0 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f   *filePath,    /
2b8f0 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
2b900 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2b910 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
2b920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
2b930 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63   open file objec
2b940 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  t */.){.  struct
2b950 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b   flock lockInfo;
2b960 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74  ..  if( !filePat
2b970 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66  h ){.    /* If f
2b980 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68  ilePath==NULL th
2b990 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  at means we are 
2b9a0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74  dealing with a t
2b9b0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20  ransient file.  
2b9c0 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
2b9d0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
2b9e0 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74  cked. */.    ret
2b9f0 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
2ba00 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  hods;.  }..  /* 
2ba10 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20  Test if fcntl() 
2ba20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64  is supported and
2ba30 20 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65   use POSIX style
2ba40 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68   locks..  ** Oth
2ba50 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b  erwise fall back
2ba60 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65   to the named se
2ba70 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a  maphore method..
2ba80 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
2ba90 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
2baa0 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
2bab0 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
2bac0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
2bad0 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
2bae0 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
2baf0 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
2bb00 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
2bb10 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
2bb20 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70   {.    return &p
2bb30 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
2bb40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2bb50 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73  rn &semIoMethods
2bb60 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63  ;.  }.}.static c
2bb70 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2bb80 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f  methods .  *(*co
2bb90 6e 73 74 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e  nst vxworksIoFin
2bba0 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
2bbb0 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 76 78  ,unixFile*) = vx
2bbc0 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70  worksIoFinderImp
2bbd0 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  l;..#endif /* OS
2bbe0 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a 2f 2a 0a  _VXWORKS */../*.
2bbf0 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74  ** An abstract t
2bc00 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65  ype for a pointe
2bc10 72 20 74 6f 20 61 6e 20 49 4f 20 6d 65 74 68 6f  r to an IO metho
2bc20 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  d finder functio
2bc30 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f  n:.*/.typedef co
2bc40 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2bc50 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72  ethods *(*finder
2bc60 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61  _type)(const cha
2bc70 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a  r*,unixFile*);..
2bc80 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2bc90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bcb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bcc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2bcd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69  *********** sqli
2bcf0 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
2bd00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bd10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
2bd20 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
2bd30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d   contains the im
2bd40 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2bd50 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a  methods on the.*
2bd60 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62  * sqlite3_vfs ob
2bd70 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ject..*/../*.** 
2bd80 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63  Initialize the c
2bd90 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75  ontents of the u
2bda0 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
2bdb0 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
2bdc0 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  pId..*/.static i
2bdd0 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  nt fillInUnixFil
2bde0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
2bdf0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20   *pVfs,      /* 
2be00 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
2be10 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68  bject */.  int h
2be20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2be30 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
2be40 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69  descriptor of fi
2be50 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
2be60 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
2be70 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20  e *pId,      /* 
2be80 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69  Write to the uni
2be90 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
2bea0 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
2beb0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
2bec0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2bed0 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
2bee0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c  ed */.  int ctrl
2bef0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
2bf00 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  /* Zero or more 
2bf10 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65  UNIXFILE_* value
2bf20 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
2bf30 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2bf40 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  ds *pLockingStyl
2bf50 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  e;.  unixFile *p
2bf60 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
2bf70 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20  *)pId;.  int rc 
2bf80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2bf90 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49  assert( pNew->pI
2bfa0 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20  node==NULL );.. 
2bfb0 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f   /* No locking o
2bfc0 63 63 75 72 73 20 69 6e 20 74 65 6d 70 6f 72 61  ccurs in tempora
2bfd0 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73  ry files */.  as
2bfe0 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21  sert( zFilename!
2bff0 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c 61 67 73  =0 || (ctrlFlags
2c000 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f   & UNIXFILE_NOLO
2c010 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20 4f 53 54  CK)!=0 );..  OST
2c020 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20 25  RACE(("OPEN    %
2c030 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46  -3d %s\n", h, zF
2c040 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65  ilename));.  pNe
2c050 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77  w->h = h;.  pNew
2c060 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2c070 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a   pNew->zPath = z
2c080 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e 65 77  Filename;.  pNew
2c090 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 75  ->ctrlFlags = (u
2c0a0 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a 23 69 66  8)ctrlFlags;.#if
2c0b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
2c0c0 5f 53 49 5a 45 3e 30 0a 20 20 70 4e 65 77 2d 3e  _SIZE>0.  pNew->
2c0d0 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73 71  mmapSizeMax = sq
2c0e0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2c0f0 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66  g.szMmap;.#endif
2c100 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75  .  if( sqlite3_u
2c110 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72  ri_boolean(((ctr
2c120 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
2c130 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61  E_URI) ? zFilena
2c140 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 20  me : 0),.       
2c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c160 20 20 20 20 22 70 73 6f 77 22 2c 20 53 51 4c 49      "psow", SQLI
2c170 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  TE_POWERSAFE_OVE
2c180 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70  RWRITE) ){.    p
2c190 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  New->ctrlFlags |
2c1a0 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b  = UNIXFILE_PSOW;
2c1b0 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d  .  }.  if( strcm
2c1c0 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75  p(pVfs->zName,"u
2c1d0 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30 20 29 7b  nix-excl")==0 ){
2c1e0 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
2c1f0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2c200 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20  _EXCL;.  }..#if 
2c210 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65  OS_VXWORKS.  pNe
2c220 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73  w->pId = vxworks
2c230 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65  FindFileId(zFile
2c240 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65  name);.  if( pNe
2c250 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20  w->pId==0 ){.   
2c260 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
2c270 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20  IXFILE_NOLOCK;. 
2c280 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2c290 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  OMEM_BKPT;.  }.#
2c2a0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72  endif..  if( ctr
2c2b0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
2c2c0 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  E_NOLOCK ){.    
2c2d0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20  pLockingStyle = 
2c2e0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2c2f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2c300 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28  LockingStyle = (
2c310 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29  **(finder_type*)
2c320 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28  pVfs->pAppData)(
2c330 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29  zFilename, pNew)
2c340 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
2c350 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2c360 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a  E.    /* Cache z
2c370 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20  Filename in the 
2c380 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
2c390 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b  (AFP and dotlock
2c3a0 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20   override) for. 
2c3b0 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20     ** proxyLock 
2c3c0 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f  activation is po
2c3d0 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70  ssible (remote p
2c3e0 72 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e  roxy is based on
2c3f0 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a   db name).    **
2c400 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69   zFilename remai
2c410 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66  ns valid until f
2c420 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74  ile is closed, t
2c430 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20  o support */.   
2c440 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
2c450 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a  ntext = (void*)z
2c460 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66  Filename;.#endif
2c470 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63  .  }..  if( pLoc
2c480 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f  kingStyle == &po
2c490 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66  sixIoMethods.#if
2c4a0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2c4b0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2c4c0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2c4d0 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69  LE.    || pLocki
2c4e0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49  ngStyle == &nfsI
2c4f0 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a  oMethods.#endif.
2c500 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74    ){.    unixEnt
2c510 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
2c520 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
2c530 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
2c540 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  Inode);.    if( 
2c550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c560 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20  .      /* If an 
2c570 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
2c580 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  n findInodeInfo(
2c590 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ), close the fil
2c5a0 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20  e descriptor.   
2c5b0 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
2c5c0 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73  y, before releas
2c5d0 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66  ing the mutex. f
2c5e0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d  indInodeInfo() m
2c5f0 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a  ay fail.      **
2c600 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
2c610 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
2c620 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c    **   (a) A cal
2c630 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69  l to fstat() fai
2c640 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20  led..      **   
2c650 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69  (b) A malloc fai
2c660 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  led..      **.  
2c670 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20      ** Scenario 
2c680 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63  (b) may only occ
2c690 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  ur if the proces
2c6a0 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20  s is holding no 
2c6b0 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66  other.      ** f
2c6c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2c6d0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
2c6e0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
2c6f0 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a  were other file.
2c700 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
2c710 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c  tors on this fil
2c720 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f  e, then no mallo
2c730 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69  c would be requi
2c740 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2c750 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e  findInodeInfo().
2c760 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2c770 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74  case, it is quit
2c780 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a  e safe to close.
2c790 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20        ** handle 
2c7a0 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61  h - as it is gua
2c7b0 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20  ranteed that no 
2c7c0 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c  posix locks will
2c7d0 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20   be released.   
2c7e0 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73     ** by doing s
2c7f0 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o..      **.    
2c800 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f    ** If scenario
2c810 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20   (a) caused the 
2c820 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67  error then thing
2c830 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66  s are not so saf
2c840 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  e. The.      ** 
2c850 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74  implicit assumpt
2c860 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74  ion here is that
2c870 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c   if fstat() fail
2c880 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e  s, things are in
2c890 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62  .      ** such b
2c8a0 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72  ad shape that dr
2c8b0 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72  opping a lock or
2c8c0 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74   two doesn't mat
2c8d0 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20  ter much..      
2c8e0 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  */.      robust_
2c8f0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2c900 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2c910 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
2c920 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2c930 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c  ();.  }..#if SQL
2c940 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2c950 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
2c960 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
2c970 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2c980 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49  ngStyle == &afpI
2c990 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2c9a0 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75  /* AFP locking u
2c9b0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
2c9c0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
2c9d0 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
2c9e0 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f      ** the afpLo
2c9f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20  ckingContext..  
2ca00 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b    */.    afpLock
2ca10 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
2ca20 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  ;.    pNew->lock
2ca30 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
2ca40 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
2ca50 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43  oc64( sizeof(*pC
2ca60 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  tx) );.    if( p
2ca70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ctx==0 ){.      
2ca80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2ca90 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  M_BKPT;.    }els
2caa0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  e{.      /* NB: 
2cab0 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
2cac0 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
2cad0 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
2cae0 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
2caf0 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
2cb00 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
2cb10 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
2cb20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
2cb30 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
2cb40 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
2cb50 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d  . */.      pCtx-
2cb60 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  >dbPath = zFilen
2cb70 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d  ame;.      pCtx-
2cb80 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20  >reserved = 0;. 
2cb90 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28       srandomdev(
2cba0 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74  );.      unixEnt
2cbb0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  erMutex();.     
2cbc0 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
2cbd0 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
2cbe0 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20  >pInode);.      
2cbf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cc00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
2cc10 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
2cc20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
2cc30 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f  .        robust_
2cc40 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2cc50 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2cc60 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    h = -1;.      
2cc70 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  }.      unixLeav
2cc80 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  eMutex();       
2cc90 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64   .    }.  }.#end
2cca0 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70  if..  else if( p
2ccb0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2ccc0 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
2ccd0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66  s ){.    /* Dotf
2cce0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ile locking uses
2ccf0 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2cd00 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2cd10 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
2cd20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c   ** the dotlockL
2cd30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20  ockingContext . 
2cd40 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
2cd50 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69  zLockFile;.    i
2cd60 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
2cd70 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2cd80 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46  ame!=0 );.    nF
2cd90 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73  ilename = (int)s
2cda0 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
2cdb0 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46   + 6;.    zLockF
2cdc0 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ile = (char *)sq
2cdd0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
2cde0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
2cdf0 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20  f( zLockFile==0 
2ce00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2ce10 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2ce20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ce30 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2ce40 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c  tf(nFilename, zL
2ce50 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f  ockFile, "%s" DO
2ce60 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46  TLOCK_SUFFIX, zF
2ce70 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ilename);.    }.
2ce80 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
2ce90 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b  gContext = zLock
2cea0 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f  File;.  }..#if O
2ceb0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65  S_VXWORKS.  else
2cec0 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
2ced0 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68  le == &semIoMeth
2cee0 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61  ods ){.    /* Na
2cef0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
2cf00 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
2cf10 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
2cf20 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
2cf30 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  * included in th
2cf40 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e semLockingCont
2cf50 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ext.    */.    u
2cf60 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
2cf70 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e  .    rc = findIn
2cf80 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
2cf90 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
2cfa0 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
2cfb0 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e  E_OK) && (pNew->
2cfc0 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55  pInode->pSem==NU
2cfd0 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  LL) ){.      cha
2cfe0 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e  r *zSemName = pN
2cff0 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d  ew->pInode->aSem
2d000 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Name;.      int 
2d010 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  n;.      sqlite3
2d020 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
2d030 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65  THNAME, zSemName
2d040 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20  , "/%s.sem",.   
2d050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d060 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a      pNew->pId->z
2d070 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a  CanonicalName);.
2d080 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20        for( n=1; 
2d090 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b  zSemName[n]; n++
2d0a0 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   ).        if( z
2d0b0 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20  SemName[n]=='/' 
2d0c0 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20  ) zSemName[n] = 
2d0d0 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  '_';.      pNew-
2d0e0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20  >pInode->pSem = 
2d0f0 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d  sem_open(zSemNam
2d100 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36  e, O_CREAT, 0666
2d110 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
2d120 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2d130 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44  em == SEM_FAILED
2d140 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2d150 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2d160 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  PT;.        pNew
2d170 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
2d180 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  me[0] = '\0';.  
2d190 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2d1a0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2d1b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
2d1c0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
2d1d0 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f  (pNew, 0);.#if O
2d1e0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
2d1f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d200 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
2d210 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2d220 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2d230 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20  .    h = -1;.   
2d240 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e   osUnlink(zFilen
2d250 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ame);.    pNew->
2d260 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2d270 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20  XFILE_DELETE;.  
2d280 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
2d290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d2a0 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72      if( h>=0 ) r
2d2b0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2d2c0 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
2d2d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
2d2e0 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f  w->pMethod = pLo
2d2f0 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20  ckingStyle;.    
2d300 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
2d310 0a 20 20 20 20 76 65 72 69 66 79 44 62 46 69 6c  .    verifyDbFil
2d320 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72  e(pNew);.  }.  r
2d330 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2d340 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
2d350 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72  me of a director
2d360 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75  y in which to pu
2d370 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  t temporary file
2d380 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74  s..** If no suit
2d390 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66  able temporary f
2d3a0 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61  ile directory ca
2d3b0 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  n be found, retu
2d3c0 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
2d3d0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
2d3e0 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76  nixTempFileDir(v
2d3f0 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63  oid){.  static c
2d400 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72  onst char *azDir
2d410 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a  s[] = {.     0,.
2d420 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76       0,.     "/v
2d430 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  ar/tmp",.     "/
2d440 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  usr/tmp",.     "
2d450 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 0a  /tmp",.     ".".
2d460 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20    };.  unsigned 
2d470 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 73 74 72  int i = 0;.  str
2d480 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
2d490 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
2d4a0 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f   = sqlite3_temp_
2d4b0 64 69 72 65 63 74 6f 72 79 3b 0a 0a 20 20 69 66  directory;..  if
2d4c0 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61  ( !azDirs[0] ) a
2d4d0 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e  zDirs[0] = geten
2d4e0 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52  v("SQLITE_TMPDIR
2d4f0 22 29 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72  ");.  if( !azDir
2d500 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d  s[1] ) azDirs[1]
2d510 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49   = getenv("TMPDI
2d520 52 22 29 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  R");.  while(1){
2d530 0a 20 20 20 20 69 66 28 20 7a 44 69 72 21 3d 30  .    if( zDir!=0
2d540 0a 20 20 20 20 20 26 26 20 6f 73 53 74 61 74 28  .     && osStat(
2d550 7a 44 69 72 2c 20 26 62 75 66 29 3d 3d 30 0a 20  zDir, &buf)==0. 
2d560 20 20 20 20 26 26 20 53 5f 49 53 44 49 52 28 62      && S_ISDIR(b
2d570 75 66 2e 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20  uf.st_mode).    
2d580 20 26 26 20 6f 73 41 63 63 65 73 73 28 7a 44 69   && osAccess(zDi
2d590 72 2c 20 30 33 29 3d 3d 30 0a 20 20 20 20 29 7b  r, 03)==0.    ){
2d5a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 7a 44  .      return zD
2d5b0 69 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ir;.    }.    if
2d5c0 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 7a 44 69  ( i>=sizeof(azDi
2d5d0 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72  rs)/sizeof(azDir
2d5e0 73 5b 30 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20  s[0]) ) break;. 
2d5f0 20 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73     zDir = azDirs
2d600 5b 69 2b 2b 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  [i++];.  }.  ret
2d610 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2d620 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
2d630 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
2d640 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
2d650 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a   be allocated.**
2d660 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
2d670 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74  process and must
2d680 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
2d690 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a  o hold at least.
2d6a0 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  ** pVfs->mxPathn
2d6b0 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  ame bytes..*/.st
2d6c0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
2d6d0 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
2d6e0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2d6f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2d700 69 72 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74  ir;.  int iLimit
2d710 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 27 73   = 0;..  /* It's
2d720 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
2d730 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
2d740 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
2d750 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
2d760 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
2d770 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
2d780 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
2d790 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
2d7a0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
2d7b0 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
2d7c0 20 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20    zBuf[0] = 0;. 
2d7d0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
2d7e0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
2d7f0 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72  IOERR );..  zDir
2d800 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44   = unixTempFileD
2d810 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72  ir();.  if( zDir
2d820 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2d830 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
2d840 50 50 41 54 48 3b 0a 20 20 64 6f 7b 0a 20 20 20  PPATH;.  do{.   
2d850 20 75 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69   u64 r;.    sqli
2d860 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
2d870 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20  izeof(r), &r);. 
2d880 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e     assert( nBuf>
2d890 32 20 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6e 42  2 );.    zBuf[nB
2d8a0 75 66 2d 32 5d 20 3d 20 30 3b 0a 20 20 20 20 73  uf-2] = 0;.    s
2d8b0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2d8c0 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 2f  nBuf, zBuf, "%s/
2d8d0 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  "SQLITE_TEMP_FIL
2d8e0 45 5f 50 52 45 46 49 58 22 25 6c 6c 78 25 63 22  E_PREFIX"%llx%c"
2d8f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d900 20 20 20 20 20 20 20 7a 44 69 72 2c 20 72 2c 20         zDir, r, 
2d910 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66  0);.    if( zBuf
2d920 5b 6e 42 75 66 2d 32 5d 21 3d 30 20 7c 7c 20 28  [nBuf-2]!=0 || (
2d930 69 4c 69 6d 69 74 2b 2b 29 3e 31 30 20 29 20 72  iLimit++)>10 ) r
2d940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2d950 4f 52 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73  OR;.  }while( os
2d960 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d  Access(zBuf,0)==
2d970 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
2d980 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
2d990 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2d9a0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
2d9b0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2d9c0 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20  )./*.** Routine 
2d9d0 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75  to transform a u
2d9e0 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70  nixFile into a p
2d9f0 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69  roxy-locking uni
2da00 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d  xFile..** Implem
2da10 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  entation in the 
2da20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73  proxy-lock divis
2da30 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79  ion, but used by
2da40 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69   unixOpen().** i
2da50 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
2da60 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73  PROXY_LOCKING is
2da70 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61   defined..*/.sta
2da80 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61  tic int proxyTra
2da90 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75  nsformUnixFile(u
2daa0 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20  nixFile*, const 
2dab0 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  char*);.#endif..
2dac0 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
2dad0 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
2dae0 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
2daf0 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  was opened on th
2db00 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
2db10 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
2db20 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75  al or master-jou
2db30 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74  rnal file) ident
2db40 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d  ified by pathnam
2db50 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20  e.** zPath with 
2db60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20  SQLITE_OPEN_XXX 
2db70 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74  flags matching t
2db80 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74  hose passed as t
2db90 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
2dba0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
2dbb0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75  nction..**.** Su
2dbc0 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  ch a file descri
2dbd0 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69  ptor may exist i
2dbe0 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  f a database con
2dbf0 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73  nection was clos
2dc00 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73  ed.** but the as
2dc10 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65  sociated file de
2dc20 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e  scriptor could n
2dc30 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63  ot be closed bec
2dc40 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  ause some.** oth
2dc50 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
2dc60 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  or open on the s
2dc70 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64  ame file is hold
2dc80 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e  ing a file-lock.
2dc90 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d  .** Refer to com
2dca0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69  ments in the uni
2dcb0 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f  xClose() functio
2dcc0 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68  n and the length
2dcd0 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73  y comment.** des
2dce0 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41  cribing "Posix A
2dcf0 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22  dvisory Locking"
2dd00 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2dd10 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a   this file for .
2dd20 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69  ** further detai
2dd30 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74  ls. Also, ticket
2dd40 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66   #4018..**.** If
2dd50 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65   a suitable file
2dd60 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66   descriptor is f
2dd70 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73  ound, then it is
2dd80 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
2dd90 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65  .** such file de
2dda0 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61  scriptor is loca
2ddb0 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72  ted, -1 is retur
2ddc0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55  ned..*/.static U
2ddd0 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e  nixUnusedFd *fin
2dde0 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73  dReusableFd(cons
2ddf0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69  t char *zPath, i
2de00 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69  nt flags){.  Uni
2de10 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
2de20 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f  ed = 0;..  /* Do
2de30 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20   not search for 
2de40 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
2de50 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77  escriptor on vxw
2de60 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73  orks. Not becaus
2de70 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77  e.  ** vxworks w
2de80 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74  ould not benefit
2de90 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65   from the change
2dea0 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72   (it might, we'r
2deb0 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a  e not sure),.  *
2dec0 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f  * but because no
2ded0 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20   way to test it 
2dee0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  is currently ava
2def0 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65  ilable. It is be
2df00 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74  tter .  ** not t
2df10 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20  o risk breaking 
2df20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20  vxworks support 
2df30 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20  for the sake of 
2df40 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20  such an obscure 
2df50 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20  .  ** feature.  
2df60 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52  */.#if !OS_VXWOR
2df70 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  KS.  struct stat
2df80 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
2df90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
2dfa0 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63  ults of stat() c
2dfb0 61 6c 6c 20 2a 2f 0a 0a 20 20 75 6e 69 78 45 6e  all */..  unixEn
2dfc0 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
2dfd0 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20  * A stat() call 
2dfe0 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72  may fail for var
2dff0 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66  ious reasons. If
2e000 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69   this happens, i
2e010 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74  t is.  ** almost
2e020 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e   certain that an
2e030 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20   open() call on 
2e040 74 68 65 20 73 61 6d 65 20 70 61 74 68 20 77 69  the same path wi
2e050 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20  ll also fail..  
2e060 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  ** For this reas
2e070 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  on, if an error 
2e080 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 73 74  occurs in the st
2e090 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20  at() call here, 
2e0a0 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72  it is.  ** ignor
2e0b0 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74  ed and -1 is ret
2e0c0 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
2e0d0 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70  r will try to op
2e0e0 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20  en a new file.  
2e0f0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  ** descriptor on
2e100 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20   the same path, 
2e110 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e  fail, and return
2e120 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c   an error to SQL
2e130 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ite..  **.  ** E
2e140 76 65 6e 20 69 66 20 61 20 73 75 62 73 65 71 75  ven if a subsequ
2e150 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20  ent open() call 
2e160 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74 68  does succeed, th
2e170 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f  e consequences o
2e180 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63  f.  ** not searc
2e190 68 69 6e 67 20 66 6f 72 20 61 20 72 65 75 73 61  hing for a reusa
2e1a0 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ble file descrip
2e1b0 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65  tor are not dire
2e1c0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 55 6e 75  .  */.  if( nUnu
2e1d0 73 65 64 46 64 3e 30 20 26 26 20 30 3d 3d 6f 73  sedFd>0 && 0==os
2e1e0 53 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74  Stat(zPath, &sSt
2e1f0 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49  at) ){.    unixI
2e200 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
2e210 3b 0a 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ;..    pInode = 
2e220 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  inodeList;.    w
2e230 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
2e240 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e  (pInode->fileId.
2e250 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65  dev!=sStat.st_de
2e260 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v.              
2e270 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65         || pInode
2e280 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 28 75  ->fileId.ino!=(u
2e290 36 34 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29  64)sStat.st_ino)
2e2a0 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64   ){.       pInod
2e2b0 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
2e2c0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
2e2d0 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20   pInode ){.     
2e2e0 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a   UnixUnusedFd **
2e2f0 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70  pp;.      for(pp
2e300 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  =&pInode->pUnuse
2e310 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d  d; *pp && (*pp)-
2e320 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70  >flags!=flags; p
2e330 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
2e340 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  ));.      pUnuse
2e350 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69  d = *pp;.      i
2e360 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
2e370 20 20 20 20 20 20 6e 55 6e 75 73 65 64 46 64 2d        nUnusedFd-
2e380 2d 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d  -;.        *pp =
2e390 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b   pUnused->pNext;
2e3a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e3b0 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
2e3c0 74 65 78 28 29 3b 0a 23 65 6e 64 69 66 20 20 20  tex();.#endif   
2e3d0 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52   /* if !OS_VXWOR
2e3e0 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  KS */.  return p
2e3f0 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Unused;.}../*.**
2e400 20 46 69 6e 64 20 74 68 65 20 6d 6f 64 65 2c 20   Find the mode, 
2e410 75 69 64 20 61 6e 64 20 67 69 64 20 6f 66 20 66  uid and gid of f
2e420 69 6c 65 20 7a 46 69 6c 65 2e 20 0a 2a 2f 0a 73  ile zFile. .*/.s
2e430 74 61 74 69 63 20 69 6e 74 20 67 65 74 46 69 6c  tatic int getFil
2e440 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63  eMode(.  const c
2e450 68 61 72 20 2a 7a 46 69 6c 65 2c 20 20 20 20 20  har *zFile,     
2e460 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2e470 20 6e 61 6d 65 20 2a 2f 0a 20 20 6d 6f 64 65 5f   name */.  mode_
2e480 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20  t *pMode,       
2e490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2e4a0 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 6f  T: Permissions o
2e4b0 66 20 7a 46 69 6c 65 20 2a 2f 0a 20 20 75 69 64  f zFile */.  uid
2e4c0 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20  _t *pUid,       
2e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e4e0 4f 55 54 3a 20 75 69 64 20 6f 66 20 7a 46 69 6c  OUT: uid of zFil
2e4f0 65 2e 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70  e. */.  gid_t *p
2e500 47 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  Gid             
2e510 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2e520 67 69 64 20 6f 66 20 7a 46 69 6c 65 2e 20 2a 2f  gid of zFile. */
2e530 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  .){.  struct sta
2e540 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
2e550 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2e560 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74  of stat() on dat
2e570 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2e580 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2e590 4f 4b 3b 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53  OK;.  if( 0==osS
2e5a0 74 61 74 28 7a 46 69 6c 65 2c 20 26 73 53 74 61  tat(zFile, &sSta
2e5b0 74 29 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65  t) ){.    *pMode
2e5c0 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65   = sStat.st_mode
2e5d0 20 26 20 30 37 37 37 3b 0a 20 20 20 20 2a 70 55   & 0777;.    *pU
2e5e0 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69  id = sStat.st_ui
2e5f0 64 3b 0a 20 20 20 20 2a 70 47 69 64 20 3d 20 73  d;.    *pGid = s
2e600 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20 7d  Stat.st_gid;.  }
2e610 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
2e620 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
2e630 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
2e640 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2e650 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2e660 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  lled by unixOpen
2e670 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  () to determine 
2e680 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73  the unix permiss
2e690 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74  ions.** to creat
2e6a0 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68  e new files with
2e6b0 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  . If no error oc
2e6c0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
2e6d0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2e6e0 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20  .** and a value 
2e6f0 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73  suitable for pas
2e700 73 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72  sing as the thir
2e710 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70  d argument to op
2e720 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74  en(2) is.** writ
2e730 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49  ten to *pMode. I
2e740 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
2e750 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
2e760 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
2e770 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  * returned and t
2e780 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f  he value of *pMo
2e790 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69  de is not modifi
2e7a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73  ed..**.** In mos
2e7b0 74 20 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f  t cases, this ro
2e7c0 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64  utine sets *pMod
2e7d0 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69  e to 0, which wi
2e7e0 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20  ll become.** an 
2e7f0 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f  indication to ro
2e800 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63  bust_open() to c
2e810 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 20 75  reate the file u
2e820 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  sing.** SQLITE_D
2e830 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
2e840 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64  ISSIONS adjusted
2e850 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a   by the umask..*
2e860 2a 20 42 75 74 20 69 66 20 74 68 65 20 66 69 6c  * But if the fil
2e870 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69  e being opened i
2e880 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c  s a WAL or regul
2e890 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ar journal file,
2e8a0 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66   then .** this f
2e8b0 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20  unction queries 
2e8c0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2e8d0 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69  for the permissi
2e8e0 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63  ons on the .** c
2e8f0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74  orresponding dat
2e900 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73  abase file and s
2e910 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68  ets *pMode to th
2e920 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76  is value. Whenev
2e930 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c  er .** possible,
2e940 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c   WAL and journal
2e950 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
2e960 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
2e970 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a  e permissions .*
2e980 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61  * as the associa
2e990 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
2e9a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
2e9b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
2e9c0 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69  3_NAMES option i
2e9d0 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
2e9e0 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
2e9f0 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76  filename is unav
2ea00 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f  ailable.  But 8_
2ea10 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20  3_NAMES is only 
2ea20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20  used for.** FAT 
2ea30 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20  filesystems and 
2ea40 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e  permissions do n
2ea50 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c  ot matter there,
2ea60 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20   so just use.** 
2ea70 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d  the default perm
2ea80 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  issions..*/.stat
2ea90 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74  ic int findCreat
2eaa0 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e  eFileMode(.  con
2eab0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ead0 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f  Path of file (po
2eae0 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72  ssibly) being cr
2eaf0 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66  eated */.  int f
2eb00 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2eb10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
2eb20 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74  ags passed as 4t
2eb30 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f  h argument to xO
2eb40 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f  pen() */.  mode_
2eb50 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20  t *pMode,       
2eb60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2eb70 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  T: Permissions t
2eb80 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68  o open file with
2eb90 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69   */.  uid_t *pUi
2eba0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
2ebb0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69        /* OUT: ui
2ebc0 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20  d to set on the 
2ebd0 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20  file */.  gid_t 
2ebe0 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20  *pGid           
2ebf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2ec00 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20  : gid to set on 
2ec10 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  the file */.){. 
2ec20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2ec30 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2ec40 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
2ec50 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b  */.  *pMode = 0;
2ec60 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20  .  *pUid = 0;.  
2ec70 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28  *pGid = 0;.  if(
2ec80 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45   flags & (SQLITE
2ec90 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45  _OPEN_WAL|SQLITE
2eca0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2ecb0 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  AL) ){.    char 
2ecc0 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  zDb[MAX_PATHNAME
2ecd0 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61  +1];     /* Data
2ece0 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a  base file path *
2ecf0 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20  /.    int nDb;  
2ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ed20 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20   valid bytes in 
2ed30 7a 44 62 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a  zDb */..    /* z
2ed40 50 61 74 68 20 69 73 20 61 20 70 61 74 68 20 74  Path is a path t
2ed50 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e  o a WAL or journ
2ed60 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c  al file. The fol
2ed70 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72  lowing block der
2ed80 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ives.    ** the 
2ed90 70 61 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f  path to the asso
2eda0 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
2edb0 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e  file from zPath.
2edc0 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64   This block hand
2edd0 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  les.    ** the f
2ede0 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20  ollowing naming 
2edf0 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20  conventions:.   
2ee00 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70   **.    **   "<p
2ee10 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e  ath to db>-journ
2ee20 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  al".    **   "<p
2ee30 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a  ath to db>-wal".
2ee40 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2ee50 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e  to db>-journalNN
2ee60 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
2ee70 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a  h to db>-walNN".
2ee80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68      **.    ** wh
2ee90 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69  ere NN is a deci
2eea0 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20  mal number. The 
2eeb0 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65  NN naming scheme
2eec0 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73  s are .    ** us
2eed0 65 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d  ed by the test_m
2eee0 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c  ultiplex.c modul
2eef0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44  e..    */.    nD
2ef00 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  b = sqlite3Strle
2ef10 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20  n30(zPath) - 1; 
2ef20 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74  .    while( zPat
2ef30 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20  h[nDb]!='-' ){. 
2ef40 20 20 20 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61       /* In norma
2ef50 6c 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 65  l operation, the
2ef60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
2ef70 6d 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 63  me will always c
2ef80 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ontain.      ** 
2ef90 61 20 27 2d 27 20 63 68 61 72 61 63 74 65 72 2e  a '-' character.
2efa0 20 20 48 6f 77 65 76 65 72 20 69 6e 20 38 2b 33    However in 8+3
2efb0 20 66 69 6c 65 6e 61 6d 65 20 6d 6f 64 65 2c 20   filename mode, 
2efc0 6f 72 20 69 66 20 61 20 63 6f 72 72 75 70 74 0a  or if a corrupt.
2efd0 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
2efe0 6b 20 6a 6f 75 72 6e 61 6c 20 73 70 65 63 69 66  k journal specif
2eff0 69 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ies a master jou
2f000 72 6e 61 6c 20 77 69 74 68 20 61 20 67 6f 6f 66  rnal with a goof
2f010 79 20 6e 61 6d 65 2c 20 74 68 65 6e 0a 20 20 20  y name, then.   
2f020 20 20 20 2a 2a 20 74 68 65 20 27 2d 27 20 6d 69     ** the '-' mi
2f030 67 68 74 20 62 65 20 6d 69 73 73 69 6e 67 2e 20  ght be missing. 
2f040 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 44 62  */.      if( nDb
2f050 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62  ==0 || zPath[nDb
2f060 5d 3d 3d 27 2e 27 20 29 20 72 65 74 75 72 6e 20  ]=='.' ) return 
2f070 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2f080 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20   nDb--;.    }.  
2f090 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50    memcpy(zDb, zP
2f0a0 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a  ath, nDb);.    z
2f0b0 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a  Db[nDb] = '\0';.
2f0c0 0a 20 20 20 20 72 63 20 3d 20 67 65 74 46 69 6c  .    rc = getFil
2f0d0 65 4d 6f 64 65 28 7a 44 62 2c 20 70 4d 6f 64 65  eMode(zDb, pMode
2f0e0 2c 20 70 55 69 64 2c 20 70 47 69 64 29 3b 0a 20  , pUid, pGid);. 
2f0f0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
2f100 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
2f110 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a  ELETEONCLOSE ){.
2f120 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30      *pMode = 060
2f130 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
2f140 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2f150 45 4e 5f 55 52 49 20 29 7b 0a 20 20 20 20 2f 2a  EN_URI ){.    /*
2f160 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6d 61   If this is a ma
2f170 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2f180 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 77 61   and the file wa
2f190 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 61  s opened using a
2f1a0 20 55 52 49 0a 20 20 20 20 2a 2a 20 66 69 6c 65   URI.    ** file
2f1b0 6e 61 6d 65 2c 20 63 68 65 63 6b 20 66 6f 72 20  name, check for 
2f1c0 74 68 65 20 22 6d 6f 64 65 6f 66 22 20 70 61 72  the "modeof" par
2f1d0 61 6d 65 74 65 72 2e 20 49 66 20 70 72 65 73 65  ameter. If prese
2f1e0 6e 74 2c 20 69 6e 74 65 72 70 72 65 74 0a 20 20  nt, interpret.  
2f1f0 20 20 2a 2a 20 69 74 73 20 76 61 6c 75 65 20 61    ** its value a
2f200 73 20 61 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  s a filename and
2f210 20 74 72 79 20 74 6f 20 63 6f 70 79 20 74 68 65   try to copy the
2f220 20 6d 6f 64 65 2c 20 75 69 64 20 61 6e 64 20 67   mode, uid and g
2f230 69 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  id from.    ** t
2f240 68 61 74 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20  hat file.  */.  
2f250 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
2f260 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  = sqlite3_uri_pa
2f270 72 61 6d 65 74 65 72 28 7a 50 61 74 68 2c 20 22  rameter(zPath, "
2f280 6d 6f 64 65 6f 66 22 29 3b 0a 20 20 20 20 69 66  modeof");.    if
2f290 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ( z ){.      rc 
2f2a0 3d 20 67 65 74 46 69 6c 65 4d 6f 64 65 28 7a 2c  = getFileMode(z,
2f2b0 20 70 4d 6f 64 65 2c 20 70 55 69 64 2c 20 70 47   pMode, pUid, pG
2f2c0 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  id);.    }.  }. 
2f2d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2f2e0 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69  *.** Open the fi
2f2f0 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a  le zPath..** .**
2f300 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65   Previously, the
2f310 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72   SQLite OS layer
2f320 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63   used three func
2f330 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f  tions in place o
2f340 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a  f this.** one:.*
2f350 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
2f360 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
2f370 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
2f380 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
2f390 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
2f3a0 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
2f3b0 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ();.**.** These 
2f3c0 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64  calls correspond
2f3d0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2f3e0 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  g combinations o
2f3f0 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
2f400 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d     ReadWrite() -
2f410 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45  >     (READWRITE
2f420 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20   | CREATE).**   
2f430 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e    ReadOnly()  ->
2f440 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20       (READONLY) 
2f450 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c  .**     OpenExcl
2f460 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44  usive() -> (READ
2f470 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c  WRITE | CREATE |
2f480 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a   EXCLUSIVE).**.*
2f490 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78  * The old OpenEx
2f4a0 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74  clusive() accept
2f4b0 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67  ed a boolean arg
2f4c0 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67  ument - "delFlag
2f4d0 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74  ". If.** true, t
2f4e0 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66  he file was conf
2f4f0 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74  igured to be aut
2f500 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
2f510 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66  ed when the.** f
2f520 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65  ile handle close
2f530 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68  d. To achieve th
2f540 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73  e same effect us
2f550 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a  ing this new .**
2f560 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20   interface, add 
2f570 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  the DELETEONCLOS
2f580 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20  E flag to those 
2f590 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20  specified above 
2f5a0 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c  for .** OpenExcl
2f5b0 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  usive()..*/.stat
2f5c0 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28  ic int unixOpen(
2f5d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2f5e0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
2f5f0 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77  /* The VFS for w
2f600 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65  hich this is the
2f610 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f   xOpen method */
2f620 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2f630 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
2f640 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66  /* Pathname of f
2f650 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ile to be opened
2f660 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
2f670 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
2f680 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
2f690 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20  escriptor to be 
2f6a0 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69  filled in */.  i
2f6b0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2f6c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f6d0 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f  nput flags to co
2f6e0 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e  ntrol the openin
2f6f0 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  g */.  int *pOut
2f700 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
2f710 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c      /* Output fl
2f720 61 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ags returned to 
2f730 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29  SQLite core */.)
2f740 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20  {.  unixFile *p 
2f750 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46  = (unixFile *)pF
2f760 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20  ile;.  int fd = 
2f770 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
2f780 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
2f790 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65  scriptor returne
2f7a0 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  d by open() */. 
2f7b0 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
2f7c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2f7d0 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
2f7e0 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   to open() */.  
2f7f0 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67  int eType = flag
2f800 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f  s&0xFFFFFF00;  /
2f810 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74  * Type of file t
2f820 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
2f830 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  noLock;         
2f840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2f850 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69  ue to omit locki
2f860 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f  ng primitives */
2f870 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2f880 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2f890 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65    /* Function Re
2f8a0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
2f8b0 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 3d 20 30  nt ctrlFlags = 0
2f8c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f8d0 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67   UNIXFILE_* flag
2f8e0 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78  s */..  int isEx
2f8f0 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67  clusive  = (flag
2f900 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2f910 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e  EXCLUSIVE);.  in
2f920 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d  t isDelete     =
2f930 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2f940 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
2f950 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72  OSE);.  int isCr
2f960 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  eate     = (flag
2f970 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2f980 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69  CREATE);.  int i
2f990 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66  sReadonly   = (f
2f9a0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2f9b0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
2f9c0 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20  int isReadWrite 
2f9d0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2f9e0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
2f9f0 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  E);.#if SQLITE_E
2fa00 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2fa10 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f  YLE.  int isAuto
2fa20 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20  Proxy  = (flags 
2fa30 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55  & SQLITE_OPEN_AU
2fa40 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66  TOPROXY);.#endif
2fa50 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2fa60 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
2fa70 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2fa80 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20  _STYLE.  struct 
2fa90 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23  statfs fsInfo;.#
2faa0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63  endif..  /* If c
2fab0 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72  reating a master
2fac0 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f   or main-file jo
2fad0 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63  urnal, this func
2fae0 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20  tion will open. 
2faf0 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72   ** a file-descr
2fb00 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72  iptor on the dir
2fb10 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20  ectory too. The 
2fb20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53  first time unixS
2fb30 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61  ync().  ** is ca
2fb40 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f  lled the directo
2fb50 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
2fb60 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63  or will be fsync
2fb70 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29  ()ed and close()
2fb80 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73 79  d..  */.  int sy
2fb90 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65 61 74  ncDir = (isCreat
2fba0 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65  e && (.        e
2fbb0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2fbc0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
2fbd0 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
2fbe0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2fbf0 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  N_JOURNAL .     
2fc00 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2fc10 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a  _OPEN_WAL.  ));.
2fc20 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
2fc30 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c  t zPath is a NUL
2fc40 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  L pointer, this 
2fc50 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75  function is requ
2fc60 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  ired to open.  *
2fc70 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
2fc80 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66  le. Use this buf
2fc90 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
2fca0 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20   file name in.. 
2fcb0 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e   */.  char zTmpn
2fcc0 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
2fcd0 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  +2];.  const cha
2fce0 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68  r *zName = zPath
2fcf0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
2fd00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74  e following stat
2fd10 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a  ements are true:
2fd20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61   .  **.  **   (a
2fd30 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  ) Exactly one of
2fd40 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61   the READWRITE a
2fd50 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67  nd READONLY flag
2fd60 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61  s must be set, a
2fd70 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69  nd .  **   (b) i
2fd80 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c  f CREATE is set,
2fd90 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20   then READWRITE 
2fda0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
2fdb0 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29  , and.  **   (c)
2fdc0 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73   if EXCLUSIVE is
2fdd0 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
2fde0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
2fdf0 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69  et..  **   (d) i
2fe00 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  f DELETEONCLOSE 
2fe10 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
2fe20 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
2fe30 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
2fe40 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d  ert((isReadonly=
2fe50 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
2fe60 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64  e==0) && (isRead
2fe70 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f  Write || isReado
2fe80 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28  nly));.  assert(
2fe90 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69  isCreate==0 || i
2fea0 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61  sReadWrite);.  a
2feb0 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76  ssert(isExclusiv
2fec0 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
2fed0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65  );.  assert(isDe
2fee0 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  lete==0 || isCre
2fef0 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ate);..  /* The 
2ff00 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f  main DB, main jo
2ff10 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20  urnal, WAL file 
2ff20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  and master journ
2ff30 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20  al are never .  
2ff40 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
2ff50 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72   deleted. Nor ar
2ff60 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70  e they ever temp
2ff70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f  orary files.  */
2ff80 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
2ff90 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
2ffa0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
2ffb0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
2ffc0 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
2ffd0 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
2ffe0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
2fff0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
30000 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
30010 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
30020 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
30030 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
30040 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  R_JOURNAL );.  a
30050 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
30060 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
30070 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
30080 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41  N_WAL );..  /* A
30090 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75  ssert that the u
300a0 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73  pper layer has s
300b0 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66  et one of the "f
300c0 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e  ile-type" flags.
300d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
300e0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
300f0 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c  _MAIN_DB      ||
30100 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
30110 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20  PEN_TEMP_DB .   
30120 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
30130 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
30140 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
30150 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
30160 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  P_JOURNAL .     
30170 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
30180 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
30190 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53  AL   || eType==S
301a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
301b0 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
301c0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
301d0 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
301e0 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53  T_DB || eType==S
301f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
30200 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 63 74   );..  /* Detect
30210 20 61 20 70 69 64 20 63 68 61 6e 67 65 20 61 6e   a pid change an
30220 64 20 72 65 73 65 74 20 74 68 65 20 50 52 4e 47  d reset the PRNG
30230 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 72 61  .  There is a ra
30240 63 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 2a  ce condition.  *
30250 2a 20 68 65 72 65 20 73 75 63 68 20 74 68 61 74  * here such that
30260 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 68 72   two or more thr
30270 65 61 64 73 20 61 6c 6c 20 74 72 79 69 6e 67 20  eads all trying 
30280 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
30290 73 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 61  s at.  ** the sa
302a0 6d 65 20 69 6e 73 74 61 6e 74 20 6d 69 67 68 74  me instant might
302b0 20 61 6c 6c 20 72 65 73 65 74 20 74 68 65 20 50   all reset the P
302c0 52 4e 47 2e 20 20 42 75 74 20 6d 75 6c 74 69 70  RNG.  But multip
302d0 6c 65 20 72 65 73 65 74 73 0a 20 20 2a 2a 20 61  le resets.  ** a
302e0 72 65 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a  re harmless..  *
302f0 2f 0a 20 20 69 66 28 20 72 61 6e 64 6f 6d 6e 65  /.  if( randomne
30300 73 73 50 69 64 21 3d 6f 73 47 65 74 70 69 64 28  ssPid!=osGetpid(
30310 30 29 20 29 7b 0a 20 20 20 20 72 61 6e 64 6f 6d  0) ){.    random
30320 6e 65 73 73 50 69 64 20 3d 20 6f 73 47 65 74 70  nessPid = osGetp
30330 69 64 28 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  id(0);.    sqlit
30340 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c  e3_randomness(0,
30350 30 29 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65  0);.  }..  memse
30360 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  t(p, 0, sizeof(u
30370 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66  nixFile));..  if
30380 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
30390 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a  OPEN_MAIN_DB ){.
303a0 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64      UnixUnusedFd
303b0 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70   *pUnused;.    p
303c0 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
303d0 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66  sableFd(zName, f
303e0 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lags);.    if( p
303f0 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
30400 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64  fd = pUnused->fd
30410 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30420 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c     pUnused = sql
30430 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69  ite3_malloc64(si
30440 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b  zeof(*pUnused));
30450 0a 20 20 20 20 20 20 69 66 28 20 21 70 55 6e 75  .      if( !pUnu
30460 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  sed ){.        r
30470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
30480 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
30490 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50  .    }.    p->pP
304a0 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
304b0 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20 20  d = pUnused;..  
304c0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
304d0 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62  lenames are doub
304e0 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  le-zero terminat
304f0 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e  ed if they are n
30500 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49 73 20 77  ot.    ** URIs w
30510 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20  ith parameters. 
30520 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e   Hence, they can
30530 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73 65   always be passe
30540 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73 71  d into.    ** sq
30550 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
30560 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73  ter(). */.    as
30570 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 53  sert( (flags & S
30580 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
30590 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28  || zName[strlen(
305a0 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  zName)+1]==0 );.
305b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e  .  }else if( !zN
305c0 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ame ){.    /* If
305d0 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20   zName is NULL, 
305e0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
305f0 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  is requesting a 
30600 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  temp file. */.  
30610 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
30620 65 20 26 26 20 21 73 79 6e 63 44 69 72 29 3b 0a  e && !syncDir);.
30630 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74      rc = unixGet
30640 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2d 3e 6d  Tempname(pVfs->m
30650 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 6d 70 6e  xPathname, zTmpn
30660 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
30670 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30680 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
30690 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
306a0 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20  = zTmpname;..   
306b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 64 20 74 65   /* Generated te
306c0 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65  mporary filename
306d0 73 20 61 72 65 20 61 6c 77 61 79 73 20 64 6f 75  s are always dou
306e0 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61  ble-zero termina
306f0 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 75  ted.    ** for u
30700 73 65 20 62 79 20 73 71 6c 69 74 65 33 5f 75 72  se by sqlite3_ur
30710 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a  i_parameter(). *
30720 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e  /.    assert( zN
30730 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  ame[strlen(zName
30740 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  )+1]==0 );.  }..
30750 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74    /* Determine t
30760 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
30770 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
30780 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20  passed to POSIX 
30790 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70  function.  ** op
307a0 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74  en(). These must
307b0 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65   be calculated e
307c0 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73  ven if open() is
307d0 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a   not called, as.
307e0 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65    ** they may be
307f0 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
30800 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  of the file hand
30810 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79 20 74  le and used by t
30820 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20  he .  ** 'conch 
30830 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75  file' locking fu
30840 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e  nctions later on
30850 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65  .  */.  if( isRe
30860 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c  adonly )  openFl
30870 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  ags |= O_RDONLY;
30880 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
30890 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c  te ) openFlags |
308a0 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20  = O_RDWR;.  if( 
308b0 69 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 70  isCreate )    op
308c0 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45  enFlags |= O_CRE
308d0 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c  AT;.  if( isExcl
308e0 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67  usive ) openFlag
308f0 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e  s |= (O_EXCL|O_N
30900 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e  OFOLLOW);.  open
30910 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47  Flags |= (O_LARG
30920 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b  EFILE|O_BINARY);
30930 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ..  if( fd<0 ){.
30940 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d      mode_t openM
30950 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
30960 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73    /* Permissions
30970 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20   to create file 
30980 77 69 74 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f  with */.    uid_
30990 74 20 75 69 64 3b 20 20 20 20 20 20 20 20 20 20  t uid;          
309a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
309b0 72 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65  rid for the file
309c0 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20 67 69   */.    gid_t gi
309d0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
309e0 20 20 20 20 20 20 2f 2a 20 47 72 6f 75 70 69 64        /* Groupid
309f0 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f   for the file */
30a00 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72  .    rc = findCr
30a10 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61  eateFileMode(zNa
30a20 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e  me, flags, &open
30a30 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69 64  Mode, &uid, &gid
30a40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
30a50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30a60 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 50    assert( !p->pP
30a70 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
30a80 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
30a90 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
30aa0 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79  _OPEN_WAL || eTy
30ab0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
30ac0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
30ad0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
30ae0 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20  .    }.    fd = 
30af0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d  robust_open(zNam
30b00 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70  e, openFlags, op
30b10 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54  enMode);.    OST
30b20 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25  RACE(("OPENX   %
30b30 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66  -3d %s 0%o\n", f
30b40 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  d, zName, openFl
30b50 61 67 73 29 29 3b 0a 20 20 20 20 61 73 73 65 72  ags));.    asser
30b60 74 28 20 21 69 73 45 78 63 6c 75 73 69 76 65 20  t( !isExclusive 
30b70 7c 7c 20 28 6f 70 65 6e 46 6c 61 67 73 20 26 20  || (openFlags & 
30b80 4f 5f 43 52 45 41 54 29 21 3d 30 20 29 3b 0a 20  O_CREAT)!=0 );. 
30b90 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
30ba0 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20  rrno!=EISDIR && 
30bb0 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
30bc0 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74       /* Failed t
30bd0 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
30be0 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
30bf0 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d  ccess. Try read-
30c00 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66  only. */.      f
30c10 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45  lags &= ~(SQLITE
30c20 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
30c30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
30c40 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46  TE);.      openF
30c50 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52  lags &= ~(O_RDWR
30c60 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20  |O_CREAT);.     
30c70 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
30c80 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
30c90 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
30ca0 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20  |= O_RDONLY;.   
30cb0 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20     isReadonly = 
30cc0 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f  1;.      fd = ro
30cd0 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
30ce0 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
30cf0 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mode);.    }.   
30d00 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
30d10 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
30d20 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
30d30 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
30d40 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
30d50 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
30d60 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  hed;.    }..    
30d70 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65  /* If this proce
30d80 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73  ss is running as
30d90 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65   root and if cre
30da0 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c  ating a new roll
30db0 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72  back.    ** jour
30dc0 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c  nal or WAL file,
30dd0 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68   set the ownersh
30de0 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ip of the journa
30df0 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20  l or WAL to be. 
30e00 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61     ** the same a
30e10 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  s the original d
30e20 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
30e30 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
30e40 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  (SQLITE_OPEN_WAL
30e50 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
30e60 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20  N_JOURNAL) ){.  
30e70 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e      robustFchown
30e80 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a  (fd, uid, gid);.
30e90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
30ea0 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69  rt( fd>=0 );.  i
30eb0 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
30ec0 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
30ed0 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
30ee0 66 28 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61  f( p->pPrealloca
30ef0 74 65 64 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  tedUnused ){.   
30f00 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65   p->pPreallocate
30f10 64 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  dUnused->fd = fd
30f20 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c  ;.    p->pPreall
30f30 6f 63 61 74 65 64 55 6e 75 73 65 64 2d 3e 66 6c  ocatedUnused->fl
30f40 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
30f50 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  ..  if( isDelete
30f60 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
30f70 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a  KS.    zPath = z
30f80 4e 61 6d 65 3b 0a 23 65 6c 69 66 20 64 65 66 69  Name;.#elif defi
30f90 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 4c 49 4e  ned(SQLITE_UNLIN
30fa0 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 29 0a 20  K_AFTER_CLOSE). 
30fb0 20 20 20 7a 50 61 74 68 20 3d 20 73 71 6c 69 74     zPath = sqlit
30fc0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
30fd0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
30fe0 20 7a 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20   zPath==0 ){.   
30ff0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
31000 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  p, fd, __LINE__)
31010 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
31020 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
31030 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
31040 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65    osUnlink(zName
31050 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
31060 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
31070 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
31080 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65  else{.    p->ope
31090 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
310a0 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  gs;.  }.#endif. 
310b0 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f   .#if defined(__
310c0 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
310d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
310e0 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73  G_STYLE.  if( fs
310f0 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66  tatfs(fd, &fsInf
31100 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) == -1 ){.    
31110 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
31120 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 6f  , errno);.    ro
31130 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
31140 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
31150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
31160 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d  OERR_ACCESS;.  }
31170 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e  .  if (0 == strn
31180 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49  cmp("msdos", fsI
31190 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
311a0 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e  , 5)) {.    ((un
311b0 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
311c0 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
311d0 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
311e0 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20  OS;.  }.  if (0 
311f0 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65 78 66 61  == strncmp("exfa
31200 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74  t", fsInfo.f_fst
31210 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20  ypename, 5)) {. 
31220 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
31230 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c  File)->fsFlags |
31240 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  = SQLITE_FSFLAGS
31250 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23  _IS_MSDOS;.  }.#
31260 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
31270 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  up appropriate c
31280 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66  trlFlags */.  if
31290 28 20 69 73 44 65 6c 65 74 65 20 29 20 20 20 20  ( isDelete )    
312a0 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c              ctrl
312b0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
312c0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28 20  E_DELETE;.  if( 
312d0 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20 20  isReadonly )    
312e0 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c            ctrlFl
312f0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
31300 52 44 4f 4e 4c 59 3b 0a 20 20 6e 6f 4c 6f 63 6b  RDONLY;.  noLock
31310 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45   = eType!=SQLITE
31320 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 20  _OPEN_MAIN_DB;. 
31330 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 20   if( noLock )   
31340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
31350 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
31360 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69  FILE_NOLOCK;.  i
31370 66 28 20 73 79 6e 63 44 69 72 20 29 20 20 20 20  f( syncDir )    
31380 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
31390 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
313a0 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69 66  LE_DIRSYNC;.  if
313b0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
313c0 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74 72 6c  _OPEN_URI ) ctrl
313d0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
313e0 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c 49  E_URI;..#if SQLI
313f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
31400 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49  G_STYLE.#if SQLI
31410 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
31420 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f  LOCKING.  isAuto
31430 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69  Proxy = 1;.#endi
31440 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50 72  f.  if( isAutoPr
31450 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e  oxy && (zPath!=N
31460 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b  ULL) && (!noLock
31470 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e  ) && pVfs->xOpen
31480 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e   ){.    char *en
31490 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28  vforce = getenv(
314a0 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52  "SQLITE_FORCE_PR
314b0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20  OXY_LOCKING");. 
314c0 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20     int useProxy 
314d0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c  = 0;..    /* SQL
314e0 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
314f0 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73  LOCKING==1 means
31500 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73   force always us
31510 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73  e proxy, 0 means
31520 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75   .    ** never u
31530 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d  se proxy, NULL m
31540 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66  eans use proxy f
31550 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  or non-local fil
31560 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20  es only.  */.   
31570 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e   if( envforce!=N
31580 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65  ULL ){.      use
31590 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76  Proxy = atoi(env
315a0 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65  force)>0;.    }e
315b0 6c 73 65 7b 0a 20 20 20 20 20 20 75 73 65 50 72  lse{.      usePr
315c0 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66  oxy = !(fsInfo.f
315d0 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c  _flags&MNT_LOCAL
315e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
315f0 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20   useProxy ){.   
31600 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e     rc = fillInUn
31610 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
31620 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63   pFile, zPath, c
31630 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  trlFlags);.     
31640 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31650 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
31660 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
31670 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
31680 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
31690 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
316a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
316b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
316c0 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
316d0 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
316e0 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
316f0 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
31700 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
31710 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
31720 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
31730 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
31740 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
31750 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
31760 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
31770 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
31780 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
31790 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
317a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
317b0 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20  xClose(pFile);. 
317c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
317d0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
317e0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
317f0 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
31800 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
31810 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 7a 50  .  .  assert( zP
31820 61 74 68 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b  ath==0 || zPath[
31830 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 20 20 7c  0]=='/' .      |
31840 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
31850 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
31860 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
31870 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
31880 4f 55 52 4e 41 4c 20 0a 20 20 29 3b 0a 20 20 72  OURNAL .  );.  r
31890 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
318a0 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69  le(pVfs, fd, pFi
318b0 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46  le, zPath, ctrlF
318c0 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e  lags);..open_fin
318d0 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ished:.  if( rc!
318e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
318f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
31900 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55  ->pPreallocatedU
31910 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65  nused);.  }.  re
31920 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
31930 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69  ** Delete the fi
31940 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20  le at zPath. If 
31950 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75  the dirSync argu
31960 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73  ment is true, fs
31970 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72  ync().** the dir
31980 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
31990 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a  eting the file..
319a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
319b0 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  ixDelete(.  sqli
319c0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
319d0 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e  ,     /* VFS con
319e0 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20  taining this as 
319f0 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68  the xDelete meth
31a00 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
31a10 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
31a20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
31a30 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
31a40 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63  */.  int dirSync
31a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31a60 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63  * If true, fsync
31a70 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  () directory aft
31a80 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65  er deleting file
31a90 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
31aa0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55  = SQLITE_OK;.  U
31ab0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
31ac0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
31ad0 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
31ae0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
31af0 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f  DELETE);.  if( o
31b00 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d  sUnlink(zPath)==
31b10 28 2d 31 29 20 29 7b 0a 20 20 20 20 69 66 28 20  (-1) ){.    if( 
31b20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23 69  errno==ENOENT.#i
31b30 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
31b40 20 20 20 20 20 7c 7c 20 6f 73 41 63 63 65 73 73       || osAccess
31b50 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a 23 65 6e  (zPath,0)!=0.#en
31b60 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  dif.    ){.     
31b70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
31b80 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
31b90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
31ba0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
31bb0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
31bc0 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b  _DELETE, "unlink
31bd0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  ", zPath);.    }
31be0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
31bf0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
31c00 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
31c10 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e  NC.  if( (dirSyn
31c20 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20  c & 1)!=0 ){.   
31c30 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
31c40 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  = osOpenDirector
31c50 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20  y(zPath, &fd);. 
31c60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31c70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
31c80 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28 66 64 2c  ( full_fsync(fd,
31c90 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  0,0) ){.        
31ca0 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
31cb0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
31cc0 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63  IR_FSYNC, "fsync
31cd0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  ", zPath);.     
31ce0 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f   }.      robust_
31cf0 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c  close(0, fd, __L
31d00 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73  INE__);.    }els
31d10 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
31d20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
31d30 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72 63  OPEN );.      rc
31d40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
31d50 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
31d60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31d70 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78  *.** Test the ex
31d80 69 73 74 65 6e 63 65 20 6f 66 20 6f 72 20 61 63  istence of or ac
31d90 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
31da0 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20   of file zPath. 
31db0 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66  The.** test perf
31dc0 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  ormed depends on
31dd0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c   the value of fl
31de0 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ags:.**.**     S
31df0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
31e00 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66  STS: Return 1 if
31e10 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
31e20 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
31e30 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
31e40 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
31e50 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e   file is read an
31e60 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20  d writable..**  
31e70 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
31e80 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72  _READONLY: Retur
31e90 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
31ea0 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a  is readable..**.
31eb0 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  ** Otherwise ret
31ec0 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
31ed0 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28   int unixAccess(
31ee0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
31ef0 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68  NotUsed,   /* Th
31f00 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67  e VFS containing
31f10 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d 65   this xAccess me
31f20 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
31f30 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
31f40 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65    /* Path of the
31f50 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65   file to examine
31f60 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
31f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31f80 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74   What do we want
31f90 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20   to learn about 
31fa0 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20  the zPath file? 
31fb0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
31fc0 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
31fd0 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f  Write result boo
31fe0 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  lean here */.){.
31ff0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32000 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
32010 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
32020 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
32030 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20  ERR_ACCESS; );. 
32040 20 61 73 73 65 72 74 28 20 70 52 65 73 4f 75 74   assert( pResOut
32050 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  !=0 );..  /* The
32060 20 73 70 65 63 20 73 61 79 73 20 74 68 65 72 65   spec says there
32070 20 61 72 65 20 74 68 72 65 65 20 70 6f 73 73 69   are three possi
32080 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 20 66  ble values for f
32090 6c 61 67 73 2e 20 20 42 75 74 20 6f 6e 6c 79 0a  lags.  But only.
320a0 20 20 2a 2a 20 74 77 6f 20 6f 66 20 74 68 65 6d    ** two of them
320b0 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73   are actually us
320c0 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
320d0 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
320e0 43 45 53 53 5f 45 58 49 53 54 53 20 7c 7c 20 66  CESS_EXISTS || f
320f0 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43  lags==SQLITE_ACC
32100 45 53 53 5f 52 45 41 44 57 52 49 54 45 20 29 3b  ESS_READWRITE );
32110 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53  ..  if( flags==S
32120 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
32130 53 54 53 20 29 7b 0a 20 20 20 20 73 74 72 75 63  STS ){.    struc
32140 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
32150 2a 70 52 65 73 4f 75 74 20 3d 20 28 30 3d 3d 6f  *pResOut = (0==o
32160 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75  sStat(zPath, &bu
32170 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a  f) && buf.st_siz
32180 65 3e 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e>0);.  }else{. 
32190 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 6f 73     *pResOut = os
321a0 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 57 5f  Access(zPath, W_
321b0 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b 0a 20 20 7d  OK|R_OK)==0;.  }
321c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
321d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f  _OK;.}../*.**.*/
321e0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6b 46 75  .static int mkFu
321f0 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f  llPathname(.  co
32200 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
32210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32220 20 49 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   Input path */. 
32230 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 20 20 20   char *zOut,    
32240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32250 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
32260 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 20  r */.  int nOut 
32270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32280 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
32290 74 65 64 20 73 69 7a 65 20 6f 66 20 62 75 66 66  ted size of buff
322a0 65 72 20 7a 4f 75 74 20 2a 2f 0a 29 7b 0a 20 20  er zOut */.){.  
322b0 69 6e 74 20 6e 50 61 74 68 20 3d 20 73 71 6c 69  int nPath = sqli
322c0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
322d0 68 29 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d  h);.  int iOff =
322e0 20 30 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b   0;.  if( zPath[
322f0 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 69  0]!='/' ){.    i
32300 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74  f( osGetcwd(zOut
32310 2c 20 6e 4f 75 74 2d 32 29 3d 3d 30 20 29 7b 0a  , nOut-2)==0 ){.
32320 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
32330 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
32340 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
32350 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29  "getcwd", zPath)
32360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66  ;.    }.    iOff
32370 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
32380 33 30 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7a 4f  30(zOut);.    zO
32390 75 74 5b 69 4f 66 66 2b 2b 5d 20 3d 20 27 2f 27  ut[iOff++] = '/'
323a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 4f 66  ;.  }.  if( (iOf
323b0 66 2b 6e 50 61 74 68 2b 31 29 3e 6e 4f 75 74 20  f+nPath+1)>nOut 
323c0 29 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 69 74 65  ){.    /* SQLite
323d0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 78 46   assumes that xF
323e0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 6e 75  ullPathname() nu
323f0 6c 2d 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65  l-terminates the
32400 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 0a 20   output buffer. 
32410 20 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 69 74     ** even if it
32420 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
32430 72 2e 20 20 2a 2f 0a 20 20 20 20 7a 4f 75 74 5b  r.  */.    zOut[
32440 69 4f 66 66 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  iOff] = '\0';.  
32450 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32460 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
32470 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
32480 72 69 6e 74 66 28 6e 4f 75 74 2d 69 4f 66 66 2c  rintf(nOut-iOff,
32490 20 26 7a 4f 75 74 5b 69 4f 66 66 5d 2c 20 22 25   &zOut[iOff], "%
324a0 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 72 65  s", zPath);.  re
324b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
324c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  }../*.** Turn a 
324d0 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
324e0 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
324f0 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61  thname. The rela
32500 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20  tive path.** is 
32510 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d  stored as a nul-
32520 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
32530 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  g in the buffer 
32540 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a  pointed to by.**
32550 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a   zPath. .**.** z
32560 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  Out points to a 
32570 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
32580 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  st sqlite3_vfs.m
32590 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20  xPathname bytes 
325a0 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73  .** (in this cas
325b0 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e, MAX_PATHNAME 
325c0 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c  bytes). The full
325d0 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  -path is written
325e0 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66   to.** this buff
325f0 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  er before return
32600 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
32610 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e  nt unixFullPathn
32620 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
32630 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
32640 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
32650 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
32660 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
32670 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
32680 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
32690 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
326a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20   */.  int nOut, 
326b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
326d0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
326e0 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
326f0 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  *zOut           
32700 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
32710 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
32720 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56  #if !defined(HAV
32730 45 5f 52 45 41 44 4c 49 4e 4b 29 20 7c 7c 20 21  E_READLINK) || !
32740 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c 53 54  defined(HAVE_LST
32750 41 54 29 0a 20 20 72 65 74 75 72 6e 20 6d 6b 46  AT).  return mkF
32760 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 50 61 74  ullPathname(zPat
32770 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74 29 3b 0a  h, zOut, nOut);.
32780 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 20 3d  #else.  int rc =
32790 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
327a0 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 6e  t nByte;.  int n
327b0 4c 69 6e 6b 20 3d 20 31 3b 20 20 20 20 20 20 20  Link = 1;       
327c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
327d0 65 72 20 6f 66 20 73 79 6d 62 6f 6c 69 63 20 6c  er of symbolic l
327e0 69 6e 6b 73 20 66 6f 6c 6c 6f 77 65 64 20 73 6f  inks followed so
327f0 20 66 61 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   far */.  const 
32800 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a 50 61 74  char *zIn = zPat
32810 68 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74  h;      /* Input
32820 20 70 61 74 68 20 66 6f 72 20 65 61 63 68 20 69   path for each i
32830 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f 70  teration of loop
32840 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c   */.  char *zDel
32850 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
32860 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
32870 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e==MAX_PATHNAME 
32880 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
32890 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
328a0 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
328b0 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
328c0 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
328d0 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
328e0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
328f0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
32900 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
32910 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
32920 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
32930 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
32940 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
32950 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
32960 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
32970 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
32980 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
32990 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
329a0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
329b0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
329c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
329d0 0a 20 20 64 6f 20 7b 0a 0a 20 20 20 20 2f 2a 20  .  do {..    /* 
329e0 43 61 6c 6c 20 73 74 61 74 28 29 20 6f 6e 20 70  Call stat() on p
329f0 61 74 68 20 7a 49 6e 2e 20 53 65 74 20 62 4c 69  ath zIn. Set bLi
32a00 6e 6b 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  nk to true if th
32a10 65 20 70 61 74 68 20 69 73 20 61 20 73 79 6d 62  e path is a symb
32a20 6f 6c 69 63 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b  olic.    ** link
32a30 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
32a40 77 69 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 6e  wise.  */.    in
32a50 74 20 62 4c 69 6e 6b 20 3d 20 30 3b 0a 20 20 20  t bLink = 0;.   
32a60 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
32a70 3b 0a 20 20 20 20 69 66 28 20 6f 73 4c 73 74 61  ;.    if( osLsta
32a80 74 28 7a 49 6e 2c 20 26 62 75 66 29 21 3d 30 20  t(zIn, &buf)!=0 
32a90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  ){.      if( err
32aa0 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20  no!=ENOENT ){.  
32ab0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
32ac0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
32ad0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6c  ANTOPEN_BKPT, "l
32ae0 73 74 61 74 22 2c 20 7a 49 6e 29 3b 0a 20 20 20  stat", zIn);.   
32af0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
32b00 20 20 20 20 20 20 62 4c 69 6e 6b 20 3d 20 53 5f        bLink = S_
32b10 49 53 4c 4e 4b 28 62 75 66 2e 73 74 5f 6d 6f 64  ISLNK(buf.st_mod
32b20 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
32b30 66 28 20 62 4c 69 6e 6b 20 29 7b 0a 20 20 20 20  f( bLink ){.    
32b40 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29 7b    if( zDel==0 ){
32b50 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 20 3d 20  .        zDel = 
32b60 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
32b70 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Out);.        if
32b80 28 20 7a 44 65 6c 3d 3d 30 20 29 20 72 63 20 3d  ( zDel==0 ) rc =
32b90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
32ba0 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  PT;.      }else 
32bb0 69 66 28 20 2b 2b 6e 4c 69 6e 6b 3e 53 51 4c 49  if( ++nLink>SQLI
32bc0 54 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53 20  TE_MAX_SYMLINKS 
32bd0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
32be0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
32bf0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  BKPT;.      }.. 
32c00 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
32c10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32c20 20 20 6e 42 79 74 65 20 3d 20 6f 73 52 65 61 64    nByte = osRead
32c30 6c 69 6e 6b 28 7a 49 6e 2c 20 7a 44 65 6c 2c 20  link(zIn, zDel, 
32c40 6e 4f 75 74 2d 31 29 3b 0a 20 20 20 20 20 20 20  nOut-1);.       
32c50 20 69 66 28 20 6e 42 79 74 65 3c 30 20 29 7b 0a   if( nByte<0 ){.
32c60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
32c70 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
32c80 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
32c90 2c 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 7a 49  , "readlink", zI
32ca0 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
32cb0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
32cc0 20 7a 44 65 6c 5b 30 5d 21 3d 27 2f 27 20 29 7b   zDel[0]!='/' ){
32cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
32ce0 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
32cf0 66 6f 72 28 6e 20 3d 20 73 71 6c 69 74 65 33 53  for(n = sqlite3S
32d00 74 72 6c 65 6e 33 30 28 7a 49 6e 29 3b 20 6e 3e  trlen30(zIn); n>
32d10 30 20 26 26 20 7a 49 6e 5b 6e 2d 31 5d 21 3d 27  0 && zIn[n-1]!='
32d20 2f 27 3b 20 6e 2d 2d 29 3b 0a 20 20 20 20 20 20  /'; n--);.      
32d30 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 2b        if( nByte+
32d40 6e 2b 31 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20  n+1>nOut ){.    
32d50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
32d60 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
32d70 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
32d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32d90 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 7a        memmove(&z
32da0 44 65 6c 5b 6e 5d 2c 20 7a 44 65 6c 2c 20 6e 42  Del[n], zDel, nB
32db0 79 74 65 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  yte+1);.        
32dc0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 65        memcpy(zDe
32dd0 6c 2c 20 7a 49 6e 2c 20 6e 29 3b 0a 20 20 20 20  l, zIn, n);.    
32de0 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20            nByte 
32df0 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  += n;.          
32e00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
32e10 20 20 20 20 20 20 20 20 20 20 7a 44 65 6c 5b 6e            zDel[n
32e20 42 79 74 65 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  Byte] = '\0';.  
32e30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
32e40 0a 20 20 20 20 20 20 7a 49 6e 20 3d 20 7a 44 65  .      zIn = zDe
32e50 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  l;.    }..    as
32e60 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
32e70 5f 4f 4b 20 7c 7c 20 7a 49 6e 21 3d 7a 4f 75 74  _OK || zIn!=zOut
32e80 20 7c 7c 20 7a 49 6e 5b 30 5d 3d 3d 27 2f 27 20   || zIn[0]=='/' 
32e90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
32ea0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 49 6e 21  QLITE_OK && zIn!
32eb0 3d 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72  =zOut ){.      r
32ec0 63 20 3d 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61  c = mkFullPathna
32ed0 6d 65 28 7a 49 6e 2c 20 7a 4f 75 74 2c 20 6e 4f  me(zIn, zOut, nO
32ee0 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ut);.    }.    i
32ef0 66 28 20 62 4c 69 6e 6b 3d 3d 30 20 29 20 62 72  f( bLink==0 ) br
32f00 65 61 6b 3b 0a 20 20 20 20 7a 49 6e 20 3d 20 7a  eak;.    zIn = z
32f10 4f 75 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  Out;.  }while( r
32f20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
32f30 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
32f40 7a 44 65 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  zDel);.  return 
32f50 72 63 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20  rc;.#endif   /* 
32f60 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 20 26 26  HAVE_READLINK &&
32f70 20 48 41 56 45 5f 4c 53 54 41 54 20 2a 2f 0a 7d   HAVE_LSTAT */.}
32f80 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
32f90 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
32fa0 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
32fb0 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
32fc0 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
32fd0 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
32fe0 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
32ff0 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
33000 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
33010 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
33020 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c  ibrary..*/.#incl
33030 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74  ude <dlfcn.h>.st
33040 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44  atic void *unixD
33050 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
33060 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73  s *NotUsed, cons
33070 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
33080 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
33090 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
330a0 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e  .  return dlopen
330b0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44  (zFilename, RTLD
330c0 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42  _NOW | RTLD_GLOB
330d0 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  AL);.}../*.** SQ
330e0 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
330f0 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61  function immedia
33100 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c  tely after a cal
33110 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29  l to unixDlSym()
33120 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65   or.** unixDlOpe
33130 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72  n() fails (retur
33140 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  ns a null pointe
33150 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65  r). If a more de
33160 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20  tailed error.** 
33170 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c  message is avail
33180 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74  able, it is writ
33190 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20  ten to zBufOut. 
331a0 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73  If no error mess
331b0 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  age.** is availa
331c0 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20  ble, zBufOut is 
331d0 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20  left unmodified 
331e0 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20  and SQLite uses 
331f0 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72  a default.** err
33200 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73  or message..*/.s
33210 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
33220 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
33230 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
33240 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
33250 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  fOut){.  const c
33260 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55  har *zErr;.  UNU
33270 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
33280 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e  tUsed);.  unixEn
33290 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45  terMutex();.  zE
332a0 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a  rr = dlerror();.
332b0 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
332c0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
332d0 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  tf(nBuf, zBufOut
332e0 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20  , "%s", zErr);. 
332f0 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
33300 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20  tex();.}.static 
33310 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d  void (*unixDlSym
33320 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
33330 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20  tUsed, void *p, 
33340 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29  const char*zSym)
33350 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20  )(void){.  /* . 
33360 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65   ** GCC with -pe
33370 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61  dantic-errors sa
33380 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73  ys that C90 does
33390 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69   not allow a voi
333a0 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61  d* to be.  ** ca
333b0 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  st into a pointe
333c0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
333d0 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69    And yet the li
333e0 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f  brary dlsym() ro
333f0 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72  utine.  ** retur
33400 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68  ns a void* which
33410 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
33420 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
33430 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77  on.  So how do w
33440 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d  e.  ** use dlsym
33450 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  () with -pedanti
33460 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20  c-errors?.  **. 
33470 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62   ** Variable x b
33480 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20  elow is defined 
33490 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  to be a pointer 
334a0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61  to a function ta
334b0 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65  king.  ** parame
334c0 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63  ters void* and c
334d0 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72  onst char* and r
334e0 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74  eturning a point
334f0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
33500 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61  ..  ** We initia
33510 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e  lize x by assign
33520 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72  ing it a pointer
33530 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20   to the dlsym() 
33540 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28  function..  ** (
33550 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  That assignment 
33560 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e  requires a cast.
33570 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20  )  Then we call 
33580 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  the function tha
33590 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20  t.  ** x points 
335a0 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  to.  .  **.  ** 
335b0 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64  This work-around
335c0 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20   is unlikely to 
335d0 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f  work correctly o
335e0 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65  n any system whe
335f0 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c  re.  ** you real
33600 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61  ly cannot cast a
33610 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
33620 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42  r into void*.  B
33630 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a  ut then, on the.
33640 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c    ** other hand,
33650 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f   dlsym() will no
33660 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61  t work on such a
33670 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20   system either, 
33680 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  so we have.  ** 
33690 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20  not really lost 
336a0 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  anything..  */. 
336b0 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69   void (*(*x)(voi
336c0 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
336d0 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44  (void);.  UNUSED
336e0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
336f0 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64  ed);.  x = (void
33700 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  (*(*)(void*,cons
33710 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29  t char*))(void))
33720 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20  dlsym;.  return 
33730 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d  (*x)(p, zSym);.}
33740 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
33750 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  xDlClose(sqlite3
33760 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
33770 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
33780 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
33790 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c  R(NotUsed);.  dl
337a0 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a  close(pHandle);.
337b0 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
337c0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
337d0 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
337e0 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
337f0 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a  e unixDlOpen  0.
33800 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
33810 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
33820 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a  e unixDlSym   0.
33830 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
33840 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
33850 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66  /*.** Write nBuf
33860 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
33870 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70   data to the sup
33880 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75  plied buffer zBu
33890 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
338a0 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28   unixRandomness(
338b0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
338c0 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20  Used, int nBuf, 
338d0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55  char *zBuf){.  U
338e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
338f0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65  NotUsed);.  asse
33900 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e  rt((size_t)nBuf>
33910 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29  =(sizeof(time_t)
33920 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a  +sizeof(int)));.
33930 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f  .  /* We have to
33940 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66   initialize zBuf
33950 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67   to prevent valg
33960 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74  rind from report
33970 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e  ing.  ** errors.
33980 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73    The reports is
33990 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64  sued by valgrind
339a0 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d   are incorrect -
339b0 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70   we would.  ** p
339c0 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72  refer that the r
339d0 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63  andomness be inc
339e0 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67  reased by making
339f0 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a   use of the.  **
33a00 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
33a10 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62  pace in zBuf - b
33a20 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f  ut valgrind erro
33a30 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79  rs tend to worry
33a40 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73  .  ** some users
33a50 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61  .  Rather than a
33a60 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65  rgue, it seems e
33a70 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e  asier just to in
33a80 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68  itialize.  ** th
33a90 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e  e whole array an
33aa0 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69  d silence valgri
33ab0 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  nd, even if that
33ac0 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64   means less rand
33ad0 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74  omness.  ** in t
33ae0 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a  he random seed..
33af0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
33b00 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69  esting, initiali
33b10 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a  zing zBuf[] to z
33b20 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f  ero is all we do
33b30 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20  .  That means.  
33b40 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79  ** that we alway
33b50 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  s use the same r
33b60 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71  andom number seq
33b70 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b  uence.  This mak
33b80 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74  es the.  ** test
33b90 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20  s repeatable..  
33ba0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  */.  memset(zBuf
33bb0 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72 61  , 0, nBuf);.  ra
33bc0 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73  ndomnessPid = os
33bd0 47 65 74 70 69 64 28 30 29 3b 20 20 0a 23 69 66  Getpid(0);  .#if
33be0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
33bf0 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69 6e  _TEST) && !defin
33c00 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ed(SQLITE_OMIT_R
33c10 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20 7b 0a 20  ANDOMNESS).  {. 
33c20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b 0a     int fd, got;.
33c30 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
33c40 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64  open("/dev/urand
33c50 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30  om", O_RDONLY, 0
33c60 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
33c70 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20  ){.      time_t 
33c80 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74  t;.      time(&t
33c90 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
33ca0 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66  zBuf, &t, sizeof
33cb0 28 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (t));.      memc
33cc0 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28  py(&zBuf[sizeof(
33cd0 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73 73  t)], &randomness
33ce0 50 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64  Pid, sizeof(rand
33cf0 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20 20  omnessPid));.   
33d00 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
33d10 66 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e 64  f(t)+sizeof(rand
33d20 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69 7a  omnessPid)<=(siz
33d30 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20  e_t)nBuf );.    
33d40 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28    nBuf = sizeof(
33d50 74 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e 64  t) + sizeof(rand
33d60 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20 20  omnessPid);.    
33d70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b  }else{.      do{
33d80 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64   got = osRead(fd
33d90 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d  , zBuf, nBuf); }
33da0 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20  while( got<0 && 
33db0 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
33dc0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
33dd0 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(0, fd, __LINE
33de0 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  __);.    }.  }.#
33df0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e  endif.  return n
33e00 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  Buf;.}.../*.** S
33e10 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
33e20 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
33e30 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
33e40 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68  ime slept..** Th
33e50 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
33e60 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
33e70 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74  oseconds we want
33e80 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68   to sleep..** Th
33e90 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
33ea0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
33eb0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20  microseconds of 
33ec0 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a  sleep actually.*
33ed0 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  * requested from
33ee0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
33ef0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
33f00 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68  , a number which
33f10 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65  .** might be gre
33f20 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
33f30 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65  al to the argume
33f40 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73  nt, but not less
33f50 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67  .** than the arg
33f60 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
33f70 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73   int unixSleep(s
33f80 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
33f90 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  sed, int microse
33fa0 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56  conds){.#if OS_V
33fb0 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
33fc0 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20  timespec sp;..  
33fd0 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72  sp.tv_sec = micr
33fe0 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30  oseconds / 10000
33ff0 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63  00;.  sp.tv_nsec
34000 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
34010 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30   % 1000000) * 10
34020 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28  00;.  nanosleep(
34030 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e  &sp, NULL);.  UN
34040 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
34050 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
34060 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
34070 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
34080 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41  VE_USLEEP) && HA
34090 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65  VE_USLEEP.  usle
340a0 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  ep(microseconds)
340b0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
340c0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
340d0 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
340e0 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  onds;.#else.  in
340f0 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63  t seconds = (mic
34100 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39  roseconds+999999
34110 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65  )/1000000;.  sle
34120 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  ep(seconds);.  U
34130 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
34140 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
34150 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30  rn seconds*10000
34160 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  00;.#endif.}../*
34170 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
34180 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
34190 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
341a0 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
341b0 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
341c0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
341d0 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
341e0 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
341f0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
34200 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
34210 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
34220 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
34230 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
34240 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
34250 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
34260 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
34270 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
34280 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
34290 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
342a0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
342b0 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
342c0 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
342d0 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
342e0 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  Now.** the curre
342f0 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
34300 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
34310 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
34320 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a  _400_000.  In.**
34330 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72   other words, wr
34340 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20  ite into *piNow 
34350 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
34360 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  lliseconds since
34370 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65   the Julian.** e
34380 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20  poch of noon in 
34390 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
343a0 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
343b0 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  .C according to 
343c0 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63  the.** proleptic
343d0 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e   Gregorian calen
343e0 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  dar..**.** On su
343f0 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51  ccess, return SQ
34400 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e  LITE_OK.  Return
34410 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
34420 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
34430 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  te .** cannot be
34440 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
34450 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
34460 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
34470 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
34480 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
34490 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63  piNow){.  static
344a0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
344b0 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
344c0 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
344d0 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
344e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
344f0 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69  ITE_OK;.#if defi
34500 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20  ned(NO_GETTOD). 
34510 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d   time_t t;.  tim
34520 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  e(&t);.  *piNow 
34530 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ((sqlite3_int6
34540 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78  4)t)*1000 + unix
34550 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f  Epoch;.#elif OS_
34560 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
34570 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a   timespec sNow;.
34580 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28    clock_gettime(
34590 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20  CLOCK_REALTIME, 
345a0 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77  &sNow);.  *piNow
345b0 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
345c0 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
345d0 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
345e0 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30   sNow.tv_nsec/10
345f0 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73  00000;.#else.  s
34600 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e  truct timeval sN
34610 6f 77 3b 0a 20 20 28 76 6f 69 64 29 67 65 74 74  ow;.  (void)gett
34620 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20  imeofday(&sNow, 
34630 30 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 66  0);  /* Cannot f
34640 61 69 6c 20 67 69 76 65 6e 20 76 61 6c 69 64 20  ail given valid 
34650 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 2a  arguments */.  *
34660 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63  piNow = unixEpoc
34670 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65  h + 1000*(sqlite
34680 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f  3_int64)sNow.tv_
34690 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73  sec + sNow.tv_us
346a0 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a  ec/1000;.#endif.
346b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
346c0 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
346d0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
346e0 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
346f0 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
34700 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
34710 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
34720 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
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 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
34760 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34770 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a  _DEPRECATED./*.*
34780 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
34790 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
347a0 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
347b0 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
347c0 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
347d0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
347e0 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
347f0 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
34800 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
34810 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
34820 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
34830 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
34840 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
34850 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73  nixCurrentTime(s
34860 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
34870 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  sed, double *prN
34880 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ow){.  sqlite3_i
34890 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e  nt64 i = 0;.  in
348a0 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50  t rc;.  UNUSED_P
348b0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
348c0 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75  );.  rc = unixCu
348d0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30  rrentTimeInt64(0
348e0 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  , &i);.  *prNow 
348f0 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a  = i/86400000.0;.
34900 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
34910 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e  else.# define un
34920 69 78 43 75 72 72 65 6e 74 54 69 6d 65 20 30 0a  ixCurrentTime 0.
34930 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
34940 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  e xGetLastError(
34950 29 20 6d 65 74 68 6f 64 20 69 73 20 64 65 73 69  ) method is desi
34960 67 6e 65 64 20 74 6f 20 72 65 74 75 72 6e 20 61  gned to return a
34970 20 62 65 74 74 65 72 0a 2a 2a 20 6c 6f 77 2d 6c   better.** low-l
34980 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61  evel error messa
34990 67 65 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e  ge when operatin
349a0 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d  g-system problem
349b0 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72  s come up.** dur
349c0 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61  ing SQLite opera
349d0 74 69 6f 6e 2e 20 20 4f 6e 6c 79 20 74 68 65 20  tion.  Only the 
349e0 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63  integer return c
349f0 6f 64 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ode is currently
34a00 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61  .** used..*/.sta
34a10 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c  tic int unixGetL
34a20 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
34a30 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
34a40 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61  nt NotUsed2, cha
34a50 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20  r *NotUsed3){.  
34a60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
34a70 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55  (NotUsed);.  UNU
34a80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
34a90 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45  tUsed2);.  UNUSE
34aa0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
34ab0 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed3);.  return 
34ac0 65 72 72 6e 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  errno;.}.../*.**
34ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34ae0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71  ****** End of sq
34af0 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
34b00 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
34b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
34b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
34b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
34bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
34be0 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  Proxy Locking **
34bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
34c10 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69  *.** Proxy locki
34c20 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f  ng is a "uber-lo
34c30 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e  cking-method" in
34c40 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74   this sense:  It
34c50 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68   uses the.** oth
34c60 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  er locking metho
34c70 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20  ds on secondary 
34c80 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f  lock files.  Pro
34c90 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a  xy locking is a.
34ca0 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76  ** meta-layer ov
34cb0 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72  er top of the pr
34cc0 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20  imitive locking 
34cd0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76  implemented abov
34ce0 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20  e.  For.** this 
34cf0 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69  reason, the divi
34d00 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d  sion that implem
34d10 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f  ents of proxy lo
34d20 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65  cking is deferre
34d30 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20  d.** until late 
34d40 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72  in the file (her
34d50 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20  e) after all of 
34d60 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65  the other I/O me
34d70 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65  thods have.** be
34d80 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20  en defined - so 
34d90 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69  that the primiti
34da0 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  ve locking metho
34db0 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ds are available
34dc0 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20  .** as services 
34dd0 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65  to help with the
34de0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
34df0 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
34e00 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  ..**.****.**.** 
34e10 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  The default lock
34e20 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53  ing schemes in S
34e30 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72  QLite use byte-r
34e40 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ange locks on th
34e50 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
34e60 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65  le to coordinate
34e70 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e   safe, concurren
34e80 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  t access by mult
34e90 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  iple readers.** 
34ea0 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74  and writers [htt
34eb0 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c  p://sqlite.org/l
34ec0 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20  ockingv3.html]. 
34ed0 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c   The five file l
34ee0 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  ocking.** states
34ef0 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44   (UNLOCKED, PEND
34f00 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53  ING, SHARED, RES
34f10 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45  ERVED, EXCLUSIVE
34f20 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
34f30 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65  d.** as POSIX re
34f40 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73  ad & write locks
34f50 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20   over fixed set 
34f60 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69  of locations (vi
34f70 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20  a fsctl),.** on 
34f80 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79  AFP and SMB only
34f90 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d   exclusive byte-
34fa0 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
34fb0 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73  available via fs
34fc0 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57  ctl.** with _IOW
34fd0 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63  R('z', 23, struc
34fe0 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
34ff0 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65  B2) to track the
35000 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a   same 5 states..
35010 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61  ** To simulate a
35020 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20   F_RDLCK on the 
35030 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e  shared range, on
35040 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20   AFP a randomly 
35050 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72  selected.** addr
35060 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65  ess in the share
35070 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e  d range is taken
35080 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f   for a SHARED lo
35090 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a  ck, the entire.*
350a0 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  * shared range i
350b0 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45  s taken for an E
350c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a  XCLUSIVE lock):.
350d0 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49  **.**      PENDI
350e0 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30  NG_BYTE        0
350f0 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20  x40000000.**    
35100 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20    RESERVED_BYTE 
35110 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31        0x40000001
35120 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f  .**      SHARED_
35130 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34  RANGE        0x4
35140 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30  0000002 -> 0x400
35150 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73  00200.**.** This
35160 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74   works well on t
35170 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
35180 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20  stem, but shows 
35190 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a  a nearly 100x.**
351a0 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61   slowdown in rea
351b0 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e  d performance on
351c0 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65   AFP because the
351d0 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61   AFP client disa
351e0 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64  bles.** the read
351f0 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65   cache when byte
35200 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
35210 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c   present.  Enabl
35220 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20  ing the read.** 
35230 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20  cache exposes a 
35240 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
35250 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20  problem that is 
35260 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f  present on all O
35270 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64  S X.** supported
35280 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79   network file sy
35290 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20  stems.  NFS and 
352a0 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65  AFP both observe
352b0 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f   the.** close-to
352c0 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20  -open semantics 
352d0 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63  for ensuring cac
352e0 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20  he coherency.** 
352f0 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72  [http://nfs.sour
35300 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71  ceforge.net/#faq
35310 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73  _a8], which does
35320 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79   not effectively
35330 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20  .** address the 
35340 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72  requirements for
35350 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61   concurrent data
35360 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d  base access by m
35370 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65  ultiple.** reade
35380 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a  rs and writers.*
35390 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61  * [http://www.na
353a0 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d  bble.com/SQLite-
353b0 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68  on-NFS-cache-coh
353c0 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30  erency-td1565570
353d0 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54  1.html]..**.** T
353e0 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65  o address the pe
353f0 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61  rformance and ca
35400 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73  che coherency is
35410 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65  sues, proxy file
35420 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e   locking.** chan
35430 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61  ges the way data
35440 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63  base access is c
35450 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d  ontrolled by lim
35460 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20  iting access to 
35470 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74  a.** single host
35480 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d   at a time and m
35490 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  oving file locks
354a0 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61   off of the data
354b0 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  base file.** and
354c0 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69   onto a proxy fi
354d0 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  le on the local 
354e0 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a  file system.  .*
354f0 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72  *.**.** Using pr
35500 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d  oxy locks.** ---
35510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
35520 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a  *.** C APIs.**.*
35530 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
35540 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
35550 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  me, SQLITE_FCNTL
35560 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
35570 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  LE,.**          
35580 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70 72               <pr
35590 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75  oxy_path> | ":au
355a0 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74  to:");.**  sqlit
355b0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
355c0 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49  db, dbname, SQLI
355d0 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43  TE_FCNTL_GET_LOC
355e0 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20  KPROXYFILE,.**  
355f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35600 20 20 20 20 20 26 3c 70 72 6f 78 79 5f 70 61 74       &<proxy_pat
35610 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51  h>);.**.**.** SQ
35620 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20  L pragmas.**.** 
35630 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
35640 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
35650 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20  le=<proxy_path> 
35660 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41  | :auto:.**  PRA
35670 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
35680 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a  ock_proxy_file.*
35690 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20  *.** Specifying 
356a0 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74  ":auto:" means t
356b0 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20  hat if there is 
356c0 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74  a conch file wit
356d0 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20  h a matching.** 
356e0 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74  host ID in it, t
356f0 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e  he proxy path in
35700 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
35710 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74  will be used, ot
35720 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f  herwise.** a pro
35730 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e  xy path based on
35740 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70   the user's temp
35750 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e   dir.** (via con
35760 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
35770 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e  USER_TEMP_DIR,..
35780 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64  .)) will be used
35790 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75   and the.** actu
357a0 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61  al proxy file na
357b0 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  me is generated 
357c0 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e  from the name an
357d0 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a  d path of the.**
357e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
357f0 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
35800 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61  .**       For da
35810 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73  tabase path "/Us
35820 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a  ers/me/foo.db" .
35830 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63  **       The loc
35840 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22  k path will be "
35850 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70  <tmpdir>/sqlitep
35860 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f  locks/_Users_me_
35870 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a  foo.db:auto:").*
35880 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b  *.** Once a lock
35890 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67   proxy is config
358a0 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62  ured for a datab
358b0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20  ase connection, 
358c0 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65  it can not.** be
358d0 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65   removed, howeve
358e0 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74  r it may be swit
358f0 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  ched to a differ
35900 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76  ent proxy path v
35910 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20  ia.** the above 
35920 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74  APIs (assuming t
35930 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
35940 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20   not being held 
35950 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f  by another.** co
35960 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63  nnection or proc
35970 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ess). .**.**.** 
35980 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  How proxy lockin
35990 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  g works.** -----
359a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
359b0 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66  --.**.** Proxy f
359c0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69  ile locking reli
359d0 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20  es primarily on 
359e0 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69  two new supporti
359f0 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a  ng files: .**.**
35a00 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65     *  conch file
35a10 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73   to limit access
35a20 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
35a30 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c   file to a singl
35a40 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61  e host.**      a
35a50 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20  t a time.**.**  
35a60 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74   *  proxy file t
35a70 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79  o act as a proxy
35a80 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72   for the advisor
35a90 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79  y locks normally
35aa0 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f  .**      taken o
35ab0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
35ac0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66  *.** The conch f
35ad0 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70  ile - to use a p
35ae0 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74  roxy file, sqlit
35af0 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f  e must first "ho
35b00 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a  ld the conch".**
35b10 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71   by taking an sq
35b20 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65  lite-style share
35b30 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
35b40 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e  nch file, readin
35b50 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
35b60 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20  s and comparing 
35b70 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75  the host's uniqu
35b80 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62  e host ID (see b
35b90 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a  elow) and lock.*
35ba0 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61  * proxy path aga
35bb0 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20  inst the values 
35bc0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f  stored in the co
35bd0 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20  nch.  The conch 
35be0 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65  file is.** store
35bf0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  d in the same di
35c00 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64  rectory as the d
35c10 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
35c20 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a   the file name.*
35c30 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61  * is patterned a
35c40 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73  fter the databas
35c50 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22  e file name as "
35c60 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d  .<databasename>-
35c70 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68  conch"..** If th
35c80 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65  e conch file doe
35c90 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20  s not exist, or 
35ca0 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20  its contents do 
35cb0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a  not match the.**
35cc0 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20   host ID and/or 
35cd0 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e  proxy path, then
35ce0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63   the lock is esc
35cf0 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63  alated to an exc
35d00 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61  lusive.** lock a
35d10 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  nd the conch fil
35d20 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70  e contents is up
35d30 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 68  dated with the h
35d40 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79  ost ID and proxy
35d50 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65  .** path and the
35d60 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61   lock is downgra
35d70 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64 20  ded to a shared 
35d80 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20  lock again.  If 
35d90 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20  the conch.** is 
35da0 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20  held by another 
35db0 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61 20  process (with a 
35dc0 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68  shared lock), th
35dd0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
35de0 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e  .** will fail an
35df0 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  d SQLITE_BUSY is
35e00 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
35e10 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
35e20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20  - a single-byte 
35e30 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c  file used for al
35e40 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20  l advisory file 
35e50 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  locks.** normall
35e60 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64  y taken on the d
35e70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20  atabase file.   
35e80 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20  This allows for 
35e90 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  safe sharing.** 
35ea0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
35eb0 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c  file for multipl
35ec0 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  e readers and wr
35ed0 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  iters on the sam
35ee0 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63  e.** host (the c
35ef0 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68 61  onch ensures tha
35f00 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74  t they all use t
35f10 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f  he same local lo
35f20 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20  ck file)..**.** 
35f30 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c  Requesting the l
35f40 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e  ock proxy does n
35f50 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  ot immediately t
35f60 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69  ake the conch, i
35f70 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b  t is.** only tak
35f80 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  en when the firs
35f90 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63  t request to loc
35fa0 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
35fb0 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68  is made.  .** Th
35fc0 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 73  is matches the s
35fd0 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20  emantics of the 
35fe0 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b  traditional lock
35ff0 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68  ing behavior, wh
36000 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61  ere.** opening a
36010 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61   connection to a
36020 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64   database file d
36030 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c  oes not take a l
36040 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68  ock on it..** Th
36050 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  e shared lock an
36060 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64  d an open file d
36070 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61  escriptor are ma
36080 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a  intained until .
36090 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ** the connectio
360a0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
360b0 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a  e is closed. .**
360c0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
360d0 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  le and the lock 
360e0 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64  file are never d
360f0 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f  eleted so they o
36100 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  nly need.** to b
36110 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69  e created the fi
36120 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61 72  rst time they ar
36130 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  e used..**.** Co
36140 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69  nfiguration opti
36150 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ons.** ---------
36160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
36170 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45  **  SQLITE_PREFE
36180 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
36190 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61  **.**       Data
361a0 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73  base files acces
361b0 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c  sed on non-local
361c0 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72   file systems ar
361d0 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d  e.**       autom
361e0 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75  atically configu
361f0 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  red for proxy lo
36200 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65  cking, lock file
36210 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e  s are.**       n
36220 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
36230 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ly using the sam
36240 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20  e logic as.**   
36250 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f      PRAGMA lock_
36260 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74  proxy_file=":aut
36270 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53  o:".**    .**  S
36280 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55  QLITE_PROXY_DEBU
36290 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e  G.**.**       En
362a0 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e  ables the loggin
362b0 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61  g of error messa
362c0 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20  ges during host 
362d0 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20  id file.**      
362e0 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63   retrieval and c
362f0 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c  reation.**.**  L
36300 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a  OCKPROXYDIR.**.*
36310 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65  *       Override
36320 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 69  s the default di
36330 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72  rectory used for
36340 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
36350 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  s that.**       
36360 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61  are named automa
36370 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20  tically via the 
36380 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67  ":auto:" setting
36390 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44  .**.**  SQLITE_D
363a0 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
363b0 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a  PERMISSIONS.**.*
363c0 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73 69  *       Permissi
363d0 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20  ons to use when 
363e0 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65 63  creating a direc
363f0 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67  tory for storing
36400 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f   the.**       lo
36410 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20  ck proxy files, 
36420 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c  only used when L
36430 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e  OCKPROXYDIR is n
36440 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a  ot set..**    .*
36450 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74  *    .** As ment
36460 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65  ioned above, whe
36470 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  n compiled with 
36480 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
36490 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20  OXY_LOCKING,.** 
364a0 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69  setting the envi
364b0 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
364c0 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
364d0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31  OXY_LOCKING to 1
364e0 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70   will.** force p
364f0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
36500 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65 72  be used for ever
36510 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
36520 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a  opened, and 0.**
36530 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f   will force auto
36540 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b  matic proxy lock
36550 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ing to be disabl
36560 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  ed for all datab
36570 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78  ase.** files (ex
36580 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 69 6e 67  plicitly calling
36590 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
365a0 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_SET_LOCKPROXYF
365b0 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a  ILE pragma or.**
365c0 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e   sqlite_file_con
365d0 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20  trol API is not 
365e0 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49  affected by SQLI
365f0 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
36600 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a  OCKING)..*/../*.
36610 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
36620 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
36630 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f  le on MacOSX .*/
36640 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
36650 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
36660 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
36670 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68  _STYLE../*.** Th
36680 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  e proxyLockingCo
36690 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61  ntext has the pa
366a0 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75  th and file stru
366b0 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72  ctures for the r
366c0 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f  emote .** and lo
366d0 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20  cal proxy files 
366e0 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66  in it.*/.typedef
366f0 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63   struct proxyLoc
36700 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78  kingContext prox
36710 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  yLockingContext;
36720 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63  .struct proxyLoc
36730 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
36740 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
36750 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ile;         /* 
36760 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20  Open conch file 
36770 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
36780 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20  FilePath;       
36790 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
367a0 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
367b0 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
367c0 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  roxy;         /*
367d0 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b   Open proxy lock
367e0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
367f0 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20  *lockProxyPath; 
36800 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
36810 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
36820 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
36830 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
36840 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
36850 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
36860 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68  e */.  int conch
36870 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  Held;           
36880 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20      /* 1 if the 
36890 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d  conch is held, -
368a0 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  1 if lockless */
368b0 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20 20  .  int nFails;  
368c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
368d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  /* Number of con
368e0 63 68 20 74 61 6b 69 6e 67 20 66 61 69 6c 75 72  ch taking failur
368f0 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c  es */.  void *ol
36900 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  dLockingContext;
36910 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
36920 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20   lockingcontext 
36930 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c  to restore on cl
36940 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ose */.  sqlite3
36950 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
36960 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20  t *pOldMethod;  
36970 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49     /* Original I
36980 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63  /O methods for c
36990 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a  lose */.};../* .
369a0 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
369b0 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20  k file path for 
369c0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
369d0 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65  dbPath is writte
369e0 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a  n into lPath, .*
369f0 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69  * which must poi
36a00 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69  nt to valid, wri
36a10 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72  table memory lar
36a20 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20  ge enough for a 
36a30 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a  maxLen length.**
36a40 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a   file path. .*/.
36a50 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
36a60 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73  GetLockPath(cons
36a70 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  t char *dbPath, 
36a80 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a  char *lPath, siz
36a90 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69  e_t maxLen){.  i
36aa0 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62  nt len;.  int db
36ab0 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  Len;.  int i;..#
36ac0 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44  ifdef LOCKPROXYD
36ad0 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  IR.  len = strlc
36ae0 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52  py(lPath, LOCKPR
36af0 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b  OXYDIR, maxLen);
36b00 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f  .#else.# ifdef _
36b10 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
36b20 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20  EMP_DIR.  {.    
36b30 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53  if( !confstr(_CS
36b40 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
36b50 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61  P_DIR, lPath, ma
36b60 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f  xLen) ){.      O
36b70 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
36b80 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20  PATH  failed %s 
36b90 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c  errno=%d pid=%d\
36ba0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
36bb0 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c     lPath, errno,
36bc0 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
36bd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
36be0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
36bf0 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
36c00 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
36c10 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d  sqliteplocks", m
36c20 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a  axLen);    .  }.
36c30 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73  # else.  len = s
36c40 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f  trlcpy(lPath, "/
36c50 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  tmp/", maxLen);.
36c60 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  # endif.#endif..
36c70 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d    if( lPath[len-
36c80 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c  1]!='/' ){.    l
36c90 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61  en = strlcat(lPa
36ca0 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29  th, "/", maxLen)
36cb0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72  ;.  }.  .  /* tr
36cc0 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70  ansform the db p
36cd0 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20  ath to a unique 
36ce0 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  cache name */.  
36cf0 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72  dbLen = (int)str
36d00 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66  len(dbPath);.  f
36d10 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e  or( i=0; i<dbLen
36d20 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69   && (i+len+7)<(i
36d30 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b  nt)maxLen; i++){
36d40 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62  .    char c = db
36d50 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61  Path[i];.    lPa
36d60 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d  th[i+len] = (c==
36d70 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a  '/')?'_':c;.  }.
36d80 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27    lPath[i+len]='
36d90 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c  \0';.  strlcat(l
36da0 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20  Path, ":auto:", 
36db0 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41  maxLen);.  OSTRA
36dc0 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48  CE(("GETLOCKPATH
36dd0 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74    proxy lock pat
36de0 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  h=%s pid=%d\n", 
36df0 6c 50 61 74 68 2c 20 6f 73 47 65 74 70 69 64 28  lPath, osGetpid(
36e00 30 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  0)));.  return S
36e10 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
36e20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65  . ** Creates the
36e30 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61   lock file and a
36e40 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63  ny missing direc
36e50 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61  tories in lockPa
36e60 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th. */.static in
36e70 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63  t proxyCreateLoc
36e80 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
36e90 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69   *lockPath){.  i
36ea0 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61  nt i, len;.  cha
36eb0 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e  r buf[MAXPATHLEN
36ec0 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d  ];.  int start =
36ed0 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   0;.  .  assert(
36ee0 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b  lockPath!=NULL);
36ef0 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65  .  /* try to cre
36f00 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65  ate all the inte
36f10 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74 6f  rmediate directo
36f20 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20  ries */.  len = 
36f30 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b  (int)strlen(lock
36f40 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20  Path);.  buf[0] 
36f50 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20  = lockPath[0];. 
36f60 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e   for( i=1; i<len
36f70 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28  ; i++ ){.    if(
36f80 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20   lockPath[i] == 
36f90 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61 72  '/' && (i - star
36fa0 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20 20  t > 0) ){.      
36fb0 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66  /* only mkdir if
36fc0 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e 22   leaf dir != "."
36fd0 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20   or "/" or ".." 
36fe0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d 73  */.      if( i-s
36ff0 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61  tart>2 || (i-sta
37000 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74 61  rt==1 && buf[sta
37010 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75  rt] != '.' && bu
37020 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27 29  f[start] != '/')
37030 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69   .         || (i
37040 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75 66  -start==2 && buf
37050 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26  [start] != '.' &
37060 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20 21  & buf[start+1] !
37070 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20  = '.') ){.      
37080 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20    buf[i]='\0';. 
37090 20 20 20 20 20 20 20 69 66 28 20 6f 73 4d 6b 64         if( osMkd
370a0 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44  ir(buf, SQLITE_D
370b0 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
370c0 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a  PERMISSIONS) ){.
370d0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72            int er
370e0 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  r=errno;.       
370f0 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49     if( err!=EEXI
37100 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ST ) {.         
37110 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45     OSTRACE(("CRE
37120 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49  ATELOCKPATH  FAI
37130 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c  LED creating %s,
37140 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
37150 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70 72          "'%s' pr
37160 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
37170 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   pid=%d\n",.    
37180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37190 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65   buf, strerror(e
371a0 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 6f  rr), lockPath, o
371b0 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20  sGetpid(0)));.  
371c0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
371d0 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20   err;.          
371e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
371f0 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d    }.      start=
37200 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  i+1;.    }.    b
37210 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68  uf[i] = lockPath
37220 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  [i];.  }.  OSTRA
37230 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
37240 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ATH  proxy lock 
37250 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
37260 22 2c 6c 6f 63 6b 50 61 74 68 2c 6f 73 47 65 74  ",lockPath,osGet
37270 70 69 64 28 30 29 29 29 3b 0a 20 20 72 65 74 75  pid(0)));.  retu
37280 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
37290 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20  reate a new VFS 
372a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
372b0 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72  (stored in memor
372c0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
372d0 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
372e0 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20  c) and open the 
372f0 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68  file named "path
37300 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65  " in the file de
37310 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
37320 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
37330 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e  sponsible not on
37340 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74  ly for closing t
37350 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
37360 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66  or.** but also f
37370 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d  or freeing the m
37380 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
37390 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64   with the file d
373a0 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74  escriptor..*/.st
373b0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
373c0 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20  eateUnixFile(.  
373d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
373e0 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61  th,        /* pa
373f0 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  th for the new u
37400 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75  nixFile */.    u
37410 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65  nixFile **ppFile
37420 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46  ,       /* unixF
37430 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64 20  ile created and 
37440 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66 20  returned by ref 
37450 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63  */.    int isloc
37460 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20  kfile           
37470 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d  /* if non zero m
37480 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c  issing dirs will
37490 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29   be created */.)
374a0 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31   {.  int fd = -1
374b0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
374c0 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ew;.  int rc = S
374d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
374e0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
374f0 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20  WR | O_CREAT;.  
37500 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d  sqlite3_vfs dumm
37510 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72  yVfs;.  int terr
37520 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e  no = 0;.  UnixUn
37530 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
37540 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e  = NULL;..  /* 1.
37550 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70   first try to op
37560 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
37570 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68  le.  ** 2. if th
37580 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68  at fails, and th
37590 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c  is is a lock fil
375a0 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74  e (not-conch), t
375b0 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  ry creating.  **
375c0 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65   the parent dire
375d0 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e  ctories and then
375e0 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a   try again..  **
375f0 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c   3. if that fail
37600 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74  s, try to open t
37610 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c  he file read-onl
37620 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65  y.  ** otherwise
37630 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66   return BUSY (if
37640 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43   lock file) or C
37650 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20  ANTOPEN for the 
37660 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a  conch file.  */.
37670 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
37680 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c  ReusableFd(path,
37690 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69   openFlags);.  i
376a0 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
376b0 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e    fd = pUnused->
376c0 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  fd;.  }else{.   
376d0 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
376e0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65  e3_malloc64(size
376f0 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20  of(*pUnused));. 
37700 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
37710 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
37720 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
37730 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  T;.    }.  }.  i
37740 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66  f( fd<0 ){.    f
37750 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
37760 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  path, openFlags,
37770 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20   0);.    terrno 
37780 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
37790 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   fd<0 && errno==
377a0 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b  ENOENT && islock
377b0 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  file ){.      if
377c0 28 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63  ( proxyCreateLoc
377d0 6b 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53  kPath(path) == S
377e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
377f0 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
37800 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46  open(path, openF
37810 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
37820 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
37830 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70  ( fd<0 ){.    op
37840 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e  enFlags = O_RDON
37850 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62  LY;.    fd = rob
37860 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f  ust_open(path, o
37870 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  penFlags, 0);.  
37880 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    terrno = errno
37890 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  ;.  }.  if( fd<0
378a0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f   ){.    if( islo
378b0 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  ckfile ){.      
378c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
378d0 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  SY;.    }.    sw
378e0 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a  itch (terrno) {.
378f0 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43 45        case EACCE
37900 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  S:.        retur
37910 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
37920 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20 0a       case EIO: .
37930 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
37940 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
37950 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67 68  ; /* even though
37960 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63 68   it is the conch
37970 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75 6c   */.      defaul
37980 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  t:.        retur
37990 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
379a0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
379b0 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75  }.  .  pNew = (u
379c0 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65  nixFile *)sqlite
379d0 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f  3_malloc64(sizeo
379e0 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28  f(*pNew));.  if(
379f0 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20   pNew==NULL ){. 
37a00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
37a10 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67  OMEM_BKPT;.    g
37a20 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70  oto end_create_p
37a30 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  roxy;.  }.  mems
37a40 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
37a50 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
37a60 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73   pNew->openFlags
37a70 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
37a80 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66 73  memset(&dummyVfs
37a90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d  , 0, sizeof(dumm
37aa0 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56  yVfs));.  dummyV
37ab0 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76  fs.pAppData = (v
37ac0 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f  oid*)&autolockIo
37ad0 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56  Finder;.  dummyV
37ae0 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d  fs.zName = "dumm
37af0 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  y";.  pUnused->f
37b00 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65  d = fd;.  pUnuse
37b10 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46  d->flags = openF
37b20 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  lags;.  pNew->pP
37b30 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
37b40 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a  d = pUnused;.  .
37b50 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
37b60 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c  xFile(&dummyVfs,
37b70 20 66 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69   fd, (sqlite3_fi
37b80 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20  le*)pNew, path, 
37b90 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
37ba0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
37bb0 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20  ppFile = pNew;. 
37bc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37bd0 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65  _OK;.  }.end_cre
37be0 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20  ate_proxy:    . 
37bf0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
37c00 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  ew, fd, __LINE__
37c10 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
37c20 65 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74  e(pNew);.  sqlit
37c30 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65 64 29  e3_free(pUnused)
37c40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
37c50 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
37c60 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65  TEST./* simulate
37c70 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
37c80 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
37c90 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
37ca0 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  aths */.int sqli
37cb0 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d  te3_hostid_num =
37cc0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   0;.#endif..#def
37cd0 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54 49 44  ine PROXY_HOSTID
37ce0 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a 20 63 6f  LEN    16  /* co
37cf0 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 20 69 64  nch file host id
37d00 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 23 69 66 64   length */..#ifd
37d10 65 66 20 48 41 56 45 5f 47 45 54 48 4f 53 54 55  ef HAVE_GETHOSTU
37d20 55 49 44 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79  UID./* Not alway
37d30 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  s defined in the
37d40 20 68 65 61 64 65 72 73 20 61 73 20 69 74 20 6f   headers as it o
37d50 75 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78  ught to be */.ex
37d60 74 65 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74  tern int gethost
37d70 75 75 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20  uuid(uuid_t id, 
37d80 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d  const struct tim
37d90 65 73 70 65 63 20 2a 77 61 69 74 29 3b 0a 23 65  espec *wait);.#e
37da0 6e 64 69 66 0a 0a 2f 2a 20 67 65 74 20 74 68 65  ndif../* get the
37db0 20 68 6f 73 74 20 49 44 20 76 69 61 20 67 65 74   host ID via get
37dc0 68 6f 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73  hostuuid(), pHos
37dd0 74 49 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  tID must point t
37de0 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  o PROXY_HOSTIDLE
37df0 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77  N .** bytes of w
37e00 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a  ritable memory..
37e10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
37e20 6f 78 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73  oxyGetHostID(uns
37e30 69 67 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73  igned char *pHos
37e40 74 49 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72  tID, int *pError
37e50 29 7b 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58  ){.  assert(PROX
37e60 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73  Y_HOSTIDLEN == s
37e70 69 7a 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a  izeof(uuid_t));.
37e80 20 20 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44    memset(pHostID
37e90 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49  , 0, PROXY_HOSTI
37ea0 44 4c 45 4e 29 3b 0a 23 69 66 64 65 66 20 48 41  DLEN);.#ifdef HA
37eb0 56 45 5f 47 45 54 48 4f 53 54 55 55 49 44 0a 20  VE_GETHOSTUUID. 
37ec0 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 74 69   {.    struct ti
37ed0 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20 3d  mespec timeout =
37ee0 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65   {1, 0}; /* 1 se
37ef0 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20  c timeout */.   
37f00 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69 64   if( gethostuuid
37f10 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f  (pHostID, &timeo
37f20 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ut) ){.      int
37f30 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20   err = errno;.  
37f40 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29      if( pError )
37f50 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72 6f  {.        *pErro
37f60 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 7d  r = err;.      }
37f70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
37f80 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
37f90 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  }.  }.#else.  UN
37fa0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
37fb0 45 72 72 6f 72 29 3b 0a 23 65 6e 64 69 66 0a 23  Error);.#endif.#
37fc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
37fd0 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20  T.  /* simulate 
37fe0 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62  multiple hosts b
37ff0 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75  y creating uniqu
38000 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61  e hostid file pa
38010 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ths */.  if( sql
38020 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
38030 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73 74  != 0){.    pHost
38040 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28 70  ID[0] = (char)(p
38050 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68 61  HostID[0] + (cha
38060 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  r)(sqlite3_hosti
38070 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b 0a  d_num & 0xFF));.
38080 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
38090 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
380a0 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63  ;.}../* The conc
380b0 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  h file contains 
380c0 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73 74  the header, host
380d0 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c   id and lock fil
380e0 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69  e path. */.#defi
380f0 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ne PROXY_CONCHVE
38100 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62  RSION 2   /* 1-b
38110 79 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d 62  yte header, 16-b
38120 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61 74  yte host id, pat
38130 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  h */.#define PRO
38140 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20 20  XY_HEADERLEN    
38150 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c  1   /* conch fil
38160 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20  e header length 
38170 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
38180 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20 28 50  _PATHINDEX    (P
38190 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
381a0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a  ROXY_HOSTIDLEN).
381b0 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41  #define PROXY_MA
381c0 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58  XCONCHLEN  (PROX
381d0 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58  Y_HEADERLEN+PROX
381e0 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50  Y_HOSTIDLEN+MAXP
381f0 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20  ATHLEN)../* .** 
38200 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f  Takes an open co
38210 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65 73  nch file, copies
38220 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f   the contents to
38230 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64 20   a new path and 
38240 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69  then moves .** i
38250 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65 77  t back.  The new
38260 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c 65 27  ly created file'
38270 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  s file descripto
38280 72 20 69 73 20 61 73 73 69 67 6e 65 64 20 74 6f  r is assigned to
38290 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69   the.** conch fi
382a0 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  le structure and
382b0 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69   finally the ori
382c0 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65  ginal conch file
382d0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 0a   descriptor is .
382e0 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74 75  ** closed.  Retu
382f0 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63 63  rns zero if succ
38300 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69  essful..*/.stati
38310 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61 6b  c int proxyBreak
38320 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69  ConchLock(unixFi
38330 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f  le *pFile, uuid_
38340 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20 70  t myHostID){.  p
38350 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
38360 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
38370 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
38380 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
38390 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78  Context; .  unix
383a0 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
383b0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
383c0 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68 5b  e;.  char tPath[
383d0 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63  MAXPATHLEN];.  c
383e0 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41  har buf[PROXY_MA
383f0 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68  XCONCHLEN];.  ch
38400 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74 78  ar *cPath = pCtx
38410 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b  ->conchFilePath;
38420 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c 65  .  size_t readLe
38430 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20  n = 0;.  size_t 
38440 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63  pathLen = 0;.  c
38450 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d  har errmsg[64] =
38460 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20   "";.  int fd = 
38470 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d  -1;.  int rc = -
38480 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  1;.  UNUSED_PARA
38490 4d 45 54 45 52 28 6d 79 48 6f 73 74 49 44 29 3b  METER(myHostID);
384a0 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20  ..  /* create a 
384b0 6e 65 77 20 70 61 74 68 20 62 79 20 72 65 70 6c  new path by repl
384c0 61 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67  ace the trailing
384d0 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68 20 27   '-conch' with '
384e0 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74  -break' */.  pat
384f0 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 74  hLen = strlcpy(t
38500 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d 41 58  Path, cPath, MAX
38510 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20  PATHLEN);.  if( 
38520 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c  pathLen>MAXPATHL
38530 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20  EN || pathLen<6 
38540 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c 63 70  || .     (strlcp
38550 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65 6e  y(&tPath[pathLen
38560 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36 29  -5], "break", 6)
38570 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20 73 71   != 5) ){.    sq
38580 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
38590 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72  izeof(errmsg),er
385a0 72 6d 73 67 2c 22 70 61 74 68 20 65 72 72 6f 72  rmsg,"path error
385b0 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29   (len %d)",(int)
385c0 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f  pathLen);.    go
385d0 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
385e0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20  ;.  }.  /* read 
385f0 74 68 65 20 63 6f 6e 63 68 20 6