/ Hex Artifact Content
Login

Artifact 03a5cd0e254dfecd86e800e442a35636c755ececb9e33863a978d9ab23120938:


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 64 65 66  */.#endif.#ifdef
1f30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1f40: 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 0a 20 20 75  ETLK_TIMEOUT.  u
1f50: 6e 73 69 67 6e 65 64 20 69 42 75 73 79 54 69 6d  nsigned iBusyTim
1f60: 65 6f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  eout;           
1f70: 20 20 20 2f 2a 20 57 61 69 74 20 74 68 69 73 20     /* Wait this 
1f80: 6d 61 6e 79 20 6d 69 6c 6c 69 73 65 63 20 6f 6e  many millisec on
1f90: 20 6c 6f 63 6b 73 20 2a 2f 0a 23 65 6e 64 69 66   locks */.#endif
1fa0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1fb0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1fc0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1fd0: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1fe0: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1ff0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2000: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
2010: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
2020: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
2030: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
2040: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
2050: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2060: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
2070: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
2080: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
2090: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
20a0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
20b0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
20c0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
20d0: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
20e0: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
20f0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
2100: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
2110: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2120: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
2130: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
2140: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
2150: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
2160: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
2170: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
2180: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
2190: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
21a0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
21b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
21c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
21d0: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
21e0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
21f0: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2200: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2210: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2220: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2230: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2240: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2250: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2260: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
2270: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
2280: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2290: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
22a0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
22b0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
22c0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
22d0: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
22e0: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
22f0: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2300: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2310: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2320: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2330: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2340: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2350: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2360: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
2370: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2380: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2390: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
23a0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
23b0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
23c0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
23d0: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
23e0: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
23f0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2400: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2410: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2420: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
2430: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
2440: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2450: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2460: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
2470: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
2480: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
2490: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
24a0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
24b0: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
24c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
24d0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
24e0: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
24f0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2500: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2510: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
2520: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
2530: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2540: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2550: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2560: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
2570: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2580: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
2590: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
25a0: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
25b0: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
25c0: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
25d0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
25e0: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
25f0: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2600: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2610: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2620: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
2630: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
2640: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2650: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2660: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2670: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
2680: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
2690: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
26a0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
26b0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
26c0: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
26d0: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
26e0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
26f0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
2700: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
2710: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
2720: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
2730: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
2740: 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  "../*.** Define 
2750: 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74  various macros t
2760: 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20  hat are missing 
2770: 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d  from some system
2780: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f  s..*/.#ifndef O_
2790: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
27a0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
27b0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
27c0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
27d0: 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47  S.# undef O_LARG
27e0: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
27f0: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
2800: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f  dif.#ifndef O_NO
2810: 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20  FOLLOW.# define 
2820: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e  O_NOFOLLOW 0.#en
2830: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49  dif.#ifndef O_BI
2840: 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f  NARY.# define O_
2850: 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a  BINARY 0.#endif.
2860: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61  ./*.** The threa
2870: 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76  did macro resolv
2880: 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64  es to the thread
2890: 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73  -id or to 0.  Us
28a0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
28b0: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
28c0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  only..*/.#if SQL
28d0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
28e0: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
28f0: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23  pthread_self().#
2900: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72  else.#define thr
2910: 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a  eadid 0.#endif..
2920: 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41  /*.** HAVE_MREMA
2930: 50 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74 72  P defaults to tr
2940: 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20  ue on Linux and 
2950: 66 61 6c 73 65 20 65 76 65 72 79 77 68 65 72 65  false everywhere
2960: 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64   else..*/.#if !d
2970: 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d  efined(HAVE_MREM
2980: 41 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65 64  AP).# if defined
2990: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64  (__linux__) && d
29a0: 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52  efined(_GNU_SOUR
29b0: 43 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41  CE).#  define HA
29c0: 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c  VE_MREMAP 1.# el
29d0: 73 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56  se.#  define HAV
29e0: 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e 64  E_MREMAP 0.# end
29f0: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  if.#endif../*.**
2a00: 20 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c   Explicitly call
2a10: 20 74 68 65 20 36 34 2d 62 69 74 20 76 65 72 73   the 64-bit vers
2a20: 69 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20 6f  ion of lseek() o
2a30: 6e 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65 72  n Android. Other
2a40: 77 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a 2a  wise, lseek().**
2a50: 20 69 73 20 74 68 65 20 33 32 2d 62 69 74 20 76   is the 32-bit v
2a60: 65 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20  ersion, even if 
2a70: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
2a80: 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e  S=64 is defined.
2a90: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44  .*/.#ifdef __AND
2aa0: 52 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65 20  ROID__.# define 
2ab0: 6c 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23 65  lseek lseek64.#e
2ac0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f 5f 6c  ndif..#ifdef __l
2ad0: 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 4c 69 6e  inux__./*.** Lin
2ae0: 75 78 2d 73 70 65 63 69 66 69 63 20 49 4f 43 54  ux-specific IOCT
2af0: 4c 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 73 20  L magic numbers 
2b00: 75 73 65 64 20 66 6f 72 20 63 6f 6e 74 72 6f 6c  used for control
2b10: 6c 69 6e 67 20 46 32 46 53 0a 2a 2f 0a 23 64 65  ling F2FS.*/.#de
2b20: 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 54 4c 5f  fine F2FS_IOCTL_
2b30: 4d 41 47 49 43 20 20 20 20 20 20 20 20 30 78 66  MAGIC        0xf
2b40: 35 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f 49  5.#define F2FS_I
2b50: 4f 43 5f 53 54 41 52 54 5f 41 54 4f 4d 49 43 5f  OC_START_ATOMIC_
2b60: 57 52 49 54 45 20 20 20 20 20 5f 49 4f 28 46 32  WRITE     _IO(F2
2b70: 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20  FS_IOCTL_MAGIC, 
2b80: 31 29 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f  1).#define F2FS_
2b90: 49 4f 43 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49  IOC_COMMIT_ATOMI
2ba0: 43 5f 57 52 49 54 45 20 20 20 20 5f 49 4f 28 46  C_WRITE    _IO(F
2bb0: 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c  2FS_IOCTL_MAGIC,
2bc0: 20 32 29 0a 23 64 65 66 69 6e 65 20 46 32 46 53   2).#define F2FS
2bd0: 5f 49 4f 43 5f 53 54 41 52 54 5f 56 4f 4c 41 54  _IOC_START_VOLAT
2be0: 49 4c 45 5f 57 52 49 54 45 20 20 20 5f 49 4f 28  ILE_WRITE   _IO(
2bf0: 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43  F2FS_IOCTL_MAGIC
2c00: 2c 20 33 29 0a 23 64 65 66 69 6e 65 20 46 32 46  , 3).#define F2F
2c10: 53 5f 49 4f 43 5f 41 42 4f 52 54 5f 56 4f 4c 41  S_IOC_ABORT_VOLA
2c20: 54 49 4c 45 5f 57 52 49 54 45 20 20 20 5f 49 4f  TILE_WRITE   _IO
2c30: 28 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49  (F2FS_IOCTL_MAGI
2c40: 43 2c 20 35 29 0a 23 64 65 66 69 6e 65 20 46 32  C, 5).#define F2
2c50: 46 53 5f 49 4f 43 5f 47 45 54 5f 46 45 41 54 55  FS_IOC_GET_FEATU
2c60: 52 45 53 20 20 20 20 20 20 20 20 20 20 20 5f 49  RES           _I
2c70: 4f 52 28 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41  OR(F2FS_IOCTL_MA
2c80: 47 49 43 2c 20 31 32 2c 20 75 33 32 29 0a 23 64  GIC, 12, u32).#d
2c90: 65 66 69 6e 65 20 46 32 46 53 5f 46 45 41 54 55  efine F2FS_FEATU
2ca0: 52 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  RE_ATOMIC_WRITE 
2cb0: 30 78 30 30 30 34 0a 23 65 6e 64 69 66 20 2f 2a  0x0004.#endif /*
2cc0: 20 5f 5f 6c 69 6e 75 78 5f 5f 20 2a 2f 0a 0a 0a   __linux__ */...
2cd0: 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20  /*.** Different 
2ce0: 55 6e 69 78 20 73 79 73 74 65 6d 73 20 64 65 63  Unix systems dec
2cf0: 6c 61 72 65 20 6f 70 65 6e 28 29 20 69 6e 20 64  lare open() in d
2d00: 69 66 66 65 72 65 6e 74 20 77 61 79 73 2e 20 20  ifferent ways.  
2d10: 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e  Same use.** open
2d20: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
2d30: 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65 72  ,mode_t).  Other
2d40: 73 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74  s use open(const
2d50: 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e   char*,int,...).
2d60: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2d70: 63 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  ce is important 
2d80: 77 68 65 6e 20 75 73 69 6e 67 20 61 20 70 6f 69  when using a poi
2d90: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e 63  nter to the func
2da0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
2db0: 73 61 66 65 73 74 20 77 61 79 20 74 6f 20 64 65  safest way to de
2dc0: 61 6c 20 77 69 74 68 20 74 68 65 20 70 72 6f 62  al with the prob
2dd0: 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77 61 79 73  lem is to always
2de0: 20 75 73 65 20 74 68 69 73 20 77 72 61 70 70 65   use this wrappe
2df0: 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77 61 79  r.** which alway
2e00: 73 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 77  s has the same w
2e10: 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74 65  ell-defined inte
2e20: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
2e30: 20 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28 63   int posixOpen(c
2e40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2e50: 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74  , int flags, int
2e60: 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75 72 6e   mode){.  return
2e70: 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61   open(zFile, fla
2e80: 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a  gs, mode);.}../*
2e90: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
2ea0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
2eb0: 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
2ec0: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a  onst char*, int*
2ed0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  );.static int un
2ee0: 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
2ef0: 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  id);../*.** Many
2f00: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
2f10: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
2f20: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
2f30: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
2f40: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
2f50: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
2f60: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
2f70: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
2f80: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
2f90: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
2fa0: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
2fb0: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
2fc0: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
2fd0: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
2fe0: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
2ff0: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
3000: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
3010: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
3020: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
3030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3040: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
3050: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3060: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3070: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
3080: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
3090: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
30a0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
30b0: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
30c0: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
30d0: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
30e0: 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22  ] = {.  { "open"
30f0: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
3100: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3110: 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c  osixOpen,  0  },
3120: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20  .#define osOpen 
3130: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
3140: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e  nst char*,int,in
3150: 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  t))aSyscall[0].p
3160: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63  Current)..  { "c
3170: 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73  lose",        (s
3180: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3190: 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30  tr)close,      0
31a0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43    },.#define osC
31b0: 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a  lose     ((int(*
31c0: 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  )(int))aSyscall[
31d0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
31e0: 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20  { "access",     
31f0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3200: 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20  ll_ptr)access,  
3210: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3220: 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69   osAccess    ((i
3230: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3240: 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  *,int))aSyscall[
3250: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
3260: 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20  { "getcwd",     
3270: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3280: 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20  ll_ptr)getcwd,  
3290: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
32a0: 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63   osGetcwd    ((c
32b0: 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69  har*(*)(char*,si
32c0: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33  ze_t))aSyscall[3
32d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
32e0: 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20   "stat",        
32f0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3300: 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20  l_ptr)stat,     
3310: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3320: 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e  osStat      ((in
3330: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3340: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
3350: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
3360: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ent)../*.** The 
3370: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
3380: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
3390: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
33a0: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
33b0: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
33c0: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
33d0: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
33e0: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
33f0: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
3400: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
3410: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
3420: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
3430: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
3440: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
3450: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
3460: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
3470: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20  f __DJGPP__.  { 
3480: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
3490: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
34a0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
34b0: 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20   osFstat(a,b,c) 
34c0: 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a     0.#else     .
34d0: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
34e0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
34f0: 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20  call_ptr)fstat, 
3500: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3510: 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28  ne osFstat     (
3520: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75  (int(*)(int,stru
3530: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
3540: 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[5].pCurrent).
3550: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72  #endif..  { "ftr
3560: 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  uncate",    (sql
3570: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3580: 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20  )ftruncate,  0  
3590: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72  },.#define osFtr
35a0: 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  uncate ((int(*)(
35b0: 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  int,off_t))aSysc
35c0: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
35d0: 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20  ..  { "fcntl",  
35e0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
35f0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c  yscall_ptr)fcntl
3600: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3610: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20  fine osFcntl    
3620: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e   ((int(*)(int,in
3630: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
3640: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
3650: 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20  { "read",       
3660: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3670: 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20  ll_ptr)read,    
3680: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3690: 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73   osRead      ((s
36a0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
36b0: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
36c0: 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74  call[8].pCurrent
36d0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
36e0: 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c  SE_PREAD) || SQL
36f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3700: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 72  NG_STYLE.  { "pr
3710: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
3720: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3730: 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20  r)pread,      0 
3740: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
3750: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
3760: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3770: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3780: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3790: 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20  ine osPread     
37a0: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
37b0: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66  ,void*,size_t,of
37c0: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  f_t))aSyscall[9]
37d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
37e0: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
37f0: 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36  D64).  { "pread6
3800: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
3810: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
3820: 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a  ead64,    0  },.
3830: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
3840: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
3850: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3860: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3870: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3880: 6f 73 50 72 65 61 64 36 34 20 28 28 73 73 69 7a  osPread64 ((ssiz
3890: 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a  e_t(*)(int,void*
38a0: 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f 74 29  ,size_t,off64_t)
38b0: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
38c0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72  urrent)..  { "wr
38d0: 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ite",        (sq
38e0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
38f0: 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20  r)write,      0 
3900: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72   },.#define osWr
3910: 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ite     ((ssize_
3920: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3930: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
3940: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
3950: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3960: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
3970: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3980: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
3990: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
39a0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
39b0: 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20  ptr)pwrite,     
39c0: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
39d0: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
39e0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
39f0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3a00: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
3a10: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20  efine osPwrite  
3a20: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3a30: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
3a40: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a60: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e     aSyscall[12].
3a70: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3a80: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3a90: 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36  64).  { "pwrite6
3aa0: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
3ab0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3ac0: 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23  ite64,   0  },.#
3ad0: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3ae0: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
3af0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3b00: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3b10: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3b20: 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69  sPwrite64  ((ssi
3b30: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3b40: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
3b50: 66 66 36 34 5f 74 29 29 5c 0a 20 20 20 20 20 20  ff64_t))\.      
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
3b70: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
3b80: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f  ent)..  { "fchmo
3b90: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
3ba0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
3bb0: 63 68 6d 6f 64 2c 20 20 20 20 20 20 20 20 20 20  chmod,          
3bc0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3bd0: 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74 28  Fchmod    ((int(
3be0: 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29 61  *)(int,mode_t))a
3bf0: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
3c00: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3c10: 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  ed(HAVE_POSIX_FA
3c20: 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45  LLOCATE) && HAVE
3c30: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
3c40: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
3c50: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
3c60: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 5f  scall_ptr)posix_
3c70: 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c  fallocate,  0 },
3c80: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c 6c  .#else.  { "fall
3c90: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
3ca0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3cb0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3cc0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
3cd0: 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61 74  efine osFallocat
3ce0: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
3cf0: 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ff_t,off_t))aSys
3d00: 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e  call[15].pCurren
3d10: 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b 22  t)..  { "unlink"
3d20: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3d30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 6c  _syscall_ptr)unl
3d40: 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20 30  ink,           0
3d50: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e   },.#define osUn
3d60: 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a 29  link    ((int(*)
3d70: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53  (const char*))aS
3d80: 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72  yscall[16].pCurr
3d90: 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e 44  ent)..  { "openD
3da0: 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20 28 73  irectory",    (s
3db0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3dc0: 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  tr)openDirectory
3dd0: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66  ,      0 },.#def
3de0: 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65 63 74  ine osOpenDirect
3df0: 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e  ory ((int(*)(con
3e00: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29 61  st char*,int*))a
3e10: 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72  Syscall[17].pCur
3e20: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64 69  rent)..  { "mkdi
3e30: 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  r",        (sqli
3e40: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3e50: 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 20 20  mkdir,          
3e60: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3e70: 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e 74 28  Mkdir     ((int(
3e80: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 6d  *)(const char*,m
3e90: 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ode_t))aSyscall[
3ea0: 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  18].pCurrent).. 
3eb0: 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20 20 20   { "rmdir",     
3ec0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3ed0: 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20 20  all_ptr)rmdir,  
3ee0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3ef0: 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20 20 20  efine osRmdir   
3f00: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
3f10: 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c   char*))aSyscall
3f20: 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [19].pCurrent)..
3f30: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
3f40: 5f 46 43 48 4f 57 4e 29 0a 20 20 7b 20 22 66 63  _FCHOWN).  { "fc
3f50: 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71  hown",       (sq
3f60: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3f70: 72 29 66 63 68 6f 77 6e 2c 20 20 20 20 20 20 20  r)fchown,       
3f80: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3f90: 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20 20 20  { "fchown",     
3fa0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3fb0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3fc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3fd0: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  dif.#define osFc
3fe0: 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a 29  hown    ((int(*)
3ff0: 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74  (int,uid_t,gid_t
4000: 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70  ))aSyscall[20].p
4010: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4020: 66 69 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57  fined(HAVE_FCHOW
4030: 4e 29 0a 20 20 7b 20 22 67 65 74 65 75 69 64 22  N).  { "geteuid"
4040: 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ,      (sqlite3_
4050: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 65  syscall_ptr)gete
4060: 75 69 64 2c 20 20 20 20 20 20 20 20 20 30 20 7d  uid,         0 }
4070: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 67 65 74  ,.#else.  { "get
4080: 65 75 69 64 22 2c 20 20 20 20 20 20 28 73 71 6c  euid",      (sql
4090: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
40a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
40b0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
40c0: 65 66 69 6e 65 20 6f 73 47 65 74 65 75 69 64 20  efine osGeteuid 
40d0: 20 20 28 28 75 69 64 5f 74 28 2a 29 28 76 6f 69    ((uid_t(*)(voi
40e0: 64 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e  d))aSyscall[21].
40f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4100: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4110: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
4120: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
4130: 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20  >0.  { "mmap",  
4140: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
4150: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61 70  syscall_ptr)mmap
4160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
4170: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 6d 61  ,.#else.  { "mma
4180: 70 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  p",         (sql
4190: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
41a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
41b0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
41c0: 65 66 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28 76  efine osMmap ((v
41d0: 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69  oid*(*)(void*,si
41e0: 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74  ze_t,int,int,int
41f0: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
4200: 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [22].pCurrent)..
4210: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
4220: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
4230: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
4240: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 75 6e  _SIZE>0.  { "mun
4250: 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c  map",       (sql
4260: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4270: 29 6d 75 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  )munmap,        
4280: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4290: 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20   "munmap",      
42a0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
42b0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
42c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
42d0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6e  if.#define osMun
42e0: 6d 61 70 20 28 28 69 6e 74 28 2a 29 28 76 6f 69  map ((int(*)(voi
42f0: 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  d*,size_t))aSysc
4300: 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74  all[23].pCurrent
4310: 29 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d  )..#if HAVE_MREM
4320: 41 50 20 26 26 20 28 21 64 65 66 69 6e 65 64 28  AP && (!defined(
4330: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
4340: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
4350: 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20  MAP_SIZE>0).  { 
4360: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
4370: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
4380: 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20  _ptr)mremap,    
4390: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
43a0: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
43b0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
43c0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
43d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
43e0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
43f0: 73 4d 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMremap ((void*(
4400: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
4410: 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29  size_t,int,...))
4420: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
4430: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66  rrent)..#if !def
4440: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
4450: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
4460: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
4470: 20 20 7b 20 22 67 65 74 70 61 67 65 73 69 7a 65    { "getpagesize
4480: 22 2c 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73  ",  (sqlite3_sys
4490: 63 61 6c 6c 5f 70 74 72 29 75 6e 69 78 47 65 74  call_ptr)unixGet
44a0: 70 61 67 65 73 69 7a 65 2c 20 30 20 7d 2c 0a 23  pagesize, 0 },.#
44b0: 65 6c 73 65 0a 20 20 7b 20 22 67 65 74 70 61 67  else.  { "getpag
44c0: 65 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65  esize",  (sqlite
44d0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
44f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
4500: 6e 65 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65  ne osGetpagesize
4510: 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29   ((int(*)(void))
4520: 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75  aSyscall[25].pCu
4530: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
4540: 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e  ned(HAVE_READLIN
4550: 4b 29 0a 20 20 7b 20 22 72 65 61 64 6c 69 6e 6b  K).  { "readlink
4560: 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ",     (sqlite3_
4570: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
4580: 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 30 20 7d  link,        0 }
4590: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 72 65 61  ,.#else.  { "rea
45a0: 64 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c  dlink",     (sql
45b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
45c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
45d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
45e0: 65 66 69 6e 65 20 6f 73 52 65 61 64 6c 69 6e 6b  efine osReadlink
45f0: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 63 6f   ((ssize_t(*)(co
4600: 6e 73 74 20 63 68 61 72 2a 2c 63 68 61 72 2a 2c  nst char*,char*,
4610: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
4620: 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [26].pCurrent)..
4630: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
4640: 5f 4c 53 54 41 54 29 0a 20 20 7b 20 22 6c 73 74  _LSTAT).  { "lst
4650: 61 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  at",         (sq
4660: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
4670: 72 29 6c 73 74 61 74 2c 20 20 20 20 20 20 20 20  r)lstat,        
4680: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4690: 20 22 6c 73 74 61 74 22 2c 20 20 20 20 20 20 20   "lstat",       
46a0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
46b0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
46c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
46d0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4c 73 74  if.#define osLst
46e0: 61 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  at      ((int(*)
46f0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72  (const char*,str
4700: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
4710: 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74  all[27].pCurrent
4720: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
4730: 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66  _linux__) && def
4740: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
4750: 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f  LE_BATCH_ATOMIC_
4760: 57 52 49 54 45 29 0a 20 20 7b 20 22 69 6f 63 74  WRITE).  { "ioct
4770: 6c 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  l",         (sql
4780: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4790: 29 69 6f 63 74 6c 2c 20 20 20 20 20 20 20 20 20  )ioctl,         
47a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
47b0: 22 69 6f 63 74 6c 22 2c 20 20 20 20 20 20 20 20  "ioctl",        
47c0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
47d0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
47e0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
47f0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 49 6f 63 74  f.#define osIoct
4800: 6c 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69  l ((int(*)(int,i
4810: 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c  nt,...))aSyscall
4820: 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [28].pCurrent)..
4830: 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  }; /* End of the
4840: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
4850: 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 0a  stem calls */...
4860: 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79  /*.** On some sy
4870: 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20  stems, calls to 
4880: 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72  fchown() will tr
4890: 69 67 67 65 72 20 61 20 6d 65 73 73 61 67 65 20  igger a message 
48a0: 69 6e 20 61 20 73 65 63 75 72 69 74 79 0a 2a 2a  in a security.**
48b0: 20 6c 6f 67 20 69 66 20 74 68 65 79 20 63 6f 6d   log if they com
48c0: 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20  e from non-root 
48d0: 70 72 6f 63 65 73 73 65 73 2e 20 20 53 6f 20 61  processes.  So a
48e0: 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66 63 68  void calling fch
48f0: 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65 20 61  own() if.** we a
4900: 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61  re not running a
4910: 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  s root..*/.stati
4920: 63 20 69 6e 74 20 72 6f 62 75 73 74 46 63 68 6f  c int robustFcho
4930: 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64 5f 74  wn(int fd, uid_t
4940: 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69 64 29   uid, gid_t gid)
4950: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  {.#if defined(HA
4960: 56 45 5f 46 43 48 4f 57 4e 29 0a 20 20 72 65 74  VE_FCHOWN).  ret
4970: 75 72 6e 20 6f 73 47 65 74 65 75 69 64 28 29 20  urn osGeteuid() 
4980: 3f 20 30 20 3a 20 6f 73 46 63 68 6f 77 6e 28 66  ? 0 : osFchown(f
4990: 64 2c 75 69 64 2c 67 69 64 29 3b 0a 23 65 6c 73  d,uid,gid);.#els
49a0: 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e.  return 0;.#e
49b0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
49c0: 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79  is is the xSetSy
49d0: 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f  stemCall() metho
49e0: 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
49f0: 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a   for all of the.
4a00: 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73 2e  ** "unix" VFSes.
4a10: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4a20: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
4a30: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
4a40: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
4a50: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
4a60: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
4a70: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
4a80: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
4a90: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
4aa0: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
4ab0: 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d  nt unixSetSystem
4ac0: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
4ad0: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20  vfs *pNotUsed,  
4ae0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
4af0: 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75   pointer.  Not u
4b00: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
4b10: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
4b20: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
4b30: 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  f system call to
4b40: 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73   override */.  s
4b50: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
4b60: 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20  tr pNewFunc  /* 
4b70: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73  Pointer to new s
4b80: 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65  ystem call value
4b90: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
4ba0: 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72  d int i;.  int r
4bb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
4bc0: 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  UND;..  UNUSED_P
4bd0: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
4be0: 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  d);.  if( zName=
4bf0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
4c00: 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65  no zName is give
4c10: 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73  n, restore all s
4c20: 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74  ystem calls to t
4c30: 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20  heir default.   
4c40: 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64   ** settings and
4c50: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20   return NULL.   
4c60: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
4c70: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28  ITE_OK;.    for(
4c80: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
4c90: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
4ca0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
4cb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79  ){.      if( aSy
4cc0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
4cd0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79  t ){.        aSy
4ce0: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4cf0: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
4d00: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
4d10: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
4d20: 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
4d30: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f   is specified, o
4d40: 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74  perate on only t
4d50: 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61  he one system ca
4d60: 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66  ll.    ** specif
4d70: 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
4d80: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
4d90: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
4da0: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
4db0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4dc0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
4dd0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4de0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4df0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
4e00: 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20  pDefault==0 ){. 
4e10: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
4e20: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20  l[i].pDefault = 
4e30: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4e40: 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rent;.        }.
4e50: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
4e60: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
4e70: 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20  if( pNewFunc==0 
4e80: 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79  ) pNewFunc = aSy
4e90: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
4ea0: 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  t;.        aSysc
4eb0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
4ec0: 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20  = pNewFunc;.    
4ed0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4ee0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
4ef0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4f00: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
4f10: 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20  lue of a system 
4f20: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
4f30: 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  LL if zName is n
4f40: 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a  ot a.** recogniz
4f50: 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ed system call n
4f60: 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c  ame.  NULL is al
4f70: 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
4f80: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a  he system call.*
4f90: 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  * is currently u
4fa0: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
4fb0: 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63  tic sqlite3_sysc
4fc0: 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74 53  all_ptr unixGetS
4fd0: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
4fe0: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
4ff0: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
5000: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
5010: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
5020: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5030: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
5040: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
5050: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
5060: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
5070: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
5080: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
5090: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
50a0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
50b0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
50c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
50d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
50e0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
50f0: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
5100: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
5110: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
5120: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
5130: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
5140: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
5150: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
5160: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
5170: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
5180: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
5190: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
51a0: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
51b0: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
51c0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
51d0: 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  nixNextSystemCal
51e0: 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  l(sqlite3_vfs *p
51f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
5200: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
5210: 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  -1;..  UNUSED_PA
5220: 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66  RAMETER(p);.  if
5230: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66  ( zName ){.    f
5240: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
5250: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b  ize(aSyscall)-1;
5260: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
5270: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
5280: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
5290: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
52a0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b    }.  }.  for(i+
52b0: 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  +; i<ArraySize(a
52c0: 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a  Syscall); i++){.
52d0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
52e0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20  [i].pCurrent!=0 
52f0: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
5300: 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  l[i].zName;.  }.
5310: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5320: 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63 63 65  *.** Do not acce
5330: 70 74 20 61 6e 79 20 66 69 6c 65 20 64 65 73 63  pt any file desc
5340: 72 69 70 74 6f 72 20 6c 65 73 73 20 74 68 61 6e  riptor less than
5350: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 69 6e 20   this value, in 
5360: 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 0a 2a  order to avoid.*
5370: 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74 61 62 61  * opening databa
5380: 73 65 20 66 69 6c 65 20 75 73 69 6e 67 20 66 69  se file using fi
5390: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
53a0: 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c 79  hat are commonly
53b0: 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 73 74   used for .** st
53c0: 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 75  andard input, ou
53d0: 74 70 75 74 2c 20 61 6e 64 20 65 72 72 6f 72 2e  tput, and error.
53e0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
53f0: 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f  TE_MINIMUM_FILE_
5400: 44 45 53 43 52 49 50 54 4f 52 0a 23 20 64 65 66  DESCRIPTOR.# def
5410: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d  ine SQLITE_MINIM
5420: 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54  UM_FILE_DESCRIPT
5430: 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  OR 3.#endif../*.
5440: 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29  ** Invoke open()
5450: 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c  .  Do so multipl
5460: 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69  e times, until i
5470: 74 20 65 69 74 68 65 72 20 73 75 63 63 65 65 64  t either succeed
5480: 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20 66 6f  s or.** fails fo
5490: 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74  r some reason ot
54a0: 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a  her than EINTR..
54b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
54c0: 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20  e creation mode 
54d0: 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73 65  "m" is 0 then se
54e0: 74 20 69 74 20 74 6f 20 74 68 65 20 64 65 66 61  t it to the defa
54f0: 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74  ult for.** SQLit
5500: 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  e.  The default 
5510: 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  is SQLITE_DEFAUL
5520: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
5530: 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20  NS (normally.** 
5540: 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69 65  0644) as modifie
5550: 64 20 62 79 20 74 68 65 20 73 79 73 74 65 6d 20  d by the system 
5560: 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73 20  umask.  If m is 
5570: 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d  not 0, then.** m
5580: 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72 65  ake the file cre
5590: 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78  ation mode be ex
55a0: 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67  actly m ignoring
55b0: 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a   the umask..**.*
55c0: 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74 65  * The m paramete
55d0: 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65  r will be non-ze
55e0: 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65  ro only when cre
55f0: 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75  ating -wal, -jou
5600: 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68  rnal,.** and -sh
5610: 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61 6e  m files.  We wan
5620: 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74 6f  t those files to
5630: 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a 20   have *exactly* 
5640: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d  the same.** perm
5650: 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69 72  issions as their
5660: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
5670: 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74 65  se, unadulterate
5680: 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a  d by the umask..
5690: 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  ** In that way, 
56a0: 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  if a database fi
56b0: 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77 20  le is -rw-rw-rw 
56c0: 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e  or -rw-rw-r-, an
56d0: 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  d a.** transacti
56e0: 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20 6c  on crashes and l
56f0: 65 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f 74  eaves behind hot
5700: 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20   journals, then 
5710: 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74  any.** process t
5720: 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20 77  hat is able to w
5730: 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61  rite to the data
5740: 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62  base will also b
5750: 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63  e able to.** rec
5760: 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f 75  over the hot jou
5770: 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnals..*/.static
5780: 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e   int robust_open
5790: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
57a0: 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29  int f, mode_t m)
57b0: 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 6d 6f  {.  int fd;.  mo
57c0: 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20 6d 20  de_t m2 = m ? m 
57d0: 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  : SQLITE_DEFAULT
57e0: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
57f0: 53 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 23  S;.  while(1){.#
5800: 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f  if defined(O_CLO
5810: 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20 6f  EXEC).    fd = o
5820: 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45  sOpen(z,f|O_CLOE
5830: 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20  XEC,m2);.#else. 
5840: 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a     fd = osOpen(z
5850: 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20  ,f,m2);.#endif. 
5860: 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
5870: 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d       if( errno==
5880: 45 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e 75 65  EINTR ) continue
5890: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
58a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3e     }.    if( fd>
58b0: 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f  =SQLITE_MINIMUM_
58c0: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 20  FILE_DESCRIPTOR 
58d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 73 43  ) break;.    osC
58e0: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 73 71  lose(fd);.    sq
58f0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
5900: 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20 20 20  _WARNING, .     
5910: 20 20 20 20 20 20 20 20 20 20 20 22 61 74 74 65             "atte
5920: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22 25 73  mpt to open \"%s
5930: 5c 22 20 61 73 20 66 69 6c 65 20 64 65 73 63 72  \" as file descr
5940: 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20 66 64  iptor %d", z, fd
5950: 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31 3b 0a  );.    fd = -1;.
5960: 20 20 20 20 69 66 28 20 6f 73 4f 70 65 6e 28 22      if( osOpen("
5970: 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20 6d  /dev/null", f, m
5980: 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  )<0 ) break;.  }
5990: 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a  .  if( fd>=0 ){.
59a0: 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a      if( m!=0 ){.
59b0: 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
59c0: 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20 20  t statbuf;.     
59d0: 20 69 66 28 20 6f 73 46 73 74 61 74 28 66 64 2c   if( osFstat(fd,
59e0: 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a 20   &statbuf)==0 . 
59f0: 20 20 20 20 20 20 26 26 20 73 74 61 74 62 75 66        && statbuf
5a00: 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20 20  .st_size==0.    
5a10: 20 20 20 26 26 20 28 73 74 61 74 62 75 66 2e 73     && (statbuf.s
5a20: 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d 20  t_mode&0777)!=m 
5a30: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
5a40: 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20 6d    osFchmod(fd, m
5a50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5a60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46 44 5f  .#if defined(FD_
5a70: 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64 65  CLOEXEC) && (!de
5a80: 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29  fined(O_CLOEXEC)
5a90: 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30   || O_CLOEXEC==0
5aa0: 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64  ).    osFcntl(fd
5ab0: 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e  , F_SETFD, osFcn
5ac0: 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20  tl(fd, F_GETFD, 
5ad0: 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29  0) | FD_CLOEXEC)
5ae0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
5af0: 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a  eturn fd;.}../*.
5b00: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
5b10: 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
5b20: 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
5b30: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
5b40: 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
5b50: 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
5b60: 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e  otect the unixIn
5b70: 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76  odeInfo and.** v
5b80: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
5b90: 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69  ects used by thi
5ba0: 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
5bb0: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
5bc0: 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70  shared by multip
5bd0: 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a  le threads..**.*
5be0: 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d  * Function unixM
5bf0: 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
5c00: 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
5c10: 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
5c20: 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
5c30: 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
5c40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5c50: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
5c60: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
5c70: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
5c80: 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78  .g..**.**   unix
5c90: 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
5ca0: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78      assert( unix
5cb0: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
5cc0: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61  *   unixEnterLea
5cd0: 76 65 28 29 0a 2a 2a 0a 2a 2a 20 54 6f 20 70 72  ve().**.** To pr
5ce0: 65 76 65 6e 74 20 64 65 61 64 6c 6f 63 6b 2c 20  event deadlock, 
5cf0: 74 68 65 20 67 6c 6f 62 61 6c 20 75 6e 69 78 42  the global unixB
5d00: 69 67 4c 6f 63 6b 20 6d 75 73 74 20 6d 75 73 74  igLock must must
5d10: 20 62 65 20 61 63 71 75 69 72 65 64 0a 2a 2a 20   be acquired.** 
5d20: 62 65 66 6f 72 65 20 74 68 65 20 75 6e 69 78 49  before the unixI
5d30: 6e 6f 64 65 49 6e 66 6f 2e 70 4c 6f 63 6b 4d 75  nodeInfo.pLockMu
5d40: 74 65 78 20 6d 75 74 65 78 2c 20 69 66 20 62 6f  tex mutex, if bo
5d50: 74 68 20 61 72 65 20 68 65 6c 64 2e 20 20 49 74  th are held.  It
5d60: 20 69 73 0a 2a 2a 20 4f 4b 20 74 6f 20 67 65 74   is.** OK to get
5d70: 20 74 68 65 20 70 4c 6f 63 6b 4d 75 74 65 78 20   the pLockMutex 
5d80: 77 69 74 68 6f 75 74 20 68 6f 6c 64 69 6e 67 20  without holding 
5d90: 75 6e 69 78 42 69 67 4c 6f 63 6b 20 66 69 72 73  unixBigLock firs
5da0: 74 2c 20 62 75 74 20 69 66 0a 2a 2a 20 74 68 61  t, but if.** tha
5db0: 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 75  t happens, the u
5dc0: 6e 69 78 42 69 67 4c 6f 63 6b 20 6d 75 74 65 78  nixBigLock mutex
5dd0: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 63 71   must not be acq
5de0: 75 69 72 65 64 20 75 6e 74 69 6c 20 61 66 74 65  uired until afte
5df0: 72 0a 2a 2a 20 70 4c 6f 63 6b 4d 75 74 65 78 20  r.** pLockMutex 
5e00: 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
5e10: 2a 2a 20 20 20 20 20 20 4f 4b 3a 20 20 20 20 20  **      OK:     
5e20: 65 6e 74 65 72 28 75 6e 69 78 42 69 67 4c 6f 63  enter(unixBigLoc
5e30: 6b 29 2c 20 20 65 6e 74 65 72 28 70 4c 6f 63 6b  k),  enter(pLock
5e40: 49 6e 66 6f 29 0a 2a 2a 20 20 20 20 20 20 4f 4b  Info).**      OK
5e50: 3a 20 20 20 20 20 65 6e 74 65 72 28 75 6e 69 78  :     enter(unix
5e60: 42 69 67 4c 6f 63 6b 29 0a 2a 2a 20 20 20 20 20  BigLock).**     
5e70: 20 4f 4b 3a 20 20 20 20 20 65 6e 74 65 72 28 70   OK:     enter(p
5e80: 4c 6f 63 6b 49 6e 66 6f 29 0a 2a 2a 20 20 20 45  LockInfo).**   E
5e90: 52 52 4f 52 3a 20 20 20 20 20 65 6e 74 65 72 28  RROR:     enter(
5ea0: 70 4c 6f 63 6b 49 6e 66 6f 29 2c 20 65 6e 74 65  pLockInfo), ente
5eb0: 72 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29 0a 2a  r(unixBigLock).*
5ec0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
5ed0: 5f 6d 75 74 65 78 20 2a 75 6e 69 78 42 69 67 4c  _mutex *unixBigL
5ee0: 6f 63 6b 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ock = 0;.static 
5ef0: 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75  void unixEnterMu
5f00: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 61 73 73  tex(void){.  ass
5f10: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5f20: 65 78 5f 6e 6f 74 68 65 6c 64 28 75 6e 69 78 42  ex_notheld(unixB
5f30: 69 67 4c 6f 63 6b 29 20 29 3b 20 20 2f 2a 20 4e  igLock) );  /* N
5f40: 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 6d  ot a recursive m
5f50: 75 74 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65  utex */.  sqlite
5f60: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 75 6e  3_mutex_enter(un
5f70: 69 78 42 69 67 4c 6f 63 6b 29 3b 0a 7d 0a 73 74  ixBigLock);.}.st
5f80: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65  atic void unixLe
5f90: 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  aveMutex(void){.
5fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 75 6e 69  3_mutex_held(uni
5fc0: 78 42 69 67 4c 6f 63 6b 29 20 29 3b 0a 20 20 73  xBigLock) );.  s
5fd0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
5fe0: 76 65 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29 3b  ve(unixBigLock);
5ff0: 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
6000: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
6010: 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  t unixMutexHeld(
6020: 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
6030: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6040: 65 6c 64 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29  eld(unixBigLock)
6050: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
6060: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
6070: 4f 53 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 48  OS_TRACE./*.** H
6080: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
6090: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
60a0: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
60b0: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
60c0: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
60d0: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
60e0: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
60f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70  tion of the supp
6100: 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20  lied.** integer 
6110: 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74  lock-type..*/.st
6120: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
6130: 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20  *azFileLock(int 
6140: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77  eFileLock){.  sw
6150: 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20  itch( eFileLock 
6160: 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c  ){.    case NO_L
6170: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
6180: 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41  E";.    case SHA
6190: 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  RED_LOCK: return
61a0: 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63   "SHARED";.    c
61b0: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
61c0: 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52  K: return "RESER
61d0: 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50  VED";.    case P
61e0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74  ENDING_LOCK: ret
61f0: 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20  urn "PENDING";. 
6200: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
6210: 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  E_LOCK: return "
6220: 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a  EXCLUSIVE";.  }.
6230: 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22    return "ERROR"
6240: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
6250: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
6260: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
6270: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
6280: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
6290: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
62a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
62b0: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
62c0: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
62d0: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
62e0: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
62f0: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
6300: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
6310: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
6320: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
6330: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
6340: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
6350: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
6360: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
6370: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
6380: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
6390: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
63a0: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
63b0: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
63c0: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
63d0: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
63e0: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
63f0: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
6400: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
6410: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
6420: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
6430: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
6440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
6450: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  osFcntl(fd, op, 
6460: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
6470: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
6480: 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20  l unknown %d %d 
6490: 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73  %d\n", fd, op, s
64a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b  );.    return s;
64b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f  .  }.  if( p->l_
64c0: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
64d0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44  .    zType = "RD
64e0: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
64f0: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( p->l_type==F_W
6500: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  RLCK ){.    zTyp
6510: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d  e = "WRLCK";.  }
6520: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
6530: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
6540: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
6550: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
6560: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
6570: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  }.  assert( p->l
6580: 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45  _whence==SEEK_SE
6590: 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e  T );.  s = osFcn
65a0: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
65b0: 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72   savedErrno = er
65c0: 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  rno;.  sqlite3De
65d0: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
65e0: 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20   %d %d %s %s %d 
65f0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
6600: 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20    threadid, fd, 
6610: 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20  zOpName, zType, 
6620: 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c  (int)p->l_start,
6630: 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a   (int)p->l_len,.
6640: 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70       (int)p->l_p
6650: 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d  id, s);.  if( s=
6660: 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53  =(-1) && op==F_S
6670: 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79  ETLK && (p->l_ty
6680: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70  pe==F_RDLCK || p
6690: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
66a0: 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  K) ){.    struct
66b0: 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c   flock l2;.    l
66c0: 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63  2 = *p;.    osFc
66d0: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ntl(fd, F_GETLK,
66e0: 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c   &l2);.    if( l
66f0: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  2.l_type==F_RDLC
6700: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
6710: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20   = "RDLCK";.    
6720: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
6730: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
6740: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57        zType = "W
6750: 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  RLCK";.    }else
6760: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
6770: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
6780: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
6790: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
67a0: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
67b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
67c0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
67d0: 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73  ntl-failure-reas
67e0: 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c  on: %s %d %d %d\
67f0: 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65  n",.       zType
6800: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72  , (int)l2.l_star
6810: 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e  t, (int)l2.l_len
6820: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29  , (int)l2.l_pid)
6830: 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20  ;.  }.  errno = 
6840: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65  savedErrno;.  re
6850: 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66  turn s;.}.#undef
6860: 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65   osFcntl.#define
6870: 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61   osFcntl lockTra
6880: 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ce.#endif /* SQL
6890: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a  ITE_LOCK_TRACE *
68a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  /../*.** Retry f
68b0: 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 73  truncate() calls
68c0: 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74   that fail due t
68d0: 6f 20 45 49 4e 54 52 0a 2a 2a 0a 2a 2a 20 41 6c  o EINTR.**.** Al
68e0: 6c 20 63 61 6c 6c 73 20 74 6f 20 66 74 72 75 6e  l calls to ftrun
68f0: 63 61 74 65 28 29 20 77 69 74 68 69 6e 20 74 68  cate() within th
6900: 69 73 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  is file should b
6910: 65 20 6d 61 64 65 20 74 68 72 6f 75 67 68 0a 2a  e made through.*
6920: 2a 20 74 68 69 73 20 77 72 61 70 70 65 72 2e 20  * this wrapper. 
6930: 20 4f 6e 20 74 68 65 20 41 6e 64 72 6f 69 64 20   On the Android 
6940: 70 6c 61 74 66 6f 72 6d 2c 20 62 79 70 61 73 73  platform, bypass
6950: 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 20 62 65  ing the logic be
6960: 6c 6f 77 0a 2a 2a 20 63 6f 75 6c 64 20 6c 65 61  low.** could lea
6970: 64 20 74 6f 20 61 20 63 6f 72 72 75 70 74 20 64  d to a corrupt d
6980: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
6990: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74  ic int robust_ft
69a0: 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73  runcate(int h, s
69b0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29  qlite3_int64 sz)
69c0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69 66 64  {.  int rc;.#ifd
69d0: 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 20  ef __ANDROID__. 
69e0: 20 2f 2a 20 4f 6e 20 41 6e 64 72 6f 69 64 2c 20   /* On Android, 
69f0: 66 74 72 75 6e 63 61 74 65 28 29 20 61 6c 77 61  ftruncate() alwa
6a00: 79 73 20 75 73 65 73 20 33 32 2d 62 69 74 20 6f  ys uses 32-bit o
6a10: 66 66 73 65 74 73 2c 20 65 76 65 6e 20 69 66 20  ffsets, even if 
6a20: 0a 20 20 2a 2a 20 5f 46 49 4c 45 5f 4f 46 46 53  .  ** _FILE_OFFS
6a30: 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20 64 65  ET_BITS=64 is de
6a40: 66 69 6e 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  fined. This mean
6a50: 73 20 69 74 20 69 73 20 75 6e 73 61 66 65 20 74  s it is unsafe t
6a60: 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 20 20 2a  o attempt to.  *
6a70: 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  * truncate a fil
6a80: 65 20 74 6f 20 61 6e 79 20 73 69 7a 65 20 6c 61  e to any size la
6a90: 72 67 65 72 20 74 68 61 6e 20 32 47 69 42 2e 20  rger than 2GiB. 
6aa0: 53 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 20  Silently ignore 
6ab0: 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 61 74  any.  ** such at
6ac0: 74 65 6d 70 74 73 2e 20 20 2a 2f 0a 20 20 69 66  tempts.  */.  if
6ad0: 28 20 73 7a 3e 28 73 71 6c 69 74 65 33 5f 69 6e  ( sz>(sqlite3_in
6ae0: 74 36 34 29 30 78 37 46 46 46 46 46 46 46 20 29  t64)0x7FFFFFFF )
6af0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
6b00: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  E_OK;.  }else.#e
6b10: 6e 64 69 66 0a 20 20 64 6f 7b 20 72 63 20 3d 20  ndif.  do{ rc = 
6b20: 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73 7a  osFtruncate(h,sz
6b30: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
6b40: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
6b50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
6b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6b70: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
6b80: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
6b90: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
6ba0: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
6bb0: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
6bc0: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
6bd0: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
6be0: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
6bf0: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
6c00: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
6c10: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
6c20: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
6c30: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
6c40: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
6c50: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
6c60: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
6c70: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
6c80: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
6c90: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
6ca0: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
6cb0: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
6cc0: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
6cd0: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
6ce0: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
6cf0: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
6d00: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
6d10: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
6d20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
6d30: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
6d40: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
6d50: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
6d60: 65 49 4f 45 72 72 29 20 7b 0a 20 20 61 73 73 65  eIOErr) {.  asse
6d70: 72 74 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72  rt( (sqliteIOErr
6d80: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
6d90: 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20  _LOCK) || .     
6da0: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6db0: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6dc0: 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20  R_UNLOCK) || .  
6dd0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49          (sqliteI
6de0: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
6df0: 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a  OERR_RDLOCK) ||.
6e00: 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
6e10: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
6e20: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
6e30: 52 56 45 44 4c 4f 43 4b 29 20 29 3b 0a 20 20 73  RVEDLOCK) );.  s
6e40: 77 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f  witch (posixErro
6e50: 72 29 20 7b 0a 20 20 63 61 73 65 20 45 41 43 43  r) {.  case EACC
6e60: 45 53 3a 20 0a 20 20 63 61 73 65 20 45 41 47 41  ES: .  case EAGA
6e70: 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45  IN:.  case ETIME
6e80: 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55  DOUT:.  case EBU
6e90: 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52  SY:.  case EINTR
6ea0: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a  :.  case ENOLCK:
6eb0: 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d    .    /* random
6ec0: 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72   NFS retry error
6ed0: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
6ee0: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
6ef0: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
6f00: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
6f10: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
6f20: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
6f30: 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ys */.    return
6f40: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
6f50: 20 20 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a    .  case EPERM:
6f60: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
6f70: 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20  ITE_PERM;.    . 
6f80: 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72   default: .    r
6f90: 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72  eturn sqliteIOEr
6fa0: 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a  r;.  }.}.../****
6fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
7000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
7010: 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20  gin Unique File 
7020: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
7030: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
7040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
7050: 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e   On most version
7060: 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61  s of unix, we ca
7070: 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49  n get a unique I
7080: 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20  D for a file by 
7090: 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a  concatenating.**
70a0: 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62   the device numb
70b0: 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65  er and the inode
70c0: 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68   number.  But th
70d0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  is does not work
70e0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
70f0: 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e  On VxWorks, a un
7100: 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73  ique file id mus
7110: 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  t be based on th
7120: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
7130: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  name..**.** A po
7140: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
7150: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
7160: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
7170: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61  can be used as a
7180: 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20  .** unique file 
7190: 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20  ID in VxWorks.  
71a0: 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
71b0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
71c0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f  contains.** a co
71d0: 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69  py of the canoni
71e0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54  cal filename.  T
71f0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72  here is also a r
7200: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20  eference count. 
7210: 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75   .** The structu
7220: 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20  re is reclaimed 
7230: 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
7240: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69  of pointers to i
7250: 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65  t drops to.** ze
7260: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ro..**.** There 
7270: 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d  are never very m
7280: 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61  any files open a
7290: 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c  t one time and l
72a0: 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a  ookups are not.*
72b0: 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d  * a performance-
72c0: 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73  critical path, s
72d0: 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  o it is sufficie
72e0: 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a  nt to put these.
72f0: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e  ** structures on
7300: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a   a linked list..
7310: 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b  */.struct vxwork
7320: 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75  sFileId {.  stru
7330: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7340: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
7350: 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  t in a list of t
7360: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  hem all */.  int
7370: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
7380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7390: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
73a0: 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a  es to this one *
73b0: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
73e0: 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  he zCanonicalNam
73f0: 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  e[] string */.  
7400: 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c  char *zCanonical
7410: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Name;         /*
7420: 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   Canonical filen
7430: 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f  ame */.};..#if O
7440: 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a  S_VXWORKS./* .**
7450: 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65   All unique file
7460: 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f  names are held o
7470: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
7480: 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a  headed by this.*
7490: 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73  * variable:.*/.s
74a0: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
74b0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
74c0: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b  rksFileList = 0;
74d0: 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79  ../*.** Simplify
74e0: 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f   a filename into
74f0: 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66   its canonical f
7500: 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67  orm.** by making
7510: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
7520: 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a  hanges:.**.**  *
7530: 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72   removing any tr
7540: 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69  ailing and dupli
7550: 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  cate /.**  * con
7560: 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75  vert /./ into ju
7570: 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65  st /.**  * conve
7580: 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20  rt /A/../ where 
7590: 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20  A is any simple 
75a0: 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f  name into just /
75b0: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61  .**.** Changes a
75c0: 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65  re made in-place
75d0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
75e0: 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a  w name length..*
75f0: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
7600: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e  l filename is in
7610: 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74   z[0..n-1].  Ret
7620: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
7630: 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  f.** characters 
7640: 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65  in the simplifie
7650: 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  d name..*/.stati
7660: 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d  c int vxworksSim
7670: 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a  plifyName(char *
7680: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
7690: 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20   i, j;.  while( 
76a0: 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>1 && z[n-1]=='
76b0: 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66  /' ){ n--; }.  f
76c0: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
76d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
76e0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
76f0: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20  if( z[i+1]=='/' 
7700: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7710: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
7720: 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b  ' && i+2<n && z[
7730: 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+2]=='/' ){.   
7740: 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
7750: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7770: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
7780: 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+3<n && z[i+2]=
7790: 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d  ='.' && z[i+3]==
77a0: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '/' ){.        w
77b0: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a  hile( j>0 && z[j
77c0: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b  -1]!='/' ){ j--;
77d0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
77e0: 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  >0 ){ j--; }.   
77f0: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
7800: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7810: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7820: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
7830: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
7840: 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f    return j;.}../
7850: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71  *.** Find a uniq
7860: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74  ue file ID for t
7870: 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74  he given absolut
7880: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  e pathname.  Ret
7890: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
78a0: 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46   to the vxworksF
78b0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54  ileId object.  T
78c0: 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74  his pointer is t
78d0: 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c  he unique.** fil
78e0: 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e ID..**.** The 
78f0: 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68  nRef field of th
7900: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
7910: 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d  object is increm
7920: 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ented before.** 
7930: 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65  the object is re
7940: 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76  turned.  A new v
7950: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
7960: 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ect is created.*
7970: 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  * and added to t
7980: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69  he global list i
7990: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  f necessary..**.
79a0: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
79b0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
79c0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
79d0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ULL..*/.static s
79e0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
79f0: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64  eId *vxworksFind
7a00: 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61  FileId(const cha
7a10: 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  r *zAbsoluteName
7a20: 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  ){.  struct vxwo
7a30: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b  rksFileId *pNew;
7a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72           /* sear
7a50: 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66  ch key and new f
7a60: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75  ile ID */.  stru
7a70: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7a80: 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20   *pCandidate;   
7a90: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
7aa0: 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c  ver existing fil
7ab0: 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  e IDs */.  int n
7ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ae0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73  * Length of zAbs
7af0: 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67  oluteName string
7b00: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   */..  assert( z
7b10: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d  AbsoluteName[0]=
7b20: 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69  ='/' );.  n = (i
7b30: 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c  nt)strlen(zAbsol
7b40: 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  uteName);.  pNew
7b50: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
7b60: 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  c64( sizeof(*pNe
7b70: 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20  w) + (n+1) );.  
7b80: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
7b90: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
7ba0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d  zCanonicalName =
7bb0: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
7bc0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  ;.  memcpy(pNew-
7bd0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
7be0: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20   zAbsoluteName, 
7bf0: 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f  n+1);.  n = vxwo
7c00: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
7c10: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
7c20: 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20  Name, n);..  /* 
7c30: 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
7c40: 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61  isting entry tha
7c50: 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63  t matching the c
7c60: 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20  anonical name.. 
7c70: 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e   ** If found, in
7c80: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
7c90: 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20  rence count and 
7ca0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
7cb0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69   to.  ** the exi
7cc0: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20  sting file ID.. 
7cd0: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
7ce0: 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43  utex();.  for(pC
7cf0: 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73  andidate=vxworks
7d00: 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69  FileList; pCandi
7d10: 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65  date; pCandidate
7d20: 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65  =pCandidate->pNe
7d30: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61  xt){.    if( pCa
7d40: 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d  ndidate->nName==
7d50: 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d  n .     && memcm
7d60: 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43  p(pCandidate->zC
7d70: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e  anonicalName, pN
7d80: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
7d90: 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b  me, n)==0.    ){
7da0: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
7db0: 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
7dc0: 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e     pCandidate->n
7dd0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e  Ref++;.       un
7de0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
7df0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
7e00: 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a  andidate;.    }.
7e10: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74    }..  /* No mat
7e20: 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57  ch was found.  W
7e30: 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65  e will make a ne
7e40: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70  w file ID */.  p
7e50: 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
7e60: 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e   pNew->nName = n
7e70: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
7e80: 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  = vxworksFileLis
7e90: 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65  t;.  vxworksFile
7ea0: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75  List = pNew;.  u
7eb0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
7ec0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
7ed0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
7ee0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
7ef0: 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f   count on a vxwo
7f00: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
7f10: 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f  .  Free.** the o
7f20: 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72  bject when the r
7f30: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
7f40: 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a  eaches zero..*/.
7f50: 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f  static void vxwo
7f60: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
7f70: 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46  (struct vxworksF
7f80: 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75  ileId *pId){.  u
7f90: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
7fa0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e  .  assert( pId->
7fb0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d  nRef>0 );.  pId-
7fc0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
7fd0: 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Id->nRef==0 ){. 
7fe0: 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b     struct vxwork
7ff0: 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20  sFileId **pp;.  
8000: 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b    for(pp=&vxwork
8010: 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26  sFileList; *pp &
8020: 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d  & *pp!=pId; pp =
8030: 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29   &((*pp)->pNext)
8040: 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20  ){}.    assert( 
8050: 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20  *pp==pId );.    
8060: 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74  *pp = pId->pNext
8070: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
8080: 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75  ee(pId);.  }.  u
8090: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
80a0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  .}.#endif /* OS_
80b0: 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a  VXWORKS */./****
80c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
80d0: 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  of Unique File I
80e0: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
80f0: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
8100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
8110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
8160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
81b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81c0: 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41  ******** Posix A
81d0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20  dvisory Locking 
81e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
8200: 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ** POSIX advisor
8210: 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b  y locks are brok
8220: 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41  en by design.  A
8230: 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28  NSI STD 1003.1 (
8240: 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e  1996).** section
8250: 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34   6.5.2.2 lines 4
8260: 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73  83 through 490 s
8270: 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e  pecify that when
8280: 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65   a process.** se
8290: 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c  ts or clears a l
82a0: 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74  ock, that operat
82b0: 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  ion overrides an
82c0: 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65  y prior locks se
82d0: 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65  t.** by the same
82e0: 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f   process.  It do
82f0: 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  es not explicitl
8300: 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68  y say so, but th
8310: 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68  is implies.** th
8320: 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20  at it overrides 
8330: 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65  locks set by the
8340: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73   same process us
8350: 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a  ing a different.
8360: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
8370: 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  or.  Consider th
8380: 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a  is test case:.**
8390: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
83a0: 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  1 = open("./file
83b0: 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  1", O_RDWR|O_CRE
83c0: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20  AT, 0644);.**   
83d0: 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70      int fd2 = op
83e0: 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f  en("./file2", O_
83f0: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
8400: 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  44);.**.** Suppo
8410: 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e  se ./file1 and .
8420: 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c  /file2 are reall
8430: 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  y the same file 
8440: 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20  (because.** one 
8450: 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d  is a hard or sym
8460: 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68  bolic link to th
8470: 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66  e other) then if
8480: 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65   you set.** an e
8490: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
84a0: 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74   fd1, then try t
84b0: 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  o get an exclusi
84c0: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64  ve lock.** on fd
84d0: 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20  2, it works.  I 
84e0: 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63  would have expec
84f0: 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ted the second l
8500: 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73  ock to.** fail s
8510: 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61  ince there was a
8520: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e  lready a lock on
8530: 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f   the file due to
8540: 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74   fd1..** But not
8550: 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68   so.  Since both
8560: 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d   locks came from
8570: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
8580: 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  s, the.** second
8590: 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66   overrides the f
85a0: 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  irst, even thoug
85b0: 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64  h they were on d
85c0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
85d0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
85e0: 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ned on different
85f0: 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a   file names..**.
8600: 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  ** This means th
8610: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
8620: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
8630: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
8640: 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67   access.** among
8650: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
8660: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
8670: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
8680: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
8690: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
86a0: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
86b0: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
86c0: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
86d0: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
86e0: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
86f0: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
8700: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
8710: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
8720: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
8730: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
8740: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
8750: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
8760: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
8770: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
8780: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
8790: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
87a0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
87b0: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
87c0: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
87d0: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
87e0: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
87f0: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
8800: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
8810: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
8820: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
8830: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
8840: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
8850: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
8860: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
8870: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
8880: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
8890: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
88a0: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
88b0: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
88c0: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
88d0: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
88e0: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
88f0: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
8900: 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a  e..**.** (Aside:
8910: 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64   The use of inod
8920: 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69  e numbers as uni
8930: 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74  que IDs does not
8940: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
8950: 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73  ..** For VxWorks
8960: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65  , we have to use
8970: 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65   the alternative
8980: 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65   unique ID syste
8990: 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61  m based on.** ca
89a0: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
89b0: 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64   and implemented
89c0: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
89d0: 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a   division.).**.*
89e0: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69  * The sqlite3_fi
89f0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
8a00: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
8a10: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
8a20: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
8a30: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
8a40: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
8a50: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
8a60: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
8a70: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
8a80: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
8a90: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
8aa0: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
8ab0: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
8ac0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
8ad0: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
8ae0: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
8af0: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
8b00: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
8b10: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
8b20: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
8b30: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
8b40: 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  res.** point to 
8b50: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67  the same locking
8b60: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
8b70: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
8b80: 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65  re keeps.** a re
8b90: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73  ference count (s
8ba0: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  o we will know w
8bb0: 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74  hen to delete it
8bc0: 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a  ) and a "cnt".**
8bd0: 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c   field that tell
8be0: 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61  s us its interna
8bf0: 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20  l lock status.  
8c00: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
8c10: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  .** file is unlo
8c20: 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d  cked.  cnt==-1 m
8c30: 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61  eans the file ha
8c40: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
8c50: 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65  ock..** cnt>0 me
8c60: 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e  ans there are cn
8c70: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f  t shared locks o
8c80: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
8c90: 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  * Any attempt to
8ca0: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
8cb0: 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65  a file first che
8cc0: 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  cks the locking.
8cd0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ** structure.  T
8ce0: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
8cf0: 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69  m call is only i
8d00: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20  nvoked to set a 
8d10: 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69  .** POSIX lock i
8d20: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c  f the internal l
8d30: 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72  ock structure tr
8d40: 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65  ansitions betwee
8d50: 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e  n.** a locked an
8d60: 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74  d an unlocked st
8d70: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77  ate..**.** But w
8d80: 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20  ait:  there are 
8d90: 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d  yet more problem
8da0: 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76  s with POSIX adv
8db0: 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  isory locks..**.
8dc0: 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20  ** If you close 
8dd0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
8de0: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
8df0: 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73   a file that has
8e00: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c   locks,.** all l
8e10: 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c  ocks on that fil
8e20: 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64  e that are owned
8e30: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
8e40: 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72  process are.** r
8e50: 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72  eleased.  To wor
8e60: 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  k around this pr
8e70: 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78  oblem, each unix
8e80: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
8e90: 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  .** maintains a 
8ea0: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
8eb0: 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c  ber of pending l
8ec0: 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64  ocks on tha inod
8ed0: 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74  e..** When an at
8ee0: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
8ef0: 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69   close an unixFi
8f00: 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  le, if there are
8f10: 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69  .** other unixFi
8f20: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  le open on the s
8f30: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
8f40: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
8f50: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
8f60: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
8f70: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
8f80: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
8f90: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
8fa0: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e  clear..** The un
8fb0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
8fc0: 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69  cture keeps a li
8fd0: 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  st of file descr
8fe0: 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  iptors that need
8ff0: 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64   to.** be closed
9000: 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69   and that list i
9010: 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c  s walked (and cl
9020: 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20  eared) when the 
9030: 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65  last lock.** cle
9040: 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61  ars..**.** Yet a
9050: 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20  nother problem: 
9060: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f   LinuxThreads do
9070: 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77   not play well w
9080: 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e  ith posix locks.
9090: 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65  .**.** Many olde
90a0: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69  r versions of li
90b0: 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75  nux use the Linu
90c0: 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79  xThreads library
90d0: 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74   which is.** not
90e0: 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74   posix compliant
90f0: 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68  .  Under LinuxTh
9100: 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72  reads, a lock cr
9110: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a  eated by thread.
9120: 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d  ** A cannot be m
9130: 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72  odified or overr
9140: 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65  idden by a diffe
9150: 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a  rent thread B..*
9160: 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20  * Only thread A 
9170: 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c  can modify the l
9180: 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65  ock.  Locking be
9190: 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63  havior is correc
91a0: 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c  t.** if the appl
91b0: 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  iation uses the 
91c0: 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73  newer Native Pos
91d0: 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72  ix Thread Librar
91e0: 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c  y (NPTL).** on l
91f0: 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c  inux - with NPTL
9200: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
9210: 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  by thread A can 
9220: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a  override locks.*
9230: 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20  * in thread B.  
9240: 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  But there is no 
9250: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63  way to know at c
9260: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63  ompile-time whic
9270: 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c  h.** threading l
9280: 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20  ibrary is being 
9290: 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20  used.  So there 
92a0: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
92b0: 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d  w at.** compile-
92c0: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
92d0: 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e  not thread A can
92e0: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20   override locks 
92f0: 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  on thread B..** 
9300: 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20  One has to do a 
9310: 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74  run-time check t
9320: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62  o discover the b
9330: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a  ehavior of the.*
9340: 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  * current proces
9350: 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
9360: 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  used to support 
9370: 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42  LinuxThreads.  B
9380: 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c  ut support for L
9390: 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77  inuxThreads.** w
93a0: 61 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e  as dropped begin
93b0: 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f  ning with versio
93c0: 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65  n 3.7.0.  SQLite
93d0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b   will still work
93e0: 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68   with.** LinuxTh
93f0: 72 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74  reads provided t
9400: 68 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73  hat (1) there is
9410: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
9420: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  e connection .**
9430: 20 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69   per database fi
9440: 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  le in the same p
9450: 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64  rocess and (2) d
9460: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
9470: 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f  ons.** do not mo
9480: 76 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ve across thread
9490: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  s..*/../*.** An 
94a0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
94b0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
94c0: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
94d0: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
94e0: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
94f0: 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ular unixInodeIn
9500: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
9510: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
9520: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9540: 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72  /* Device number
9550: 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   */.#if OS_VXWOR
9560: 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  KS.  struct vxwo
9570: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20  rksFileId *pId; 
9580: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
9590: 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20  ID for vxworks. 
95a0: 2a 2f 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 57 65  */.#else.  /* We
95b0: 20 61 72 65 20 74 6f 6c 64 20 74 68 61 74 20 73   are told that s
95c0: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
95d0: 41 6e 64 72 6f 69 64 20 63 6f 6e 74 61 69 6e 20  Android contain 
95e0: 61 20 62 75 67 20 74 68 61 74 0a 20 20 2a 2a 20  a bug that.  ** 
95f0: 73 69 7a 65 73 20 69 6e 6f 5f 74 20 61 74 20 6f  sizes ino_t at o
9600: 6e 6c 79 20 33 32 2d 62 69 74 73 20 69 6e 73 74  nly 32-bits inst
9610: 65 61 64 20 6f 66 20 36 34 2d 62 69 74 73 2e 20  ead of 64-bits. 
9620: 28 53 65 65 0a 20 20 2a 2a 20 68 74 74 70 73 3a  (See.  ** https:
9630: 2f 2f 61 6e 64 72 6f 69 64 2d 72 65 76 69 65 77  //android-review
9640: 2e 67 6f 6f 67 6c 65 73 6f 75 72 63 65 2e 63 6f  .googlesource.co
9650: 6d 2f 23 2f 63 2f 31 31 35 33 35 31 2f 33 2f 64  m/#/c/115351/3/d
9660: 69 73 74 2f 73 71 6c 69 74 65 33 2e 63 29 0a 20  ist/sqlite3.c). 
9670: 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
9680: 6e 64 20 74 68 69 73 2c 20 61 6c 77 61 79 73 20  nd this, always 
9690: 61 6c 6c 6f 63 61 74 65 20 36 34 2d 62 69 74 73  allocate 64-bits
96a0: 20 66 6f 72 20 74 68 65 20 69 6e 6f 64 65 20 6e   for the inode n
96b0: 75 6d 62 65 72 2e 20 20 0a 20 20 2a 2a 20 4f 6e  umber.  .  ** On
96c0: 20 73 6d 61 6c 6c 20 6d 61 63 68 69 6e 65 73 20   small machines 
96d0: 74 68 61 74 20 6f 6e 6c 79 20 68 61 76 65 20 33  that only have 3
96e0: 32 2d 62 69 74 20 69 6e 6f 64 65 73 2c 20 74 68  2-bit inodes, th
96f0: 69 73 20 77 61 73 74 65 73 20 34 20 62 79 74 65  is wastes 4 byte
9700: 73 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68 61 74  s,.  ** but that
9710: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61   should not be a
9720: 20 62 69 67 20 64 65 61 6c 2e 20 2a 2f 0a 20 20   big deal. */.  
9730: 2f 2a 20 57 41 53 3a 20 20 69 6e 6f 5f 74 20 69  /* WAS:  ino_t i
9740: 6e 6f 3b 20 20 20 2a 2f 0a 20 20 75 36 34 20 69  no;   */.  u64 i
9750: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
9760: 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e        /* Inode n
9770: 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  umber */.#endif.
9780: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
9790: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
97a0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
97b0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
97c0: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
97d0: 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69  node.  Or, on Li
97e0: 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72  nuxThreads, ther
97f0: 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73  e is one of thes
9800: 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
9810: 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f  .** each inode o
9820: 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68  pened by each th
9830: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69  read..**.** A si
9840: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
9850: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
9860: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
9870: 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a  o each unixFile.
9880: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ** structure con
9890: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
98a0: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
98b0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e  f this object an
98c0: 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74  d this.** object
98d0: 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f   keeps a count o
98e0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
98f0: 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e  unixFile pointin
9900: 67 20 74 6f 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4d  g to it..**.** M
9910: 75 74 65 78 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  utex rules:.**.*
9920: 2a 20 20 28 31 29 20 4f 6e 6c 79 20 74 68 65 20  *  (1) Only the 
9930: 70 4c 6f 63 6b 4d 75 74 65 78 20 6d 75 74 65 78  pLockMutex mutex
9940: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 69 6e   must be held in
9950: 20 6f 72 64 65 72 20 74 6f 20 72 65 61 64 20 6f   order to read o
9960: 72 20 77 72 69 74 65 0a 2a 2a 20 20 20 20 20 20  r write.**      
9970: 61 6e 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69  any of the locki
9980: 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 20 20 20  ng fields:.**   
9990: 20 20 20 20 20 20 20 6e 53 68 61 72 65 64 2c 20         nShared, 
99a0: 6e 4c 6f 63 6b 2c 20 65 46 69 6c 65 4c 6f 63 6b  nLock, eFileLock
99b0: 2c 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 2c 20  , bProcessLock, 
99c0: 70 55 6e 75 73 65 64 0a 2a 2a 0a 2a 2a 20 20 28  pUnused.**.**  (
99d0: 32 29 20 57 68 65 6e 20 6e 52 65 66 3e 30 2c 20  2) When nRef>0, 
99e0: 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
99f0: 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 75 6e  ng fields are un
9a00: 63 68 61 6e 67 69 6e 67 20 61 6e 64 20 63 61 6e  changing and can
9a10: 0a 2a 2a 20 20 20 20 20 20 62 65 20 72 65 61 64  .**      be read
9a20: 20 28 62 75 74 20 6e 6f 74 20 77 72 69 74 74 65   (but not writte
9a30: 6e 29 20 77 69 74 68 6f 75 74 20 68 6f 6c 64 69  n) without holdi
9a40: 6e 67 20 61 6e 79 20 6d 75 74 65 78 3a 0a 2a 2a  ng any mutex:.**
9a50: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 49 64            fileId
9a60: 2c 20 70 4c 6f 63 6b 4d 75 74 65 78 0a 2a 2a 0a  , pLockMutex.**.
9a70: 2a 2a 20 20 28 33 29 20 57 69 74 68 20 74 68 65  **  (3) With the
9a80: 20 65 78 63 65 70 74 69 6f 6e 73 20 61 62 6f 76   exceptions abov
9a90: 65 2c 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  e, all the field
9aa0: 73 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 72 65  s may only be re
9ab0: 61 64 0a 2a 2a 20 20 20 20 20 20 6f 72 20 77 72  ad.**      or wr
9ac0: 69 74 74 65 6e 20 77 68 69 6c 65 20 68 6f 6c 64  itten while hold
9ad0: 69 6e 67 20 74 68 65 20 67 6c 6f 62 61 6c 20 75  ing the global u
9ae0: 6e 69 78 42 69 67 4c 6f 63 6b 20 6d 75 74 65 78  nixBigLock mutex
9af0: 2e 0a 2a 2a 0a 2a 2a 20 44 65 61 64 6c 6f 63 6b  ..**.** Deadlock
9b00: 20 70 72 65 76 65 6e 74 69 6f 6e 3a 20 20 54 68   prevention:  Th
9b10: 65 20 67 6c 6f 62 61 6c 20 75 6e 69 78 42 69 67  e global unixBig
9b20: 4c 6f 63 6b 20 6d 75 74 65 78 20 6d 61 79 20 6e  Lock mutex may n
9b30: 6f 74 0a 2a 2a 20 62 65 20 61 63 71 75 69 72 65  ot.** be acquire
9b40: 64 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  d while holding 
9b50: 74 68 65 20 70 4c 6f 63 6b 4d 75 74 65 78 20 6d  the pLockMutex m
9b60: 75 74 65 78 2e 20 20 49 66 20 62 6f 74 68 20 75  utex.  If both u
9b70: 6e 69 78 42 69 67 4c 6f 63 6b 0a 2a 2a 20 61 6e  nixBigLock.** an
9b80: 64 20 70 4c 6f 63 6b 4d 75 74 65 78 20 61 72 65  d pLockMutex are
9b90: 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 75 6e   needed, then un
9ba0: 69 78 42 69 67 4c 6f 63 6b 20 6d 75 73 74 20 62  ixBigLock must b
9bb0: 65 20 61 63 71 75 69 72 65 64 20 66 69 72 73 74  e acquired first
9bc0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
9bd0: 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74  InodeInfo {.  st
9be0: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
9bf0: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a  fileId;       /*
9c00: 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20   The lookup key 
9c10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
9c20: 65 78 20 2a 70 4c 6f 63 6b 4d 75 74 65 78 3b 20  ex *pLockMutex; 
9c30: 20 20 20 20 20 2f 2a 20 48 6f 6c 64 20 74 68 69       /* Hold thi
9c40: 73 20 6d 75 74 65 78 20 66 6f 72 2e 2e 2e 20 2a  s mutex for... *
9c50: 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b  /.  int nShared;
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9c80: 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  of SHARED locks 
9c90: 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  held */.  int nL
9ca0: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9cc0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
9cd0: 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ding file locks 
9ce0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
9cf0: 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20  ar eFileLock;   
9d00: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
9d10: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
9d20: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
9d30: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
9d40: 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b  har bProcessLock
9d50: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  ;       /* An ex
9d60: 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20  clusive process 
9d70: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a  lock is held */.
9d80: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
9d90: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
9da0: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69      /* Unused fi
9db0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
9dc0: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74  o close */.  int
9dd0: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9df0: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
9e00: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
9e10: 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ture */.  unixSh
9e20: 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
9e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
9e40: 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
9e50: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
9e60: 69 6e 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49  inode */.  unixI
9e70: 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b  nodeInfo *pNext;
9e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
9e90: 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e  st of all unixIn
9ea0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  odeInfo objects 
9eb0: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
9ec0: 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20  fo *pPrev;      
9ed0: 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20       /*    .... 
9ee0: 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f  doubly linked */
9ef0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
9f00: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
9f10: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
9f20: 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65   long sharedByte
9f30: 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69  ;  /* for AFP si
9f40: 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c  mulated shared l
9f50: 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ock */.#endif.#i
9f60: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
9f70: 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20  em_t *pSem;     
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9f90: 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65  * Named POSIX se
9fa0: 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61  maphore */.  cha
9fb0: 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50  r aSemName[MAX_P
9fc0: 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20  ATHNAME+2];  /* 
9fd0: 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d  Name of that sem
9fe0: 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66  aphore */.#endif
9ff0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  .};../*.** A lis
a000: 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e  ts of all unixIn
a010: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e  odeInfo objects.
a020: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49  .*/.static unixI
a030: 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c  nodeInfo *inodeL
a040: 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 41 6c 6c  ist = 0;  /* All
a050: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
a060: 62 6a 65 63 74 73 20 2a 2f 0a 0a 23 69 66 64 65  bjects */..#ifde
a070: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
a080: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 74 68 65  *.** True if the
a090: 20 69 6e 6f 64 65 20 6d 75 74 65 78 20 69 73 20   inode mutex is 
a0a0: 68 65 6c 64 2c 20 6f 72 20 6e 6f 74 2e 20 20 55  held, or not.  U
a0b0: 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
a0c0: 61 73 73 65 72 74 28 29 0a 2a 2a 20 74 6f 20 68  assert().** to h
a0d0: 65 6c 70 20 76 65 72 69 66 79 20 63 6f 72 72 65  elp verify corre
a0e0: 63 74 20 6d 75 74 65 78 20 75 73 61 67 65 2e 0a  ct mutex usage..
a0f0: 2a 2f 0a 69 6e 74 20 75 6e 69 78 46 69 6c 65 4d  */.int unixFileM
a100: 75 74 65 78 48 65 6c 64 28 75 6e 69 78 46 69 6c  utexHeld(unixFil
a110: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73  e *pFile){.  ass
a120: 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ert( pFile->pIno
a130: 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  de );.  return s
a140: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a150: 64 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  d(pFile->pInode-
a160: 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 7d 0a  >pLockMutex);.}.
a170: 69 6e 74 20 75 6e 69 78 46 69 6c 65 4d 75 74 65  int unixFileMute
a180: 78 4e 6f 74 68 65 6c 64 28 75 6e 69 78 46 69 6c  xNotheld(unixFil
a190: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73  e *pFile){.  ass
a1a0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ert( pFile->pIno
a1b0: 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  de );.  return s
a1c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
a1d0: 68 65 6c 64 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  held(pFile->pIno
a1e0: 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b  de->pLockMutex);
a1f0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
a200: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
a210: 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  n - unixLogError
a220: 41 74 4c 69 6e 65 28 29 2c 20 69 73 20 6f 6e 6c  AtLine(), is onl
a230: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
a240: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75  a the macro.** u
a250: 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a  nixLogError()..*
a260: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b  *.** It is invok
a270: 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f  ed after an erro
a280: 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f  r occurs in an O
a290: 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65  S function and e
a2a0: 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a  rrno has been.**
a2b0: 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20   set. It logs a 
a2c0: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
a2d0: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74  lite3_log() cont
a2e0: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
a2f0: 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  nt value of.** e
a300: 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73  rrno and, if pos
a310: 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e  sible, the human
a320: 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61  -readable equiva
a330: 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72  lent from strerr
a340: 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72  or() or.** strer
a350: 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  ror_r()..**.** T
a360: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
a370: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
a380: 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20  macro should be 
a390: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
a3a0: 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  hat.** will be r
a3b0: 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
a3c0: 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49  e (e.g. SQLITE_I
a3d0: 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c  OERR_DELETE, SQL
a3e0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a  ITE_CANTOPEN). .
a3f0: 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65  ** The two subse
a400: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
a410: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61  should be the na
a420: 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e  me of the OS fun
a430: 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61  ction that.** fa
a440: 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69  iled (e.g. "unli
a450: 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64  nk", "open") and
a460: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
a470: 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68  file-system path
a480: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  ,.** if any..*/.
a490: 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45  #define unixLogE
a4a0: 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20  rror(a,b,c)     
a4b0: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
a4c0: 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f  ne(a,b,c,__LINE_
a4d0: 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  _).static int un
a4e0: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
a4f0: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
a520: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  ror code */.  co
a530: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a550: 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63   Name of OS func
a560: 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64  tion that failed
a570: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
a580: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
a590: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61        /* File pa
a5a0: 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  th associated wi
a5b0: 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e  th error */.  in
a5c0: 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20  t iLine         
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a5e0: 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d   Source line num
a5f0: 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20  ber where error 
a600: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20  occurred */.){. 
a610: 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20   char *zErr;    
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d   /* Message from
a640: 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65   strerror() or e
a650: 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69  quivalent */.  i
a660: 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt iErrno = errn
a670: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  o;             /
a680: 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20  * Saved syscall 
a690: 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a  error number */.
a6a0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
a6b0: 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61 66   not a threadsaf
a6c0: 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f  e build (SQLITE_
a6d0: 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20  THREADSAFE==0), 
a6e0: 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68  then use.  ** th
a6f0: 65 20 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e  e strerror() fun
a700: 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20  ction to obtain 
a710: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
a720: 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  le error message
a730: 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  .  ** equivalent
a740: 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72   to errno. Other
a750: 77 69 73 65 2c 20 75 73 65 20 73 74 72 65 72 72  wise, use strerr
a760: 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69  or_r()..  */ .#i
a770: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
a780: 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 48  AFE && defined(H
a790: 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a  AVE_STRERROR_R).
a7a0: 20 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b    char aErr[80];
a7b0: 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20  .  memset(aErr, 
a7c0: 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29  0, sizeof(aErr))
a7d0: 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b  ;.  zErr = aErr;
a7e0: 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52  ..  /* If STRERR
a7f0: 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74  OR_R_CHAR_P (set
a800: 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72   by autoconf scr
a810: 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47  ipts) or __USE_G
a820: 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20  NU is defined,. 
a830: 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
a840: 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69  the system provi
a850: 64 65 73 20 74 68 65 20 47 4e 55 20 76 65 72 73  des the GNU vers
a860: 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f  ion of strerror_
a870: 72 28 29 20 74 68 61 74 0a 20 20 2a 2a 20 72 65  r() that.  ** re
a880: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
a890: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
a8a0: 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72  aining the error
a8b0: 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20 70   message. That p
a8c0: 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79  ointer .  ** may
a8d0: 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d   point to aErr[]
a8e0: 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e  , or it may poin
a8f0: 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63  t to some static
a900: 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65   storage somewhe
a910: 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  re. .  ** Otherw
a920: 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ise, assume that
a930: 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76   the system prov
a940: 69 64 65 73 20 74 68 65 20 50 4f 53 49 58 20 76  ides the POSIX v
a950: 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20  ersion of .  ** 
a960: 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68  strerror_r(), wh
a970: 69 63 68 20 61 6c 77 61 79 73 20 77 72 69 74 65  ich always write
a980: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
a990: 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a  ge into aErr[]..
a9a0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
a9b0: 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c   code incorrectl
a9c0: 79 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69  y assumes that i
a9d0: 74 20 69 73 20 74 68 65 20 50 4f 53 49 58 20 76  t is the POSIX v
a9e0: 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20  ersion that is. 
a9f0: 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74   ** available, t
aa00: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
aa10: 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61   will often be a
aa20: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
aa30: 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20  Not a.  ** huge 
aa40: 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65  problem. Incorre
aa50: 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20  ctly concluding 
aa60: 74 68 61 74 20 74 68 65 20 47 4e 55 20 76 65 72  that the GNU ver
aa70: 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  sion is availabl
aa80: 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65  e .  ** could le
aa90: 61 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74  ad to a segfault
aaa0: 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69   though..  */.#i
aab0: 66 20 64 65 66 69 6e 65 64 28 53 54 52 45 52 52  f defined(STRERR
aac0: 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20  OR_R_CHAR_P) || 
aad0: 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e  defined(__USE_GN
aae0: 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65  U).  zErr = .# e
aaf0: 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f  ndif.  strerror_
ab00: 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20  r(iErrno, aErr, 
ab10: 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b  sizeof(aErr)-1);
ab20: 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54  ..#elif SQLITE_T
ab30: 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54  HREADSAFE.  /* T
ab40: 68 69 73 20 69 73 20 61 20 74 68 72 65 61 64 73  his is a threads
ab50: 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73  afe build, but s
ab60: 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e  trerror_r() is n
ab70: 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f  ot available. */
ab80: 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65  .  zErr = "";.#e
ab90: 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72  lse.  /* Non-thr
aba0: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75  eadsafe build, u
abb0: 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a  se strerror(). *
abc0: 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72  /.  zErr = strer
abd0: 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e  ror(iErrno);.#en
abe0: 64 69 66 0a 0a 20 20 69 66 28 20 7a 50 61 74 68  dif..  if( zPath
abf0: 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22  ==0 ) zPath = ""
ac00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
ac10: 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22  errcode,.      "
ac20: 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25  os_unix.c:%d: (%
ac30: 64 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c  d) %s(%s) - %s",
ac40: 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45  .      iLine, iE
ac50: 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
ac60: 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20  th, zErr.  );.. 
ac70: 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
ac80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
ac90: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
aca0: 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  r..**.** We assu
acb0: 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20  me that close() 
acc0: 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f  almost always wo
acd0: 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73  rks, since it is
ace0: 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65   only in a.** ve
acf0: 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74  ry sick applicat
ad00: 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79  ion or on a very
ad10: 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74   sick platform t
ad20: 68 61 74 20 69 74 20 6d 69 67 68 74 20 66 61 69  hat it might fai
ad30: 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  l..** If it does
ad40: 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65   fail, simply le
ad50: 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ak the file desc
ad60: 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c  riptor, but do l
ad70: 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e  og the.** error.
ad80: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
ad90: 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   it is not safe 
ada0: 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29  to retry close()
adb0: 20 61 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e   after EINTR sin
adc0: 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ce the.** file d
add0: 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20  escriptor might 
ade0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
adf0: 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74  n reused by anot
ae00: 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53  her thread..** S
ae10: 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20  o we don't even 
ae20: 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66  try to recover f
ae30: 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a  rom an EINTR.  J
ae40: 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f  ust log the erro
ae50: 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e  r.** and move on
ae60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ae70: 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e   robust_close(un
ae80: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
ae90: 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  nt h, int lineno
aea0: 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65  ){.  if( osClose
aeb0: 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c  (h) ){.    unixL
aec0: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51  ogErrorAtLine(SQ
aed0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
aee0: 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20  , "close",.     
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d    pFile ? pFile-
af10: 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65  >zPath : 0, line
af20: 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
af30: 2a 20 53 65 74 20 74 68 65 20 70 46 69 6c 65 2d  * Set the pFile-
af40: 3e 6c 61 73 74 45 72 72 6e 6f 2e 20 20 44 6f 20  >lastErrno.  Do 
af50: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
af60: 74 69 6e 65 20 61 73 20 74 68 61 74 20 70 72 6f  tine as that pro
af70: 76 69 64 65 73 0a 2a 2a 20 61 20 63 6f 6e 76 65  vides.** a conve
af80: 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73  nient place to s
af90: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 2e  et a breakpoint.
afa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
afb0: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 75  storeLastErrno(u
afc0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
afd0: 69 6e 74 20 65 72 72 6f 72 29 7b 0a 20 20 70 46  int error){.  pF
afe0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
aff0: 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   error;.}../*.**
b000: 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20   Close all file 
b010: 64 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75  descriptors accu
b020: 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e  muated in the un
b030: 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e  ixInodeInfo->pUn
b040: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73  used list..*/ .s
b050: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
b060: 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46  PendingFds(unixF
b070: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
b080: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
b090: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
b0a0: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
b0b0: 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55  edFd *p;.  UnixU
b0c0: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a  nusedFd *pNext;.
b0d0: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 46 69    assert( unixFi
b0e0: 6c 65 4d 75 74 65 78 48 65 6c 64 28 70 46 69 6c  leMutexHeld(pFil
b0f0: 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 49  e) );.  for(p=pI
b100: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70  node->pUnused; p
b110: 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
b120: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
b130: 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  ;.    robust_clo
b140: 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c  se(pFile, p->fd,
b150: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
b160: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
b170: 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  .  }.  pInode->p
b180: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
b190: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
b1a0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
b1b0: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
b1c0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
b1d0: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a  indInodeInfo()..
b1e0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
b1f0: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
b200: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
b210: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
b220: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
b230: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
b240: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
b250: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
b260: 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69  InodeInfo(unixFi
b270: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
b280: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
b290: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
b2a0: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
b2b0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
b2c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
b2d0: 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64  FileMutexNotheld
b2e0: 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 69 66 28  (pFile) );.  if(
b2f0: 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20   ALWAYS(pInode) 
b300: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  ){.    pInode->n
b310: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
b320: 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  Inode->nRef==0 )
b330: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b340: 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
b350: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
b360: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
b370: 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
b380: 74 65 78 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  tex);.      clos
b390: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
b3a0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
b3b0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 49  3_mutex_leave(pI
b3c0: 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78  node->pLockMutex
b3d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
b3e0: 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ode->pPrev ){.  
b3f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
b400: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
b410: 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  xt==pInode );.  
b420: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50        pInode->pP
b430: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  rev->pNext = pIn
b440: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
b450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b460: 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69   assert( inodeLi
b470: 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  st==pInode );.  
b480: 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20        inodeList 
b490: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
b4a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b4b0: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  f( pInode->pNext
b4c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
b4d0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  rt( pInode->pNex
b4e0: 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65  t->pPrev==pInode
b4f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
b500: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
b510: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76   = pInode->pPrev
b520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b530: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
b540: 65 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  ee(pInode->pLock
b550: 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71  Mutex);.      sq
b560: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64  lite3_free(pInod
b570: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
b580: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66  ./*.** Given a f
b590: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
b5a0: 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78 49  locate the unixI
b5b0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
b5c0: 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65  that.** describe
b5d0: 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63  s that file desc
b5e0: 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20  riptor.  Create 
b5f0: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
b600: 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20  essary.  The.** 
b610: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67  return value mig
b620: 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69  ht be uninitiali
b630: 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20  zed if an error 
b640: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
b650: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
b660: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
b670: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
b680: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
b690: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
b6a0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
b6b0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
b6c0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
b6d0: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
b6e0: 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64  tic int findInod
b6f0: 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c  eInfo(.  unixFil
b700: 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
b710: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20          /* Unix 
b720: 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64  file with file d
b730: 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20  esc used in the 
b740: 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  key */.  unixIno
b750: 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65  deInfo **ppInode
b760: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
b770: 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  n the unixInodeI
b780: 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20  nfo object here 
b790: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7b0: 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d         /* System
b7c0: 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64   call return cod
b7d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  e */.  int fd;  
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
b800: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
b810: 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75   pFile */.  stru
b820: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
b830: 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  leId;      /* Lo
b840: 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65  okup key for the
b850: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
b860: 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  /.  struct stat 
b870: 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20  statbuf;        
b880: 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20     /* Low-level 
b890: 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
b8a0: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
b8b0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b  nfo *pInode = 0;
b8c0: 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74       /* Candidat
b8d0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
b8e0: 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73  object */..  ass
b8f0: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
b900: 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65  ld() );..  /* Ge
b910: 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f  t low-level info
b920: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
b930: 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63  e file that we c
b940: 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  an used to.  ** 
b950: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20  create a unique 
b960: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c  name for the fil
b970: 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70  e..  */.  fd = p
b980: 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20  File->h;.  rc = 
b990: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
b9a0: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
b9b0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c  =0 ){.    storeL
b9c0: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
b9d0: 65 72 72 6e 6f 29 3b 0a 23 69 66 20 64 65 66 69  errno);.#if defi
b9e0: 6e 65 64 28 45 4f 56 45 52 46 4c 4f 57 29 20 26  ned(EOVERFLOW) &
b9f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
ba00: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 29 0a 20 20  _DISABLE_LFS).  
ba10: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73    if( pFile->las
ba20: 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f  tErrno==EOVERFLO
ba30: 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  W ) return SQLIT
ba40: 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a  E_NOLFS;.#endif.
ba50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ba60: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69  E_IOERR;.  }..#i
ba70: 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20  fdef __APPLE__. 
ba80: 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61   /* On OS X on a
ba90: 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  n msdos filesyst
baa0: 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  em, the inode nu
bab0: 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64  mber is reported
bac0: 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  .  ** incorrectl
bad0: 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20  y for zero-size 
bae0: 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b  files.  See tick
baf0: 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f  et #3260.  To wo
bb00: 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74  rk.  ** around t
bb10: 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20  his problem (we 
bb20: 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75  consider it a bu
bb30: 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53  g in OS X, not S
bb40: 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61  QLite).  ** we a
bb50: 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74  lways increase t
bb60: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20  he file size to 
bb70: 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73  1 by writing a s
bb80: 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20  ingle byte.  ** 
bb90: 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69  prior to accessi
bba0: 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  ng the inode num
bbb0: 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79  ber.  The one by
bbc0: 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20  te written is.  
bbd0: 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20  ** an ASCII 'S' 
bbe0: 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20  character which 
bbf0: 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20  also happens to 
bc00: 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  be the first byt
bc10: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65  e.  ** in the he
bc20: 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51  ader of every SQ
bc30: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
bc40: 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20  In this way, if 
bc50: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20  there.  ** is a 
bc60: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73  race condition s
bc70: 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72  uch that another
bc80: 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65   thread has alre
bc90: 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20  ady populated.  
bca0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ** the first pag
bcb0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
bcc0: 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20  e, no damage is 
bcd0: 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  done..  */.  if(
bce0: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
bcf0: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66  ==0 && (pFile->f
bd00: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
bd10: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
bd20: 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20  )!=0 ){.    do{ 
bd30: 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c  rc = osWrite(fd,
bd40: 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65   "S", 1); }while
bd50: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
bd60: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66  =EINTR );.    if
bd70: 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc!=1 ){.     
bd80: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
bd90: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
bda0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bdb0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
bdc0: 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74      rc = osFstat
bdd0: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
bde0: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
bdf0: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
be00: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
be10: 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  no);.      retur
be20: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
be30: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
be40: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65  ..  memset(&file
be50: 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69  Id, 0, sizeof(fi
be60: 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64  leId));.  fileId
be70: 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73  .dev = statbuf.s
be80: 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58  t_dev;.#if OS_VX
be90: 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70  WORKS.  fileId.p
bea0: 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b  Id = pFile->pId;
beb0: 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e  .#else.  fileId.
bec0: 69 6e 6f 20 3d 20 28 75 36 34 29 73 74 61 74 62  ino = (u64)statb
bed0: 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69  uf.st_ino;.#endi
bee0: 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f  f.  pInode = ino
bef0: 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  deList;.  while(
bf00: 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d   pInode && memcm
bf10: 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f  p(&fileId, &pIno
bf20: 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65  de->fileId, size
bf30: 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20  of(fileId)) ){. 
bf40: 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
bf50: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  de->pNext;.  }. 
bf60: 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29   if( pInode==0 )
bf70: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73  {.    pInode = s
bf80: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
bf90: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
bfa0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
bfb0: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
bfc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
bfd0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
bfe0: 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65     memset(pInode
bff0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e  , 0, sizeof(*pIn
c000: 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ode));.    memcp
c010: 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  y(&pInode->fileI
c020: 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65  d, &fileId, size
c030: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20  of(fileId));.   
c040: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
c050: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
c060: 74 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  tex ){.      pIn
c070: 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 20  ode->pLockMutex 
c080: 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
c090: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
c0a0: 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
c0b0: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  if( pInode->pLoc
c0c0: 6b 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  kMutex==0 ){.   
c0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
c0e0: 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20  e(pInode);.     
c0f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c100: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
c110: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
c120: 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Inode->nRef = 1;
c130: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  .    pInode->pNe
c140: 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  xt = inodeList;.
c150: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65      pInode->pPre
c160: 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69  v = 0;.    if( i
c170: 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65  nodeList ) inode
c180: 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  List->pPrev = pI
c190: 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c  node;.    inodeL
c1a0: 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ist = pInode;.  
c1b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64  }else{.    pInod
c1c0: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  e->nRef++;.  }. 
c1d0: 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f   *ppInode = pIno
c1e0: 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  de;.  return SQL
c1f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c200: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
c210: 70 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72  pFile has been r
c220: 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b  enamed or unlink
c230: 65 64 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ed since it was 
c240: 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f  first opened..*/
c250: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
c260: 48 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c  HasMoved(unixFil
c270: 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f  e *pFile){.#if O
c280: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75  S_VXWORKS.  retu
c290: 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  rn pFile->pInode
c2a0: 21 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  !=0 && pFile->pI
c2b0: 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  d!=pFile->pInode
c2c0: 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65  ->fileId.pId;.#e
c2d0: 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73 74 61  lse.  struct sta
c2e0: 74 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20  t buf;.  return 
c2f0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30  pFile->pInode!=0
c300: 20 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74 61   &&.      (osSta
c310: 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  t(pFile->zPath, 
c320: 26 62 75 66 29 21 3d 30 20 0a 20 20 20 20 20 20  &buf)!=0 .      
c330: 20 20 20 7c 7c 20 28 75 36 34 29 62 75 66 2e 73     || (u64)buf.s
c340: 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49  t_ino!=pFile->pI
c350: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f  node->fileId.ino
c360: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
c370: 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78  .** Check a unix
c380: 46 69 6c 65 20 74 68 61 74 20 69 73 20 61 20 64  File that is a d
c390: 61 74 61 62 61 73 65 2e 20 20 56 65 72 69 66 79  atabase.  Verify
c3a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
c3b0: 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20  **.** (1) There 
c3c0: 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68  is exactly one h
c3d0: 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20  ard link on the 
c3e0: 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20  file.** (2) The 
c3f0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79  file is not a sy
c400: 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28  mbolic link.** (
c410: 33 29 20 54 68 65 20 66 69 6c 65 20 68 61 73 20  3) The file has 
c420: 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64  not been renamed
c430: 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a   or unlinked.**.
c440: 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65 33  ** Issue sqlite3
c450: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
c460: 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65  ING,...) message
c470: 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73  s if anything is
c480: 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73   not right..*/.s
c490: 74 61 74 69 63 20 76 6f 69 64 20 76 65 72 69 66  tatic void verif
c4a0: 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  yDbFile(unixFile
c4b0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75   *pFile){.  stru
c4c0: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69  ct stat buf;.  i
c4d0: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
c4e0: 73 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73  se verifications
c4f0: 20 6f 63 63 75 72 73 20 66 6f 72 20 74 68 65 20   occurs for the 
c500: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e  main database on
c510: 6c 79 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ly */.  if( pFil
c520: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
c530: 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29  NIXFILE_NOLOCK )
c540: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 72 63 20 3d   return;..  rc =
c550: 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e   osFstat(pFile->
c560: 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20  h, &buf);.  if( 
c570: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rc!=0 ){.    sql
c580: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
c590: 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74  WARNING, "cannot
c5a0: 20 66 73 74 61 74 20 64 62 20 66 69 6c 65 20 25   fstat db file %
c5b0: 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  s", pFile->zPath
c5c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
c5d0: 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f   }.  if( buf.st_
c5e0: 6e 6c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  nlink==0 ){.    
c5f0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
c600: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c  TE_WARNING, "fil
c610: 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c 65  e unlinked while
c620: 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c   open: %s", pFil
c630: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
c640: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
c650: 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20   buf.st_nlink>1 
c660: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
c670: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
c680: 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e  G, "multiple lin
c690: 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c  ks to file: %s",
c6a0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
c6b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
c6c0: 20 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f 76    if( fileHasMov
c6d0: 65 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ed(pFile) ){.   
c6e0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c6f0: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69  ITE_WARNING, "fi
c700: 6c 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c 65  le renamed while
c710: 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c   open: %s", pFil
c720: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
c730: 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  eturn;.  }.}.../
c740: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c750: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
c760: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
c770: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
c780: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
c790: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
c7a0: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
c7b0: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
c7c0: 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
c7d0: 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
c7e0: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
c7f0: 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
c800: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
c810: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
c820: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
c830: 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
c840: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
c850: 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
c860: 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
c870: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
c880: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
c890: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
c8a0: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
c8b0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c8c0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
c8d0: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
c8e0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
c8f0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
c900: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
c910: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
c920: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
c930: 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73  DLOCK; );..  ass
c940: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
c950: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
c960: 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
c970: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74  _LOCK );.  sqlit
c980: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
c990: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c  File->pInode->pL
c9a0: 6f 63 6b 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  ockMutex);..  /*
c9b0: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
c9c0: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
c9d0: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
c9e0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
c9f0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
ca00: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
ca10: 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
ca20: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = 1;.  }..  /
ca30: 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
ca40: 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
ca50: 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
ca60: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44    */.#ifndef __D
ca70: 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65  JGPP__.  if( !re
ca80: 73 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65  served && !pFile
ca90: 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
caa0: 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74  ssLock ){.    st
cab0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
cac0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
cad0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
cae0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
caf0: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
cb00: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
cb10: 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  = 1;.    lock.l_
cb20: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
cb30: 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28      if( osFcntl(
cb40: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c  pFile->h, F_GETL
cb50: 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  K, &lock) ){.   
cb60: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
cb70: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
cb80: 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74  EDLOCK;.      st
cb90: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
cba0: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
cbb0: 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e  } else if( lock.
cbc0: 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20  l_type!=F_UNLCK 
cbd0: 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  ){.      reserve
cbe0: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
cbf0: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 71 6c  .#endif.  .  sql
cc00: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
cc10: 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  (pFile->pInode->
cc20: 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 4f  pLockMutex);.  O
cc30: 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
cc40: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
cc50: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
cc60: 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
cc70: 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  ));..  *pResOut 
cc80: 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
cc90: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
cca0: 2a 20 53 65 74 20 61 20 70 6f 73 69 78 2d 61 64  * Set a posix-ad
ccb0: 76 69 73 6f 72 79 2d 6c 6f 63 6b 2e 0a 2a 2a 0a  visory-lock..**.
ccc0: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  ** There are two
ccd0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
cce0: 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 66 20 63  s routine.  If c
ccf0: 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 2a 2a 20  ompiled with.** 
cd00: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
cd10: 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 74 68 65 6e  TLK_TIMEOUT then
cd20: 20 74 68 65 20 72 6f 75 74 69 6e 65 20 68 61 73   the routine has
cd30: 20 61 6e 20 65 78 74 72 61 20 70 61 72 61 6d 65   an extra parame
cd40: 74 65 72 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  ter.** which is 
cd50: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 75  a pointer to a u
cd60: 6e 69 78 46 69 6c 65 2e 20 20 49 66 20 74 68 65  nixFile.  If the
cd70: 20 75 6e 69 78 46 69 6c 65 2d 3e 69 42 75 73 79   unixFile->iBusy
cd80: 54 69 6d 65 6f 75 74 0a 2a 2a 20 76 61 6c 75 65  Timeout.** value
cd90: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69 74   is set, then it
cda0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
cdb0: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 74  f milliseconds t
cdc0: 6f 20 77 61 69 74 20 62 65 66 6f 72 65 0a 2a 2a  o wait before.**
cdd0: 20 66 61 69 6c 69 6e 67 20 74 68 65 20 6c 6f 63   failing the loc
cde0: 6b 2e 20 20 54 68 65 20 69 42 75 73 79 54 69 6d  k.  The iBusyTim
cdf0: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 61 6c  eout value is al
ce00: 77 61 79 73 20 72 65 73 65 74 20 62 61 63 6b 20  ways reset back 
ce10: 74 6f 0a 2a 2a 20 7a 65 72 6f 20 6f 6e 20 65 61  to.** zero on ea
ce20: 63 68 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  ch call..**.** I
ce30: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ce40: 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 69 73  SETLK_TIMEOUT is
ce50: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 74 68   not defined, th
ce60: 65 6e 20 64 6f 20 61 20 6e 6f 6e 2d 62 6c 6f 63  en do a non-bloc
ce70: 6b 69 6e 67 0a 2a 2a 20 61 74 74 65 6d 70 74 20  king.** attempt 
ce80: 74 6f 20 73 65 74 20 74 68 65 20 6c 6f 63 6b 2e  to set the lock.
ce90: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
cea0: 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f  TE_ENABLE_SETLK_
ceb0: 54 49 4d 45 4f 55 54 0a 23 20 64 65 66 69 6e 65  TIMEOUT.# define
cec0: 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69 73   osSetPosixAdvis
ced0: 6f 72 79 4c 6f 63 6b 28 68 2c 78 2c 74 29 20 6f  oryLock(h,x,t) o
cee0: 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c 4b  sFcntl(h,F_SETLK
cef0: 2c 78 29 0a 23 65 6c 73 65 0a 73 74 61 74 69 63  ,x).#else.static
cf00: 20 69 6e 74 20 6f 73 53 65 74 50 6f 73 69 78 41   int osSetPosixA
cf10: 64 76 69 73 6f 72 79 4c 6f 63 6b 28 0a 20 20 69  dvisoryLock(.  i
cf20: 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
cf30: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
cf40: 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 77   descriptor on w
cf50: 68 69 63 68 20 74 6f 20 74 61 6b 65 20 74 68 65  hich to take the
cf60: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63   lock */.  struc
cf70: 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 2c 20  t flock *pLock, 
cf80: 20 2f 2a 20 54 68 65 20 64 65 73 63 72 69 70 74   /* The descript
cf90: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ion of the lock 
cfa0: 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
cfb0: 46 69 6c 65 20 20 20 20 20 20 20 2f 2a 20 53 74  File       /* St
cfc0: 72 75 63 74 75 72 65 20 68 6f 6c 64 69 6e 67 20  ructure holding 
cfd0: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2a 2f  timeout value */
cfe0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 6f  .){.  int rc = o
cff0: 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c 4b  sFcntl(h,F_SETLK
d000: 2c 70 4c 6f 63 6b 29 3b 0a 20 20 77 68 69 6c 65  ,pLock);.  while
d010: 28 20 72 63 3c 30 20 26 26 20 70 46 69 6c 65 2d  ( rc<0 && pFile-
d020: 3e 69 42 75 73 79 54 69 6d 65 6f 75 74 3e 30 20  >iBusyTimeout>0 
d030: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 20 73 79 73  ){.    /* On sys
d040: 74 65 6d 73 20 74 68 61 74 20 73 75 70 70 6f 72  tems that suppor
d050: 74 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 62  t some kind of b
d060: 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 20 6c 6f 63  locking file loc
d070: 6b 20 77 69 74 68 20 61 20 74 69 6d 65 6f 75 74  k with a timeout
d080: 2c 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 61 70  ,.    ** make ap
d090: 70 72 6f 70 72 69 61 74 65 20 63 68 61 6e 67 65  propriate change
d0a0: 73 20 68 65 72 65 20 74 6f 20 69 6e 76 6f 6b 65  s here to invoke
d0b0: 20 74 68 61 74 20 62 6c 6f 63 6b 69 6e 67 20 66   that blocking f
d0c0: 69 6c 65 20 6c 6f 63 6b 2e 20 20 4f 6e 0a 20 20  ile lock.  On.  
d0d0: 20 20 2a 2a 20 67 65 6e 65 72 69 63 20 70 6f 73    ** generic pos
d0e0: 69 78 2c 20 68 6f 77 65 76 65 72 2c 20 74 68 65  ix, however, the
d0f0: 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 41 50  re is no such AP
d100: 49 2e 20 20 53 6f 20 77 65 20 73 69 6d 70 6c 79  I.  So we simply
d110: 20 74 72 79 20 74 68 65 0a 20 20 20 20 2a 2a 20   try the.    ** 
d120: 6c 6f 63 6b 20 6f 6e 63 65 20 65 76 65 72 79 20  lock once every 
d130: 6d 69 6c 6c 69 73 65 63 6f 6e 64 20 75 6e 74 69  millisecond unti
d140: 6c 20 65 69 74 68 65 72 20 74 68 65 20 74 69 6d  l either the tim
d150: 65 6f 75 74 20 65 78 70 69 72 65 73 2c 20 6f 72  eout expires, or
d160: 20 75 6e 74 69 6c 0a 20 20 20 20 2a 2a 20 74 68   until.    ** th
d170: 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
d180: 65 64 2e 20 2a 2f 0a 20 20 20 20 75 73 6c 65 65  ed. */.    uslee
d190: 70 28 31 30 30 30 29 3b 0a 20 20 20 20 72 63 20  p(1000);.    rc 
d1a0: 3d 20 6f 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45  = osFcntl(h,F_SE
d1b0: 54 4c 4b 2c 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  TLK,pLock);.    
d1c0: 70 46 69 6c 65 2d 3e 69 42 75 73 79 54 69 6d 65  pFile->iBusyTime
d1d0: 6f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74  out--;.  }.  ret
d1e0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
d1f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
d200: 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 20  E_SETLK_TIMEOUT 
d210: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  */.../*.** Attem
d220: 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73 74  pt to set a syst
d230: 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  em-lock on the f
d240: 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20  ile pFile.  The 
d250: 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63  lock is .** desc
d260: 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a  ribed by pLock..
d270: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69  **.** If the pFi
d280: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65  le was opened re
d290: 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e  ad/write from un
d2a0: 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68  ix-excl, then th
d2b0: 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65  e only lock.** e
d2c0: 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20  ver obtained is 
d2d0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
d2e0: 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74  k, and it is obt
d2f0: 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e  ained exactly on
d300: 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ce.** the first 
d310: 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73  time any lock is
d320: 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c   attempted.  All
d330: 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73 74   subsequent syst
d340: 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70  em locking.** op
d350: 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20  erations become 
d360: 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67  no-ops.  Locking
d370: 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c   operations stil
d380: 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61  l happen interna
d390: 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  lly,.** in order
d3a0: 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61   to coordinate a
d3b0: 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65  ccess between se
d3c0: 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20  parate database 
d3d0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77  connections.** w
d3e0: 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ithin this proce
d3f0: 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74  ss, but all of t
d400: 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69  hat is handled i
d410: 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65  n memory and the
d420: 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
d430: 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61  stem does not pa
d440: 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a  rticipate..**.**
d450: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d460: 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68  s a pass-through
d470: 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c   to fcntl(F_SETL
d480: 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20 75  K) if pFile is u
d490: 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20  sing.** any VFS 
d4a0: 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78  other than "unix
d4b0: 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69  -excl" or if pFi
d4c0: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  le is opened on 
d4d0: 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61  "unix-excl".** a
d4e0: 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e  nd is read-only.
d4f0: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
d500: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
d510: 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75  all completes su
d520: 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d  ccessfully, or -
d530: 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74  1 if a call.** t
d540: 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e  o fcntl() fails.
d550: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65   In this case, e
d560: 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72  rrno is set appr
d570: 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66 63  opriately (by fc
d580: 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69  ntl())..*/.stati
d590: 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f  c int unixFileLo
d5a0: 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
d5b0: 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  le, struct flock
d5c0: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20   *pLock){.  int 
d5d0: 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  rc;.  unixInodeI
d5e0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
d5f0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
d600: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30  ssert( pInode!=0
d610: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d620: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d630: 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
d640: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 28 70  tex) );.  if( (p
d650: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
d660: 26 20 28 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  & (UNIXFILE_EXCL
d670: 7c 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59  |UNIXFILE_RDONLY
d680: 29 29 3d 3d 55 4e 49 58 46 49 4c 45 5f 45 58 43  ))==UNIXFILE_EXC
d690: 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e  L ){.    if( pIn
d6a0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
d6b0: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  k==0 ){.      st
d6c0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
d6d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d6e0: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
d6f0: 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  );.      lock.l_
d700: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
d710: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
d720: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
d730: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
d740: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
d750: 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  SIZE;.      lock
d760: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
d770: 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73  K;.      rc = os
d780: 53 65 74 50 6f 73 69 78 41 64 76 69 73 6f 72 79  SetPosixAdvisory
d790: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Lock(pFile->h, &
d7a0: 6c 6f 63 6b 2c 20 70 46 69 6c 65 29 3b 0a 20 20  lock, pFile);.  
d7b0: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20 72      if( rc<0 ) r
d7c0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
d7d0: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
d7e0: 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  Lock = 1;.      
d7f0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
d800: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d810: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a    rc = 0;.    }.
d820: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
d830: 3d 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69  = osSetPosixAdvi
d840: 73 6f 72 79 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  soryLock(pFile->
d850: 68 2c 20 70 4c 6f 63 6b 2c 20 70 46 69 6c 65 29  h, pLock, pFile)
d860: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
d870: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
d880: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
d890: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
d8a0: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
d8b0: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
d8c0: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
d8d0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
d8e0: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
d8f0: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
d900: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
d910: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
d920: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
d930: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
d940: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
d950: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
d960: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
d970: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
d980: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
d990: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
d9a0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
d9b0: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
d9c0: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
d9d0: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
d9e0: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
d9f0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
da00: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
da10: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
da20: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
da30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
da40: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
da50: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
da60: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
da70: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
da80: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
da90: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
daa0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
dab0: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
dac0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
dad0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
dae0: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
daf0: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
db00: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
db10: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
db20: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
db30: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
db40: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
db50: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
db60: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
db70: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
db80: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
db90: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
dba0: 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71   int unixLock(sq
dbb0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
dbc0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
dbd0: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
dbe0: 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65  ng describes the
dbf0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
dc00: 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  of the various l
dc10: 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  ocks and.  ** lo
dc20: 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69  ck transitions i
dc30: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50  n terms of the P
dc40: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68  OSIX advisory sh
dc50: 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69  ared and exclusi
dc60: 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69  ve.  ** lock pri
dc70: 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20  mitives (called 
dc80: 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77  read-locks and w
dc90: 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77  rite-locks below
dca0: 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20  , to avoid.  ** 
dcb0: 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53  confusion with S
dcc0: 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73  QLite lock names
dcd0: 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d  ). The algorithm
dce0: 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65  s are complicate
dcf0: 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20  d.  ** slightly 
dd00: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
dd10: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 57  ompatible with W
dd20: 69 6e 64 6f 77 73 39 35 20 73 79 73 74 65 6d 73  indows95 systems
dd30: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a   simultaneously.
dd40: 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74    ** accessing t
dd50: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
dd60: 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74   file, in case t
dd70: 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75  hat is ever requ
dd80: 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ired..  **.  ** 
dd90: 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20  Symbols defined 
dda0: 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66  in os.h indentif
ddb0: 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  y the 'pending b
ddc0: 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65  yte' and the 're
ddd0: 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65  served.  ** byte
dde0: 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62  ', each single b
ddf0: 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f  ytes at well kno
de00: 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20  wn offsets, and 
de10: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
de20: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20  .  ** range', a 
de30: 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74  range of 510 byt
de40: 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f  es at a well kno
de50: 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a  wn offset..  **.
de60: 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61    ** To obtain a
de70: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20   SHARED lock, a 
de80: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  read-lock is obt
de90: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65  ained on the 'pe
dea0: 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27  nding.  ** byte'
deb0: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75  .  If this is su
dec0: 63 63 65 73 73 66 75 6c 2c 20 27 73 68 61 72 65  ccessful, 'share
ded0: 64 20 62 79 74 65 20 72 61 6e 67 65 27 20 69 73  d byte range' is
dee0: 20 72 65 61 64 2d 6c 6f 63 6b 65 64 0a 20 20 2a   read-locked.  *
def0: 2a 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  * and the lock o
df00: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
df10: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 20 20  yte' released.  
df20: 28 4c 65 67 61 63 79 20 6e 6f 74 65 3a 20 20 57  (Legacy note:  W
df30: 68 65 6e 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20  hen.  ** SQLite 
df40: 77 61 73 20 66 69 72 73 74 20 64 65 76 65 6c 6f  was first develo
df50: 70 65 64 2c 20 57 69 6e 64 6f 77 73 39 35 20 73  ped, Windows95 s
df60: 79 73 74 65 6d 73 20 77 65 72 65 20 73 74 69 6c  ystems were stil
df70: 6c 20 76 65 72 79 20 63 6f 6d 6d 6f 6e 2c 0a 20  l very common,. 
df80: 20 2a 2a 20 61 6e 64 20 57 69 64 6e 6f 77 73 39   ** and Widnows9
df90: 35 20 6c 61 63 6b 73 20 61 20 73 68 61 72 65 64  5 lacks a shared
dfa0: 2d 6c 6f 63 6b 20 63 61 70 61 62 69 6c 69 74 79  -lock capability
dfb0: 2e 20 20 53 6f 20 6f 6e 20 57 69 6e 64 6f 77 73  .  So on Windows
dfc0: 39 35 2c 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c  95, a.  ** singl
dfd0: 65 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63  e randomly selec
dfe0: 74 65 64 20 62 79 20 66 72 6f 6d 20 74 68 65 20  ted by from the 
dff0: 27 73 68 61 72 65 64 20 62 79 74 65 20 72 61 6e  'shared byte ran
e000: 67 65 27 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20  ge' is locked.. 
e010: 20 2a 2a 20 57 69 6e 64 6f 77 73 39 35 20 69 73   ** Windows95 is
e020: 20 6e 6f 77 20 70 72 65 74 74 79 20 6d 75 63 68   now pretty much
e030: 20 65 78 74 69 6e 63 74 2c 20 62 75 74 20 74 68   extinct, but th
e040: 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 66  is work-around f
e050: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6c 61 63 6b  or the.  ** lack
e060: 20 6f 66 20 73 68 61 72 65 64 2d 6c 6f 63 6b 73   of shared-locks
e070: 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35 20 6c 69   on Windows95 li
e080: 76 65 73 20 6f 6e 2c 20 66 6f 72 20 62 61 63 6b  ves on, for back
e090: 77 61 72 64 73 0a 20 20 2a 2a 20 63 6f 6d 70 61  wards.  ** compa
e0a0: 74 69 62 69 6c 69 74 79 2e 29 0a 20 20 2a 2a 0a  tibility.).  **.
e0b0: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
e0c0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
e0d0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
e0e0: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
e0f0: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
e100: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
e110: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
e120: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
e130: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
e140: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
e150: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
e160: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
e170: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
e180: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
e190: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
e1a0: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
e1b0: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
e1c0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
e1d0: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
e1e0: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
e1f0: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
e200: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
e210: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
e220: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
e230: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
e240: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
e250: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
e260: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
e270: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
e280: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
e290: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
e2a0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
e2b0: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
e2c0: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
e2d0: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
e2e0: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
e2f0: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
e300: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
e310: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
e320: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
e330: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
e340: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
e350: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
e360: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
e370: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
e380: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
e390: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
e3a0: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
e3b0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
e3c0: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
e3d0: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
e3e0: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
e3f0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
e400: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
e410: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
e420: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
e430: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
e440: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
e450: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2f 0a  database. .  */.
e460: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e470: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
e480: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
e490: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
e4a0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
e4b0: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
e4c0: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72   lock;.  int tEr
e4d0: 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  rno = 0;..  asse
e4e0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
e4f0: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
e500: 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
e510: 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69  ,%d) pid=%d (uni
e520: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
e530: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
e540: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a  k(eFileLock), az
e550: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
e560: 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  eFileLock),.    
e570: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69    azFileLock(pFi
e580: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
e590: 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70  eLock), pFile->p
e5a0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
e5b0: 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30        osGetpid(0
e5c0: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
e5d0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
e5e0: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
e5f0: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
e600: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
e610: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
e620: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
e630: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
e640: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
e650: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
e660: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
e670: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
e680: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
e690: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
e6a0: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
e6b0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
e6c0: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
e6d0: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
e6e0: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
e6f0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
e700: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
e710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e720: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
e730: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
e740: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
e750: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
e760: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
e770: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
e780: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
e790: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
e7a0: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
e7b0: 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
e7c0: 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
e7d0: 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
e7e0: 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
e7f0: 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
e800: 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
e810: 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
e820: 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
e830: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
e840: 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
e850: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
e860: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
e870: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
e880: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
e890: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
e8a0: 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
e8b0: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
e8c0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
e8d0: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
e8e0: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
e8f0: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
e900: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
e910: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
e920: 61 64 73 0a 20 20 2a 2f 0a 20 20 70 49 6e 6f 64  ads.  */.  pInod
e930: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
e940: 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  e;.  sqlite3_mut
e950: 65 78 5f 65 6e 74 65 72 28 70 49 6e 6f 64 65 2d  ex_enter(pInode-
e960: 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 0a 20  >pLockMutex);.. 
e970: 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
e980: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
e990: 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
e9a0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
e9b0: 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
e9c0: 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
e9d0: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
e9e0: 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
e9f0: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
ea00: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
ea10: 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
ea20: 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ck && .         
ea30: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
ea40: 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
ea50: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
ea60: 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  HARED_LOCK)).  )
ea70: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
ea80: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
ea90: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
eaa0: 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
eab0: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
eac0: 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
ead0: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
eae0: 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
eaf0: 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
eb00: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
eb10: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
eb20: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
eb30: 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
eb40: 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
eb50: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
eb60: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
eb70: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
eb80: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
eb90: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
eba0: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
ebb0: 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
ebc0: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
ebd0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ebe0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ebf0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ec00: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
ec10: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
ec20: 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
ec30: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
ec40: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
ec50: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
ec60: 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
ec70: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
ec80: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
ec90: 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
eca0: 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
ecb0: 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
ecc0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
ecd0: 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
ece0: 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
ecf0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
ed00: 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
ed10: 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
ed20: 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
ed30: 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e  ed..  */.  lock.
ed40: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f  l_len = 1L;.  lo
ed50: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ed60: 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46  EK_SET;.  if( eF
ed70: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
ed80: 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
ed90: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
eda0: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
edb0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
edc0: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
edd0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
ede0: 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   = (eFileLock==S
edf0: 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c  HARED_LOCK?F_RDL
ee00: 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20  CK:F_WRLCK);.   
ee10: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
ee20: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
ee30: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
ee40: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
ee50: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
ee60: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
ee70: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
ee80: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
ee90: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
eea0: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
eeb0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
eec0: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
eed0: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
eee0: 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
eef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
ef00: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
ef10: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20  }.  }...  /* If 
ef20: 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
ef30: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
ef40: 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
ef50: 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
ef60: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
ef70: 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
ef80: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
ef90: 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
efa0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
efb0: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
efc0: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
efd0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
efe0: 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
eff0: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
f000: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
f010: 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
f020: 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
f030: 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63  -lock */.    loc
f040: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
f050: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f  ED_FIRST;.    lo
f060: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
f070: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20  D_SIZE;.    if( 
f080: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
f090: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
f0a0: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
f0b0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
f0c0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
f0d0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
f0e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
f0f0: 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  CK);.    }..    
f100: 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
f110: 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
f120: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
f130: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
f140: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
f150: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
f160: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
f170: 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75  UNLCK;.    if( u
f180: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f190: 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d  e, &lock) && rc=
f1a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f1b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c      /* This coul
f1c0: 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20  d happen with a 
f1d0: 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f  network mount */
f1e0: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
f1f0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
f200: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
f210: 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20  NLOCK; .    }.. 
f220: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
f230: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f240: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
f250: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
f260: 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
f270: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
f280: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
f290: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
f2a0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
f2b0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
f2c0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
f2d0: 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
f2e0: 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
f2f0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
f300: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
f310: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
f320: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
f330: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
f340: 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
f350: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
f360: 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
f370: 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a  ad in this.    *
f380: 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
f390: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
f3a0: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
f3b0: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
f3c0: 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
f3d0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
f3e0: 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
f3f0: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
f400: 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
f410: 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
f420: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
f430: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
f440: 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
f450: 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
f460: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  y..    */.    as
f470: 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
f480: 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
f490: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
f4a0: 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73  _WRLCK;..    ass
f4b0: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
f4c0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
f4d0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
f4e0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
f4f0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
f500: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
f510: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  {.      lock.l_s
f520: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
f530: 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  BYTE;.      lock
f540: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
f550: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f   }else{.      lo
f560: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
f570: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
f580: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
f590: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d  ARED_SIZE;.    }
f5a0: 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ..    if( unixFi
f5b0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
f5c0: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45  ock) ){.      tE
f5d0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
f5e0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
f5f0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
f600: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
f610: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
f620: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
f630: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
f640: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
f650: 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
f660: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f670: 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20  .  }.  ..#ifdef 
f680: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
f690: 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61  * Set up the tra
f6a0: 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72  nsaction-counter
f6b0: 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67   change checking
f6c0: 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a   flags when.  **
f6d0: 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
f6e0: 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20  rom a SHARED to 
f6f0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
f700: 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a    The change.  *
f710: 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  * from SHARED to
f720: 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20   RESERVED marks 
f730: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
f740: 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77   a normal.  ** w
f750: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28  rite operation (
f760: 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  not a hot journa
f770: 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a  l rollback)..  *
f780: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
f790: 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c  TE_OK.   && pFil
f7a0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  e->eFileLock<=SH
f7b0: 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20  ARED_LOCK.   && 
f7c0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
f7d0: 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20  VED_LOCK.  ){.  
f7e0: 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
f7f0: 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  trChng = 0;.    
f800: 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
f810: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
f820: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
f830: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  1;.  }.#endif...
f840: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f850: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
f860: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
f870: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e  ileLock;.    pIn
f880: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
f890: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65   eFileLock;.  }e
f8a0: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
f8b0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
f8c0: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
f8d0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
f8e0: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  ING_LOCK;.    pI
f8f0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
f900: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
f910: 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20    }..end_lock:. 
f920: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f930: 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f  eave(pInode->pLo
f940: 63 6b 4d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ckMutex);.  OSTR
f950: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
f960: 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22   %s %s (unix)\n"
f970: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
f980: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
f990: 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
f9a0: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
f9b0: 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
f9c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f9d0: 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20  ** Add the file 
f9e0: 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20  descriptor used 
f9f0: 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70  by file handle p
fa00: 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72  File to the corr
fa10: 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e  esponding.** pUn
fa20: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  used list..*/.st
fa30: 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e  atic void setPen
fa40: 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20  dingFd(unixFile 
fa50: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
fa60: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
fa70: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
fa80: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
fa90: 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 50 72   *p = pFile->pPr
faa0: 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
fab0: 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
fac0: 46 69 6c 65 4d 75 74 65 78 48 65 6c 64 28 70 46  FileMutexHeld(pF
fad0: 69 6c 65 29 20 29 3b 0a 20 20 70 2d 3e 70 4e 65  ile) );.  p->pNe
fae0: 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  xt = pInode->pUn
faf0: 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e  used;.  pInode->
fb00: 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70  pUnused = p;.  p
fb10: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
fb20: 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63  pFile->pPrealloc
fb30: 61 74 65 64 55 6e 75 73 65 64 20 3d 20 30 3b 0a  atedUnused = 0;.
fb40: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
fb50: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
fb60: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
fb70: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
fb80: 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
fb90: 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
fba0: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
fbb0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
fbc0: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
fbd0: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
fbe0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
fbf0: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
fc00: 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
fc10: 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
fc20: 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
fc30: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
fc40: 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e  * .** If handleN
fc50: 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65  FSUnlock is true
fc60: 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72  , then on downgr
fc70: 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  ading an EXCLUSI
fc80: 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45  VE_LOCK to SHARE
fc90: 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61  D.** the byte ra
fca0: 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20 69  nge is divided i
fcb0: 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20  nto 2 parts and 
fcc0: 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 69  the first part i
fcd0: 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a  s unlocked then.
fce0: 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61 64  ** set to a read
fcf0: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
fd00: 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73 69  other part is si
fd10: 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  mply unlocked.  
fd20: 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61  This works .** a
fd30: 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42  round a bug in B
fd40: 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c  SD NFS lockd (al
fd50: 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53  so seen on MacOS
fd60: 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61  X 10.3+) that fa
fd70: 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76  ils to .** remov
fd80: 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
fd90: 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65   on a region whe
fda0: 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
fdb0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
fdc0: 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  int posixUnlock(
fdd0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
fde0: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c  , int eFileLock,
fdf0: 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e   int handleNFSUn
fe00: 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c  lock){.  unixFil
fe10: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
fe20: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
fe30: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
fe40: 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  e;.  struct floc
fe50: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63  k lock;.  int rc
fe60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
fe70: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
fe80: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
fe90: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
fea0: 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
feb0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
fec0: 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
fed0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
fee0: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
fef0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
ff00: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
ff10: 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->nShared,.     
ff20: 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
ff30: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
ff40: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
ff50: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
ff60: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
ff70: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
ff80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ff90: 20 20 7d 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70    }.  pInode = p
ffa0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
ffb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
ffc0: 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  ter(pInode->pLoc
ffd0: 6b 4d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  kMutex);.  asser
ffe0: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
fff0: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
10000 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
10010 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
10020 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
10030 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
10040 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
10050 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
10060 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68  _DEBUG.    /* Wh
10070 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f  en reducing a lo
10080 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68  ck such that oth
10090 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  er processes can
100a0 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65   start.    ** re
100b0 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
100c0 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d  se file again, m
100d0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
100e0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
100f0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
10100 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20   updated if any 
10110 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
10120 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
10130 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
10140 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
10150 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64  unter is not upd
10160 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68  ated,.    ** oth
10170 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  er connections t
10180 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  o the same file 
10190 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a  might not realiz
101a0 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
101b0 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67  e file has chang
101c0 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67  ed and hence mig
101d0 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66  ht not know to f
101e0 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a  lush their.    *
101f0 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73  * cache.  The us
10200 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63  e of a stale cac
10210 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  he can lead to d
10220 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
10230 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
10240 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
10250 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ite = 0;.#endif.
10260 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64  .    /* downgrad
10270 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64 20  ing to a shared 
10280 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f  lock on NFS invo
10290 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68  lves clearing th
102a0 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20  e write lock.   
102b0 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62   ** before estab
102c0 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61 64  lishing the read
102d0 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20  lock - to avoid 
102e0 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
102f0 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20   we downgrade.  
10300 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e    ** the lock in
10310 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68   2 blocks, so th
10320 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  at part of the r
10330 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76  ange will be cov
10340 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a  ered by a .    *
10350 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74  * write lock unt
10360 69 6c 20 74 68 65 20 72 65 73 74 20 69 73 20 63  il the rest is c
10370 6f 76 65 72 65 64 20 62 79 20 61 20 72 65 61 64  overed by a read
10380 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31   lock:.    **  1
10390 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20  :   [WWWWW].    
103a0 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d  **  2:   [....W]
103b0 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52  .    **  3:   [R
103c0 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a  RRRW].    **  4:
103d0 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a     [RRRR.].    *
103e0 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c  /.    if( eFileL
103f0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
10400 20 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   ){.#if !defined
10410 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21  (__APPLE__) || !
10420 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
10430 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
10440 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46    (void)handleNF
10450 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61  SUnlock;.      a
10460 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53  ssert( handleNFS
10470 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e  Unlock==0 );.#en
10480 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
10490 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
104a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
104b0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20  ING_STYLE.      
104c0 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  if( handleNFSUnl
104d0 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ock ){.        i
104e0 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  nt tErrno;      
104f0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
10500 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74  r code from syst
10510 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a  em call errors *
10520 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  /.        off_t 
10530 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44  divSize = SHARED
10540 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20  _SIZE - 1;.     
10550 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b     .        lock
10560 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
10570 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
10580 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
10590 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
105a0 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
105b0 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
105c0 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
105d0 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
105e0 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
105f0 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
10600 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
10610 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
10620 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
10630 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
10640 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
10650 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
10660 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
10670 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
10680 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
10690 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
106a0 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
106b0 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
106c0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
106d0 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
106e0 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
106f0 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
10700 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
10710 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
10720 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
10730 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
10740 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
10750 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
10760 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
10770 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
10780 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
10790 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
107a0 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
107b0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
107c0 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
107d0 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
107e0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
107f0 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
10800 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
10810 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
10820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10830 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
10840 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  UNLCK;.        l
10850 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
10860 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
10870 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
10880 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76  SHARED_FIRST+div
10890 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f  Size;.        lo
108a0 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
108b0 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a  D_SIZE-divSize;.
108c0 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
108d0 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
108e0 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
108f0 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
10900 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
10910 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10920 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
10930 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
10940 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
10950 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
10960 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
10970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10980 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
10990 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
109a0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
109b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
109c0 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  YLE */.      {. 
109d0 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
109e0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
109f0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
10a00 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
10a10 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
10a20 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
10a30 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
10a40 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
10a50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69  _SIZE;.        i
10a60 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
10a70 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
10a80 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
10a90 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c   theory, the cal
10aa0 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63  l to unixFileLoc
10ab0 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  k() cannot fail 
10ac0 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a  because another.
10ad0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
10ae0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
10af0 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
10b00 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73  lock. If it does
10b10 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  , this .        
10b20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74    ** indicates t
10b30 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72  hat the other pr
10b40 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
10b50 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69  lowing the locki
10b60 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
10b70 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69  protocol. If thi
10b80 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72  s happens, retur
10b90 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
10ba0 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67  DLOCK. Returning
10bb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
10bc0 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20  LITE_BUSY would 
10bd0 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65  confuse the uppe
10be0 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63  r layer (in prac
10bf0 74 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a  tice it causes .
10c00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
10c10 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e  assert to fail).
10c20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72   */ .          r
10c30 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
10c40 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _RDLOCK;.       
10c50 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
10c60 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
10c70 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
10c80 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
10c90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10ca0 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74    }.    lock.l_t
10cb0 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
10cc0 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
10cd0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
10ce0 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
10cf0 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
10d00 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32    lock.l_len = 2
10d10 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44  L;  assert( PEND
10d20 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45  ING_BYTE+1==RESE
10d30 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20  RVED_BYTE );.   
10d40 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
10d50 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
10d60 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  =0 ){.      pIno
10d70 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
10d80 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
10d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
10da0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
10db0 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74  UNLOCK;.      st
10dc0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
10dd0 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
10de0 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
10df0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
10e00 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  f( eFileLock==NO
10e10 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
10e20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
10e30 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
10e40 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
10e50 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
10e60 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
10e70 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
10e80 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
10e90 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
10ea0 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
10eb0 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
10ec0 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
10ed0 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
10ee0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
10ef0 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
10f00 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
10f10 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
10f20 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
10f30 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
10f40 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
10f50 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20  = 0L;.      if( 
10f60 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
10f70 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  le, &lock)==0 ){
10f80 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
10f90 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
10fa0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
10fb0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
10fc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
10fd0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 73 74 6f  OCK;.        sto
10fe0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
10ff0 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
11000 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
11010 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
11020 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
11030 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
11040 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
11050 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
11060 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
11070 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
11080 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
11090 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
110a0 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
110b0 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
110c0 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
110d0 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
110e0 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
110f0 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
11100 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
11110 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  s..    */.    pI
11120 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
11130 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
11140 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
11150 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
11160 4c 6f 63 6b 3d 3d 30 20 29 20 63 6c 6f 73 65 50  Lock==0 ) closeP
11170 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
11180 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63  ;.  }..end_unloc
11190 6b 3a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  k:.  sqlite3_mut
111a0 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d  ex_leave(pInode-
111b0 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20  >pLockMutex);.  
111c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
111d0 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
111e0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
111f0 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  eLock;.  }.  ret
11200 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11210 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
11220 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
11230 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
11240 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
11250 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
11260 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
11270 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
11280 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
11290 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
112a0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
112b0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
112c0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
112d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
112e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
112f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
11300 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
11310 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
11320 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11330 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
11340 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
11350 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61  _MMAP_SIZE>0.  a
11360 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
11370 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
11380 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64   ((unixFile *)id
11390 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  )->nFetchOut==0 
113a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
113b0 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69  rn posixUnlock(i
113c0 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29  d, eFileLock, 0)
113d0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
113e0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
113f0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
11400 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
11410 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29  *pFd, i64 nByte)
11420 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  ;.static void un
11430 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78  ixUnmapfile(unix
11440 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64  File *pFd);.#end
11450 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
11460 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73  unction performs
11470 20 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68   the parts of th
11480 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f  e "close file" o
11490 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d  peration .** com
114a0 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69  mon to all locki
114b0 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63  ng schemes. It c
114c0 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74  loses the direct
114d0 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20  ory and file.** 
114e0 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79  handles, if they
114f0 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20   are valid, and 
11500 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20  sets all fields 
11510 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a  of the unixFile.
11520 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ** structure to 
11530 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a  0..**.** It is *
11540 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74  not* necessary t
11550 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
11560 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
11570 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  ne is called,.**
11580 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73   even on VxWorks
11590 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20  .  A mutex will 
115a0 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56  be acquired on V
115b0 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a  xWorks by the.**
115c0 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46   vxworksReleaseF
115d0 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e  ileId() routine.
115e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
115f0 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c  loseUnixFile(sql
11600 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
11610 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11620 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11630 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  d;.#if SQLITE_MA
11640 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
11650 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
11660 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  ile);.#endif.  i
11670 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29  f( pFile->h>=0 )
11680 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  {.    robust_clo
11690 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  se(pFile, pFile-
116a0 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
116b0 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31     pFile->h = -1
116c0 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57  ;.  }.#if OS_VXW
116d0 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65  ORKS.  if( pFile
116e0 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28  ->pId ){.    if(
116f0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
11700 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  s & UNIXFILE_DEL
11710 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  ETE ){.      osU
11720 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64  nlink(pFile->pId
11730 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
11740 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77  );.    }.    vxw
11750 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
11760 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20  d(pFile->pId);. 
11770 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20     pFile->pId = 
11780 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  0;.  }.#endif.#i
11790 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49  fdef SQLITE_UNLI
117a0 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20  NK_AFTER_CLOSE. 
117b0 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
117c0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
117d0 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f  _DELETE ){.    o
117e0 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a  sUnlink(pFile->z
117f0 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
11800 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a 2a  e3_free(*(char**
11810 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  )&pFile->zPath);
11820 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74  .    pFile->zPat
11830 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  h = 0;.  }.#endi
11840 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c  f.  OSTRACE(("CL
11850 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  OSE   %-3d\n", p
11860 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65  File->h));.  Ope
11870 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
11880 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
11890 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65  le->pPreallocate
118a0 64 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73  dUnused);.  mems
118b0 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
118c0 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
118d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
118e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
118f0 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
11900 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
11910 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
11920 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
11930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
11940 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11950 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
11960 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
11970 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
11980 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 61 73 73 65  >pInode;..  asse
11990 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b  rt( pInode!=0 );
119a0 0a 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28  .  verifyDbFile(
119b0 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e  pFile);.  unixUn
119c0 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
119d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  );.  assert( uni
119e0 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c  xFileMutexNothel
119f0 64 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 75 6e  d(pFile) );.  un
11a00 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
11a10 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70  .  /* unixFile.p
11a20 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20  Inode is always 
11a30 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65  valid here. Othe
11a40 72 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65  rwise, a differe
11a50 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f  nt close.  ** ro
11a60 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f  utine (e.g. nolo
11a70 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64  ckClose()) would
11a80 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
11a90 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ad..  */.  asser
11aa0 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  t( pFile->pInode
11ab0 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69  ->nLock>0 || pFi
11ac0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  le->pInode->bPro
11ad0 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  cessLock==0 );. 
11ae0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11af0 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f  nter(pInode->pLo
11b00 63 6b 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ckMutex);.  if( 
11b10 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
11b20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
11b30 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
11b40 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
11b50 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
11b60 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
11b70 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
11b80 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
11b90 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
11ba0 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
11bb0 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72  ile.    ** descr
11bc0 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
11bd0 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
11be0 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
11bf0 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
11c00 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  .    ** when the
11c10 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
11c20 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
11c30 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
11c40 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  File);.  }.  sql
11c50 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
11c60 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
11c70 74 65 78 29 3b 0a 20 20 72 65 6c 65 61 73 65 49  tex);.  releaseI
11c80 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
11c90 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
11ca0 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69  xFile(id);.  uni
11cb0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
11cc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
11ce0 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20  nd of the posix 
11cf0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d  advisory lock im
11d00 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
11d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
11d70 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
11d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
11de0 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  o-op Locking ***
11df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11e10 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72  **.** Of the var
11e20 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  ious locking imp
11e30 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61  lementations ava
11e40 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20  ilable, this is 
11e50 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69  by far the.** si
11e60 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67  mplest:  locking
11e70 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f   is ignored.  No
11e80 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
11e90 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74   to lock the dat
11ea0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f  abase.** file fo
11eb0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  r reading or wri
11ec0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ting..**.** This
11ed0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
11ee0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
11ef0 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c   use on read-onl
11f00 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28  y databases.** (
11f10 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68  ex: databases th
11f20 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e  at are burned in
11f30 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65  to CD-ROM, for e
11f40 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e  xample.)  It can
11f50 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64  .** also be used
11f60 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   if the applicat
11f70 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65  ion employs some
11f80 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e   external mechan
11f90 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e  ism to.** preven
11fa0 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61  t simultaneous a
11fb0 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d  ccess of the sam
11fc0 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77  e database by tw
11fd0 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74  o or more.** dat
11fe0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11ff0 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  s.  But there is
12000 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20   a serious risk 
12010 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  of database.** c
12020 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69  orruption if thi
12030 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
12040 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74  s used in situat
12050 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69  ions where multi
12060 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ple.** database 
12070 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
12080 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
12090 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
120a0 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   at the same.** 
120b0 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20  time and one or 
120c0 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f  more of those co
120d0 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72  nnections are wr
120e0 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69  iting..*/..stati
120f0 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63  c int nolockChec
12100 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
12110 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
12120 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  sed, int *pResOu
12130 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
12140 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
12150 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b  .  *pResOut = 0;
12160 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12170 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
12180 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  t nolockLock(sql
12190 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
121a0 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
121b0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
121c0 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
121d0 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
121e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
121f0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
12200 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
12210 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
12220 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
12230 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12240 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
12250 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
12260 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12270 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69  .** Close the fi
12280 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
12290 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  t nolockClose(sq
122a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
122b0 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65  {.  return close
122c0 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a  UnixFile(id);.}.
122d0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
122e0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
122f0 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c   no-op lock impl
12300 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
12310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12320 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
12330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
12370 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
12380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123c0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
123d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
123e0 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69  n dot-file Locki
123f0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
12400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12410 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66  *.**.** The dotf
12420 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ile locking impl
12430 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
12440 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66  the existence of
12450 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a   separate lock.*
12460 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20  * files (really 
12470 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20  a directory) to 
12480 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74  control access t
12490 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
124a0 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f   This works.** o
124b0 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65  n just about eve
124c0 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d  ry filesystem im
124d0 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74  aginable.  But t
124e0 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73  here are serious
124f0 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a   downsides:.**.*
12500 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20  *    (1)  There 
12510 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65  is zero concurre
12520 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72  ncy.  A single r
12530 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c  eader blocks all
12540 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
12550 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72    connections fr
12560 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  om reading or wr
12570 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
12580 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
12590 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e    An application
125a0 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20   crash or power 
125b0 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73  loss can leave s
125c0 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a  tale lock files.
125d0 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69  **         sitti
125e0 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e  ng around that n
125f0 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
12600 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a  d manually..**.*
12610 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20  * Nevertheless, 
12620 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20  a dotlock is an 
12630 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  appropriate lock
12640 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65  ing mode for use
12650 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20   if no.** other 
12660 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
12670 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
12680 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63  *.** Dotfile loc
12690 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72  king works by cr
126a0 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65  eating a subdire
126b0 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d  ctory in the sam
126c0 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a  e directory as.*
126d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
126e0 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  nd with the same
126f0 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61   name but with a
12700 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69   ".lock" extensi
12710 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65  on added..** The
12720 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20   existence of a 
12730 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69  lock directory i
12740 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
12750 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
12760 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70  ther.** lock typ
12770 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
12780 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
12790 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
127a0 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
127b0 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
127c0 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
127d0 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
127e0 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
127f0 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
12800 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f  ck directory..*/
12810 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b  .#define DOTLOCK
12820 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a  _SUFFIX ".lock".
12830 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12840 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
12850 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
12860 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
12870 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
12880 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
12890 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
128a0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
128b0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
128c0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
128d0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
128e0 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
128f0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
12900 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
12910 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
12920 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
12930 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
12940 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
12950 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  k checking..**.*
12960 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63  * In dotfile loc
12970 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c  king, either a l
12980 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74  ock exists or it
12990 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69   does not.  So i
129a0 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74  n this.** variat
129b0 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65  ion of CheckRese
129c0 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65  rvedLock(), *pRe
129d0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  sOut is set to t
129e0 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a  rue if any lock.
129f0 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ** is held on th
12a00 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65  e file and false
12a10 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
12a20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61  unlocked..*/.sta
12a30 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
12a40 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
12a50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12a60 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
12a70 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
12a80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
12a90 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
12aa0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
12ab0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
12ac0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
12ad0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
12ae0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
12af0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
12b00 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12b10 20 29 3b 0a 20 20 72 65 73 65 72 76 65 64 20 3d   );.  reserved =
12b20 20 6f 73 41 63 63 65 73 73 28 28 63 6f 6e 73 74   osAccess((const
12b30 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f   char*)pFile->lo
12b40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29  ckingContext, 0)
12b50 3d 3d 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ==0;.  OSTRACE((
12b60 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
12b70 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
12b80 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
12b90 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
12ba0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
12bb0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
12bc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
12bd0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
12be0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
12bf0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
12c00 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
12c10 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
12c20 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
12c30 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
12c40 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
12c50 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
12c60 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
12c70 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
12c80 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
12c90 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
12ca0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
12cb0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
12cc0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
12cd0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
12ce0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
12cf0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
12d00 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
12d10 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
12d20 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
12d30 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
12d40 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
12d50 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
12d60 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
12d70 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
12d80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
12d90 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
12da0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
12db0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
12dc0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
12dd0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
12de0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
12df0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
12e00 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
12e10 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
12e20 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
12e30 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
12e40 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
12e50 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
12e60 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
12e70 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
12e80 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
12e90 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
12ea0 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
12eb0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
12ec0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
12ed0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
12ee0 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
12ef0 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
12f00 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
12f10 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
12f20 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
12f30 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
12f40 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
12f50 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
12f60 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
12f70 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
12f80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12f90 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
12fa0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
12fb0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
12fc0 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f  )id;.  char *zLo
12fd0 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
12fe0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
12ff0 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63  ontext;.  int rc
13000 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a   = SQLITE_OK;...
13010 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
13020 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  any lock, then t
13030 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  he lock file alr
13040 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c  eady exists.  Al
13050 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  l we have.  ** t
13060 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f  o do is adjust o
13070 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  ur internal reco
13080 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c  rd of the lock l
13090 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  evel..  */.  if(
130a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
130b0 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  k > NO_LOCK ){. 
130c0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
130d0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
130e0 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75  .    /* Always u
130f0 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74  pdate the timest
13100 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66  amp on the old f
13110 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41  ile */.#ifdef HA
13120 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69  VE_UTIME.    uti
13130 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  me(zLockFile, NU
13140 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75  LL);.#else.    u
13150 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
13160 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
13170 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13180 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
13190 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
131a0 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20  ve lock */.  rc 
131b0 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46  = osMkdir(zLockF
131c0 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66  ile, 0777);.  if
131d0 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ( rc<0 ){.    /*
131e0 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f   failed to open/
131f0 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20  create the lock 
13200 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20  directory */.   
13210 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
13220 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
13230 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
13240 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
13250 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
13260 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
13270 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
13280 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
13290 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
132a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
132b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
132c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
132d0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
132e0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
132f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
13300 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a  urn rc;.  } .  .
13310 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
13320 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
13330 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
13340 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
13350 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
13360 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13370 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
13380 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
13390 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
133a0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
133b0 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
133c0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
133d0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
133e0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
133f0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
13400 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
13410 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
13420 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
13430 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
13440 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
13450 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
13460 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  no-op..**.** Whe
13470 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  n the locking le
13480 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c  vel reaches NO_L
13490 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20  OCK, delete the 
134a0 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  lock file..*/.st
134b0 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
134c0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
134d0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
134e0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
134f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13500 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
13510 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
13520 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
13530 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
13540 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
13550 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
13560 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
13570 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
13580 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  id=%d (dotlock)\
13590 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
135a0 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
135b0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
135c0 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30  Lock, osGetpid(0
135d0 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
135e0 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
135f0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
13600 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
13610 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
13620 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
13630 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
13640 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13650 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f  .  }..  /* To do
13660 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65  wngrade to share
13670 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65  d, simply update
13680 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   our internal no
13690 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
136a0 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f   lock state.  No
136b0 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69   need to mess wi
136c0 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  th the file on d
136d0 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  isk..  */.  if( 
136e0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
136f0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  D_LOCK ){.    pF
13700 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
13710 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
13720 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13730 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
13740 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20  To fully unlock 
13750 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65  the database, de
13760 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69  lete the lock fi
13770 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  le */.  assert( 
13780 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
13790 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52  CK );.  rc = osR
137a0 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b  mdir(zLockFile);
137b0 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20  .  if( rc<0 ){. 
137c0 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
137d0 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74  errno;.    if( t
137e0 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b  Errno==ENOENT ){
137f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
13800 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
13810 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
13820 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
13830 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
13840 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
13850 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
13860 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
13870 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
13880 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
13890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
138a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
138b0 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20  e a file.  Make 
138c0 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  sure the lock ha
138d0 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  s been released 
138e0 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a  before closing..
138f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
13900 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  tlockClose(sqlit
13910 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
13920 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
13930 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
13940 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ;.  assert( id!=
13950 30 20 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  0 );.  dotlockUn
13960 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
13970 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
13980 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
13990 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 65 74 75  Context);.  retu
139a0 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
139b0 28 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  (id);.}./*******
139c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
139d0 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
139e0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
139f0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
13a00 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
13a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a50 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
13a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13aa0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
13ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ac0 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
13ad0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
13ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13af0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
13b00 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
13b10 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
13b20 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
13b30 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
13b40 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
13b50 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
13b60 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
13b70 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
13b80 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
13b90 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
13ba0 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
13bb0 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
13bc0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
13bd0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
13be0 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
13bf0 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
13c00 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
13c10 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
13c20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
13c30 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
13c40 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
13c50 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
13c60 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
13c70 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
13c80 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
13c90 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
13ca0 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
13cb0 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
13cc0 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
13cd0 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
13ce0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
13cf0 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
13d00 66 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.*/.#if SQLITE_
13d10 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
13d20 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  TYLE../*.** Retr
13d30 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20  y flock() calls 
13d40 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45  that fail with E
13d50 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45  INTR.*/.#ifdef E
13d60 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20  INTR.static int 
13d70 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74  robust_flock(int
13d80 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20   fd, int op){.  
13d90 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63  int rc;.  do{ rc
13da0 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b   = flock(fd,op);
13db0 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
13dc0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
13dd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13de0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72  #else.# define r
13df0 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29  obust_flock(a,b)
13e00 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64   flock(a,b).#end
13e10 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  if.     ../*.** 
13e20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
13e30 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
13e40 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
13e50 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
13e60 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
13e70 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
13e80 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
13e90 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
13ea0 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
13eb0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
13ec0 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
13ed0 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
13ee0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
13ef0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
13f00 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
13f10 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
13f20 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
13f30 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
13f40 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
13f50 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  nt flockCheckRes
13f60 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
13f70 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13f80 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
13f90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13fa0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
13fb0 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
13fc0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13fd0 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d  le*)id;.  .  Sim
13fe0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
13ff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14000 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
14010 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
14020 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
14030 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
14040 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
14050 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
14060 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
14070 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
14080 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
14090 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
140a0 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
140b0 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
140c0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
140d0 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
140e0 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
140f0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65  d ){.    /* atte
14100 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c  mpt to get the l
14110 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ock */.    int l
14120 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
14130 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
14140 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
14150 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a      if( !lrc ){.
14160 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65        /* got the
14170 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
14180 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
14190 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
141a0 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
141b0 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20  .      if ( lrc 
141c0 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ) {.        int 
141d0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
141e0 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63          /* unloc
141f0 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e  k failed with an
14200 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
14210 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49    lrc = SQLITE_I
14220 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20  OERR_UNLOCK; .  
14230 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
14240 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
14250 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
14260 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
14270 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
14280 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
14290 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
142a0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
142b0 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
142c0 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
142d0 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
142e0 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
142f0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
14300 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
14310 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
14320 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
14330 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
14340 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
14350 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
14360 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o);.        rc =
14370 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   lrc;.      }.  
14380 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
14390 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
143a0 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b   %d %d %d (flock
143b0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
143c0 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
143d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
143e0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
143f0 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
14400 63 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c  c & 0xff) == SQL
14410 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
14420 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14430 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b  .    reserved=1;
14440 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
14450 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
14460 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
14470 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  /.  *pResOut = r
14480 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
14490 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
144a0 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
144b0 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
144c0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
144d0 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
144e0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
144f0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
14500 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
14510 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
14520 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
14530 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
14540 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
14550 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
14560 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
14570 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
14580 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
14590 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
145a0 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
145b0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
145c0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
145d0 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
145e0 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
145f0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
14600 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
14610 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
14620 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
14630 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
14640 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
14650 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
14660 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
14670 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
14680 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
14690 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
146a0 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
146b0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
146c0 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
146d0 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
146e0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
146f0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
14700 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
14710 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
14720 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
14730 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
14740 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
14750 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72  * flock() only r
14760 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
14770 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
14780 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
14790 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
147a0 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
147b0 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
147c0 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
147d0 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
147e0 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
147f0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
14800 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
14810 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
14820 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
14830 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
14840 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
14850 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
14860 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
14870 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
14880 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
14890 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
148a0 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
148b0 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73   int flockLock(s
148c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
148d0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
148e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
148f0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
14900 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14910 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  xFile*)id;..  as
14920 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
14930 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61    /* if we alrea
14940 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
14950 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
14960 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a    .  ** Just adj
14970 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
14980 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
14990 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  . */.  if (pFile
149a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
149b0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
149c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
149d0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
149e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
149f0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
14a00 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
14a10 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28  ock */.  .  if (
14a20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
14a30 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
14a40 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20   LOCK_NB)) {.   
14a50 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
14a60 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e  rno;.    /* didn
14a70 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20  't get, must be 
14a80 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d  busy */.    rc =
14a90 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
14aa0 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
14ab0 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
14ac0 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49  LOCK);.    if( I
14ad0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
14ae0 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
14af0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
14b00 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  tErrno);.    }. 
14b10 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
14b20 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
14b30 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
14b40 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65   ok */.    pFile
14b50 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
14b60 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f  ileLock;.  }.  O
14b70 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
14b80 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b   %d %s %s (flock
14b90 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
14ba0 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
14bb0 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
14bc0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
14bd0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
14be0 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  d"));.#ifdef SQL
14bf0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
14c00 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
14c10 66 28 20 28 72 63 20 26 20 30 78 66 66 29 20 3d  f( (rc & 0xff) =
14c20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
14c30 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
14c40 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64  E_BUSY;.  }.#end
14c50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
14c60 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
14c70 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72  RRORS */.  retur
14c80 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
14c90 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
14ca0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
14cb0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
14cc0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
14cd0 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
14ce0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
14cf0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
14d00 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
14d10 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
14d20 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
14d30 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
14d40 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
14d50 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
14d60 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
14d70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
14d80 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
14d90 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  int flockUnlock(
14da0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14db0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
14dc0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
14dd0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14de0 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72  *)id;.  .  asser
14df0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
14e00 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
14e10 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
14e20 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20  =%d (flock)\n", 
14e30 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
14e40 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
14e50 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14e60 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
14e70 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
14e80 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
14e90 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
14ea0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
14eb0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
14ec0 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
14ed0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
14ee0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14ef0 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
14f00 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
14f10 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
14f20 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
14f30 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
14f40 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
14f50 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
14f60 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
14f70 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
14f80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14f90 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
14fa0 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a  eally, unlock. *
14fb0 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66  /.  if( robust_f
14fc0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
14fd0 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65  OCK_UN) ){.#ifde
14fe0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
14ff0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
15000 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  S.    return SQL
15010 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f  ITE_OK;.#endif /
15020 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
15030 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
15040 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  S */.    return 
15050 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
15060 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OCK;.  }else{.  
15070 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
15080 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
15090 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
150a0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
150b0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
150c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
150d0 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
150e0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 61 73  file *id) {.  as
150f0 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
15100 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
15110 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74   NO_LOCK);.  ret
15120 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
15130 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  e(id);.}..#endif
15140 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
15150 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
15160 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f  && !OS_VXWORK */
15170 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
15180 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
15190 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70  e flock lock imp
151a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
151b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151c0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
151d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15210 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
15220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15260 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
15270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
15280 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72  n Named Semaphor
15290 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
152a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152b0 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  **.**.** Named s
152c0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
152d0 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
152e0 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ed on VxWorks..*
152f0 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
15300 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
15310 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63  ot-lock and floc
15320 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61  k in that it rea
15330 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70  lly only.** supp
15340 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c  orts EXCLUSIVE l
15350 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20  ocking.  Only a 
15360 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
15370 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  an read or write
15380 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
15390 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e   file at a time.
153a0 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70    This reduces p
153b0 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72  otential concurr
153c0 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b  ency, but.** mak
153d0 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c  es the lock impl
153e0 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20  ementation much 
153f0 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f  easier..*/.#if O
15400 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
15410 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
15420 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
15430 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
15440 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
15450 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
15460 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
15470 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
15480 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
15490 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
154a0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
154b0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
154c0 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
154d0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
154e0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
154f0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
15500 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
15510 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
15520 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
15530 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
15540 69 6e 74 20 73 65 6d 58 43 68 65 63 6b 52 65 73  int semXCheckRes
15550 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
15560 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
15570 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
15580 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15590 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
155a0 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
155b0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
155c0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
155d0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
155e0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
155f0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
15600 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
15610 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
15620 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
15630 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
15640 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
15650 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
15660 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15670 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
15680 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
15690 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
156a0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
156b0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
156c0 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
156d0 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
156e0 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
156f0 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
15700 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66  e->pSem;..    if
15710 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
15720 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  em)==-1 ){.     
15730 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
15740 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45  rno;.      if( E
15750 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20  AGAIN != tErrno 
15760 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
15770 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
15780 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
15790 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
157a0 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
157b0 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  );.        store
157c0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
157d0 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
157e0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
157f0 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
15800 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68   has the lock wh
15810 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f  en we are in NO_
15820 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20  LOCK */.        
15830 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c  reserved = (pFil
15840 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53  e->eFileLock < S
15850 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
15860 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
15870 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
15880 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
15890 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
158a0 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b   sem_post(pSem);
158b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
158c0 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
158d0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65  OCK %d %d %d (se
158e0 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
158f0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
15900 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
15910 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
15920 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
15930 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
15940 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
15950 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
15960 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
15970 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
15980 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
15990 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
159a0 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
159b0 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
159c0 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
159d0 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
159e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
159f0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
15a00 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
15a10 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
15a20 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
15a30 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
15a40 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
15a50 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
15a60 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
15a70 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
15a80 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
15a90 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
15aa0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
15ab0 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
15ac0 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
15ad0 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
15ae0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
15af0 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
15b00 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
15b10 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
15b20 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
15b30 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
15b40 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
15b50 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
15b60 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
15b70 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
15b80 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
15b90 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
15ba0 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
15bb0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
15bc0 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
15bd0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
15be0 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
15bf0 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  s only really su
15c00 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
15c10 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
15c20 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
15c30 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
15c40 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
15c50 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
15c60 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
15c70 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
15c80 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
15c90 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
15ca0 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
15cb0 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
15cc0 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
15cd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
15ce0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
15cf0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
15d00 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
15d10 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
15d20 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
15d30 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
15d40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
15d50 58 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  XLock(sqlite3_fi
15d60 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
15d70 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
15d80 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
15d90 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
15da0 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
15db0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
15dc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15dd0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20  TE_OK;..  /* if 
15de0 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
15df0 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
15e00 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
15e10 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
15e20 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
15e30 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
15e40 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
15e50 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
15e60 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
15e70 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
15e80 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  k;.    rc = SQLI
15e90 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
15ea0 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
15eb0 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73  }.  .  /* lock s
15ec0 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74  emaphore now but
15ed0 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61   bail out when a
15ee0 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a  lready locked. *
15ef0 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77  /.  if( sem_tryw
15f00 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
15f10 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15f20 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
15f30 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
15f40 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  }..  /* got it, 
15f50 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
15f60 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
15f70 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15f80 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20   = eFileLock;.. 
15f90 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  sem_end_lock:.  
15fa0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15fb0 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
15fc0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
15fd0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
15fe0 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
15ff0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
16000 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
16010 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
16020 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
16030 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
16040 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
16050 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
16060 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
16070 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
16080 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
16090 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
160a0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
160b0 74 69 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f  tic int semXUnlo
160c0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
160d0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
160e0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
160f0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
16100 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
16110 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
16120 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
16130 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
16140 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
16150 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
16160 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
16170 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d  s %d pid=%d (sem
16180 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
16190 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
161a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
161b0 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64  leLock, osGetpid
161c0 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (0)));.  assert(
161d0 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
161e0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
161f0 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
16200 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
16210 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
16220 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
16230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16240 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
16250 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
16260 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
16270 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
16280 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
16290 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
162a0 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
162b0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
162c0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
162d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
162e0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
162f0 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f   no, really unlo
16300 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65  ck. */.  if ( se
16310 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31  m_post(pSem)==-1
16320 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c   ) {.    int rc,
16330 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
16340 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16350 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
16360 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
16370 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
16380 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
16390 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
163a0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
163b0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
163c0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  o);.    }.    re
163d0 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
163e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
163f0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
16400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16410 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20  }../*. ** Close 
16420 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74  a file.. */.stat
16430 69 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65  ic int semXClose
16440 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
16450 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
16460 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
16470 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
16480 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e  *)id;.    semXUn
16490 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
164a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
164b0 46 69 6c 65 20 29 3b 0a 20 20 20 20 61 73 73 65  File );.    asse
164c0 72 74 28 20 75 6e 69 78 46 69 6c 65 4d 75 74 65  rt( unixFileMute
164d0 78 4e 6f 74 68 65 6c 64 28 70 46 69 6c 65 29 20  xNotheld(pFile) 
164e0 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
164f0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c  Mutex();.    rel
16500 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
16510 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  ile);.    unixLe
16520 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
16530 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
16540 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16550 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
16560 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
16570 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  KS */./*.** Name
16580 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
16590 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
165a0 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73  lable on VxWorks
165b0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
165c0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
165d0 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
165e0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
165f0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
16600 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
16610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16650 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
16660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166a0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
166b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166c0 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63  ** Begin AFP Loc
166d0 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
166e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166f0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50  ******.**.** AFP
16700 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69   is the Apple Fi
16710 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20  ling Protocol.  
16720 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b  AFP is a network
16730 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e   filesystem foun
16740 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61  d.** on Apple Ma
16750 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72  cintosh computer
16760 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64  s - both OS9 and
16770 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72   OSX..**.** Thir
16780 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e  d-party implemen
16790 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61  tations of AFP a
167a0 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42  re available.  B
167b0 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72  ut this code her
167c0 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  e.** only works 
167d0 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20  on OSX..*/..#if 
167e0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
167f0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
16800 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
16810 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c  E./*.** The afpL
16820 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74  ockingContext st
16830 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
16840 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70   all afp lock sp
16850 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a  ecific state.*/.
16860 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
16870 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
16880 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
16890 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f  xt;.struct afpLo
168a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
168b0 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20   int reserved;. 
168c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50   const char *dbP
168d0 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
168e0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
168f0 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  open file */.};.
16900 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67  .struct ByteRang
16910 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73  eLockPB2.{.  uns
16920 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
16930 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
16940 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * offset to firs
16950 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a  t byte to lock *
16960 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
16970 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20  g long length;  
16980 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20        /* nbr of 
16990 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
169a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
169b0 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74   long retRangeSt
169c0 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31  art; /* nbr of 1
169d0 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69  st byte locked i
169e0 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a  f successful */.
169f0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
16a00 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20  unLockFlag;     
16a10 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63      /* 1 = unloc
16a20 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20  k, 0 = lock */. 
16a30 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
16a40 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20  tartEndFlag;    
16a50 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65     /* 1=rel to e
16a60 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65  nd of fork, 0=re
16a70 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20  l to start */.  
16a80 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16aa0 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74    /* file desc t
16ab0 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63  o assoc this loc
16ac0 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64  k with */.};..#d
16ad0 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52  efine afpfsByteR
16ae0 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20  angeLock2FSCTL  
16af0 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c        _IOWR('z',
16b00 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
16b10 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
16b20 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
16b30 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69  tility for setti
16b40 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61  ng or clearing a
16b50 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20   bit-range lock 
16b60 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c  on an.** AFP fil
16b70 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20  esystem..** .** 
16b80 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
16b90 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c   on success, SQL
16ba0 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c  ITE_BUSY on fail
16bb0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
16bc0 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20  nt afpSetLock(. 
16bd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
16be0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
16bf0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
16c00 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
16c10 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   or unlocked */.
16c20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
16c30 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
16c40 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
16c50 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68  scriptor on path
16c60 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
16c70 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c  ong long offset,
16c80 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
16c90 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  te to be locked 
16ca0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
16cb0 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20  ng long length, 
16cc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16cd0 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
16ce0 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46  /.  int setLockF
16cf0 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
16d00 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65     /* True to se
16d10 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74  t lock.  False t
16d20 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a  o clear lock */.
16d30 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65  ){.  struct Byte
16d40 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b  RangeLockPB2 pb;
16d50 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20  .  int err;.  . 
16d60 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d   pb.unLockFlag =
16d70 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30   setLockFlag ? 0
16d80 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74   : 1;.  pb.start
16d90 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  EndFlag = 0;.  p
16da0 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  b.offset = offse
16db0 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d  t;.  pb.length =
16dc0 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66   length; .  pb.f
16dd0 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
16de0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50  .  OSTRACE(("AFP
16df0 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72  SETLOCK [%s] for
16e00 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25   %d%s in range %
16e10 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20  llx:%llx\n", .  
16e20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22    (setLockFlag?"
16e30 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c  ON":"OFF"), pFil
16e40 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31  e->h, (pb.fd==-1
16e50 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22  ?"[testval-1]":"
16e60 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20  "),.    offset, 
16e70 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20  length));.  err 
16e80 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66  = fsctl(path, af
16e90 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
16ea0 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b  2FSCTL, &pb, 0);
16eb0 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20  .  if ( err==-1 
16ec0 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ) {.    int rc;.
16ed0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
16ee0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52   errno;.    OSTR
16ef0 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
16f00 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c   failed to fsctl
16f10 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22  () '%s' %d %s\n"
16f20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
16f30 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72  ath, tErrno, str
16f40 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b  error(tErrno)));
16f50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
16f60 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
16f70 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53  RRORS.    rc = S
16f80 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73  QLITE_BUSY;.#els
16f90 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  e.    rc = sqlit
16fa0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
16fb0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20  rror(tErrno,.   
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fd0 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53   setLockFlag ? S
16fe0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
16ff0 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   : SQLITE_IOERR_
17000 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20  UNLOCK);.#endif 
17010 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
17020 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  _AFP_LOCK_ERRORS
17030 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c   */.    if( IS_L
17040 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
17050 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
17060 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
17070 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rno);.    }.    
17080 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65  return rc;.  } e
17090 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
170a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
170b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
170c0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
170d0 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
170e0 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
170f0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
17100 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
17110 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
17120 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
17130 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
17140 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
17150 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
17160 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
17170 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
17180 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
17190 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
171a0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
171b0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
171c0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
171d0 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
171e0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
171f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
17200 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17210 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
17220 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
17230 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
17240 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
17250 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
17260 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
17270 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
17280 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a  xt *context;.  .
17290 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
172a0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
172b0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
172c0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
172d0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
172e0 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28  );.  context = (
172f0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
17300 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
17310 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66  ingContext;.  if
17320 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72  ( context->reser
17330 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ved ){.    *pRes
17340 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Out = 1;.    ret
17350 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17360 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
17370 65 78 5f 65 6e 74 65 72 28 70 46 69 6c 65 2d 3e  ex_enter(pFile->
17380 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
17390 65 78 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ex);.  /* Check 
173a0 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
173b0 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
173c0 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
173d0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
173e0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
173f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
17400 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
17410 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
17420 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
17430 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
17440 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f   holds it..   */
17450 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
17460 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20   ){.    /* lock 
17470 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74  the RESERVED byt
17480 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  e */.    int lrc
17490 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
174a0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
174b0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
174c0 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20  YTE, 1,1);  .   
174d0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
174e0 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lrc ){.      /* 
174f0 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20  if we succeeded 
17500 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65  in taking the re
17510 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c  served lock, unl
17520 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72  ock it to restor
17530 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f  e.      ** the o
17540 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f  riginal state */
17550 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70  .      lrc = afp
17560 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17570 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17580 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
17590 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  , 0);.    } else
175a0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77   {.      /* if w
175b0 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  e failed to get 
175c0 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f  the lock then so
175d0 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20  meone else must 
175e0 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20  have it */.     
175f0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
17600 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
17610 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
17620 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b  ){.      rc=lrc;
17630 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
17640 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
17650 61 76 65 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ave(pFile->pInod
17660 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a  e->pLockMutex);.
17670 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
17680 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
17690 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
176a0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
176b0 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73  ed));.  .  *pRes
176c0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
176d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
176e0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
176f0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
17700 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
17710 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
17720 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
17730 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
17740 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
17750 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
17760 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
17770 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
17780 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
17790 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
177a0 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
177b0 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
177c0 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
177d0 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
177e0 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
177f0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
17800 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
17810 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
17820 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
17830 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
17840 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
17850 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
17860 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
17870 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
17880 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
17890 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
178a0 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
178b0 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
178c0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
178d0 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
178e0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
178f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
17900 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
17910 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
17920 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
17930 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
17940 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
17950 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
17960 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
17970 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
17980 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
17990 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
179a0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
179b0 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
179c0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
179d0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
179e0 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
179f0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
17a00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
17a10 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  fpLock(sqlite3_f
17a20 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
17a30 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  leLock){.  int r
17a40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17a50 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
17a60 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
17a70 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
17a80 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
17a90 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  e->pInode;.  afp
17aa0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
17ab0 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
17ac0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
17ad0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
17ae0 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65  ntext;.  .  asse
17af0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
17b00 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
17b10 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
17b20 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
17b30 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
17b40 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
17b50 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
17b60 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
17b70 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
17b80 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
17b90 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
17ba0 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
17bb0 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47 65  ->nShared , osGe
17bc0 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a  tpid(0)));..  /*
17bd0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
17be0 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
17bf0 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
17c00 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
17c10 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
17c20 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
17c30 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70  on't use the afp
17c40 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20  _end_lock: exit 
17c50 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
17c60 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
17c70 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
17c80 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
17c90 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
17ca0 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck>=eFileLock ){
17cb0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
17cc0 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20  OCK    %d %s ok 
17cd0 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28  (already held) (
17ce0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
17cf0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  h,.           az
17d00 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
17d10 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ck)));.    retur
17d20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17d30 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
17d40 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
17d50 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
17d60 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
17d70 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
17d80 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
17d90 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
17da0 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
17db0 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
17dc0 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
17dd0 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
17de0 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
17df0 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
17e00 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
17e10 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
17e20 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
17e30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
17e40 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
17e50 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
17e60 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
17e70 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
17e80 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
17e90 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
17ea0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
17eb0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
17ec0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17ed0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
17ee0 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75  .  .  /* This mu
17ef0 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65  tex is needed be
17f00 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
17f10 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
17f20 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
17f30 2f 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  /.  pInode = pFi
17f40 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 71  le->pInode;.  sq
17f50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
17f60 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  r(pInode->pLockM
17f70 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
17f80 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
17f90 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
17fa0 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
17fb0 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
17fc0 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
17fd0 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
17fe0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
17ff0 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
18000 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
18010 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
18020 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
18030 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e         (pInode->
18040 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
18050 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NG_LOCK || eFile
18060 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
18070 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72  )).     ){.    r
18080 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
18090 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e  .    goto afp_en
180a0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
180b0 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
180c0 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
180d0 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
180e0 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
180f0 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
18100 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
18110 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
18120 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
18130 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
18140 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
18150 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
18160 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
18170 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
18180 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
18190 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
181a0 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65  OCK || pInode->e
181b0 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
181c0 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
181d0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
181e0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
181f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
18200 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
18210 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18220 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18230 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
18240 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
18250 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  RED_LOCK;.    pI
18260 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b  node->nShared++;
18270 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
18280 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61  ck++;.    goto a
18290 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
182a0 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e  .    .  /* A PEN
182b0 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
182c0 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
182d0 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
182e0 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
182f0 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
18300 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
18310 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
18320 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
18330 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
18340 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
18350 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
18360 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
18370 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    || (eFileLock=
18380 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
18390 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
183a0 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ock<PENDING_LOCK
183b0 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  ).  ){.    int f
183c0 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65  ailed;.    faile
183d0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
183e0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
183f0 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
18400 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  YTE, 1, 1);.    
18410 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20  if (failed) {.  
18420 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
18430 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
18440 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
18450 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63    }.  .  /* If c
18460 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
18470 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
18480 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
18490 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
184a0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
184b0 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
184c0 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
184d0 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
184e0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
184f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31   ){.    int lrc1
18500 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e  , lrc2, lrc1Errn
18510 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20  o = 0;.    long 
18520 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20  lk, mask;.    . 
18530 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
18540 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
18550 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
18560 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
18570 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  0 );.        .  
18580 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66    mask = (sizeof
18590 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52  (long)==8) ? LAR
185a0 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37  GEST_INT64 : 0x7
185b0 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20  fffffff;.    /* 
185c0 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
185d0 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43  -lock SHARED_LOC
185e0 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65  K */.    /* note
185f0 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74   that the qualit
18600 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e  y of the randomn
18610 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ess doesn't matt
18620 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a  er that much */.
18630 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28      lk = random(
18640 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ); .    pInode->
18650 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b  sharedByte = (lk
18660 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44   & mask)%(SHARED
18670 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
18680 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc1 = afpSetLoc
18690 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
186a0 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
186b0 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
186c0 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
186d0 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
186e0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
186f0 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20  OR(lrc1) ){.    
18700 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46    lrc1Errno = pF
18710 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
18720 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
18730 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
18740 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
18750 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65      lrc2 = afpSe
18760 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18770 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
18780 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
18790 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
187a0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
187b0 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73 74  c1) ) {.      st
187c0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
187d0 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b 0a  le, lrc1Errno);.
187e0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
187f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
18800 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
18810 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b  else if( IS_LOCK
18820 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a  _ERROR(lrc2) ){.
18830 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b        rc = lrc2;
18840 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
18850 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
18860 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d  else if( lrc1 !=
18870 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20   SQLITE_OK ) {. 
18880 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
18890 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
188a0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
188b0 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
188c0 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
188d0 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
188e0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
188f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
18900 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
18910 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
18920 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
18930 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
18940 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
18950 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
18960 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
18970 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
18980 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
18990 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
189a0 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
189b0 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
189c0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
189d0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
189e0 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
189f0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
18a00 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
18a10 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
18a20 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
18a30 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
18a40 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
18a50 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
18a60 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
18a70 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
18a80 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  0;.    assert( 0
18a90 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
18aa0 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46  ck );.    if (eF
18ab0 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52  ileLock >= RESER
18ac0 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  VED_LOCK && pFil
18ad0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52  e->eFileLock < R
18ae0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a  ESERVED_LOCK) {.
18af0 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69          /* Acqui
18b00 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
18b10 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ck */.        fa
18b20 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
18b30 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
18b40 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
18b50 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20  ED_BYTE, 1,1);. 
18b60 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64       if( !failed
18b70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
18b80 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  ext->reserved = 
18b90 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
18ba0 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64  .    if (!failed
18bb0 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d   && eFileLock ==
18bc0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
18bd0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75   {.      /* Acqu
18be0 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
18bf0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
18c00 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76   .      /* Remov
18c10 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  e the shared loc
18c20 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20  k before trying 
18c30 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c  the range.  we'l
18c40 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20  l need to .     
18c50 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20   ** reestablish 
18c60 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
18c70 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20  if we can't get 
18c80 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20  the  afpUnlock. 
18c90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
18ca0 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70  ( !(failed = afp
18cb0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18cc0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18cd0 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20  SHARED_FIRST +. 
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
18d00 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30  sharedByte, 1, 0
18d10 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  )) ){.        in
18d20 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49  t failed2 = SQLI
18d30 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f  TE_OK;.        /
18d40 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74  * now attemmpt t
18d50 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73  o get the exclus
18d60 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a  ive lock range *
18d70 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
18d80 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
18d90 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
18da0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
18db0 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ST, .           
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dd0 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
18de0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
18df0 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c   failed && (fail
18e00 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  ed2 = afpSetLock
18e10 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18e20 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20  , pFile, .      
18e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e40 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
18e50 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
18e60 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20  te, 1, 1)) ){.  
18e70 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74          /* Can't
18e80 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
18e90 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53   shared lock.  S
18ea0 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c  qlite can't deal
18eb0 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20  , this is.      
18ec0 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61      ** a critica
18ed0 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20  l I/O error.    
18ee0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18ef0 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64     rc = ((failed
18f00 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49   & 0xff) == SQLI
18f10 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c  TE_IOERR) ? fail
18f20 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20  ed2 : .         
18f30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45        SQLITE_IOE
18f40 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
18f50 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
18f60 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20  lock;.        } 
18f70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18f80 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
18f90 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d; .      }.    
18fa0 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64  }.    if( failed
18fb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
18fc0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ailed;.    }.  }
18fd0 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
18fe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
18ff0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
19000 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
19010 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
19020 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
19030 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
19040 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
19050 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
19060 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
19070 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
19080 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
19090 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
190a0 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65  CK;.  }.  .afp_e
190b0 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69 74  nd_lock:.  sqlit
190c0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
190d0 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
190e0 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
190f0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
19100 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
19110 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
19120 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
19130 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
19140 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
19150 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
19160 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
19170 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
19180 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
19190 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
191a0 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
191b0 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
191c0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
191d0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
191e0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
191f0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
19200 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
19210 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
19220 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
19230 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
19240 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
19250 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
19260 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
19270 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
19280 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
19290 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
192a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
192b0 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
192c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
192d0 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
192e0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
192f0 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
19300 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
19310 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
19320 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
19330 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
19340 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
19350 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
19360 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
19370 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
19380 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
19390 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
193a0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
193b0 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
193c0 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
193d0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
193e0 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
193f0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
19400 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
19410 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
19420 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
19430 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  d,.           os
19440 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20  Getpid(0)));..  
19450 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
19460 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
19470 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
19480 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
19490 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
194a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
194b0 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
194c0 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 71 6c  e->pInode;.  sql
194d0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
194e0 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
194f0 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
19500 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21  pInode->nShared!
19510 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
19520 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
19530 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
19540 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
19550 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65  eFileLock==pFile
19560 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
19570 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19580 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
19590 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
195a0 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53  ( h=(-1) ).    S
195b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
195c0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69  nign(0);.    .#i
195d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
195e0 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
195f0 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
19600 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
19610 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
19620 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
19630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19640 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
19650 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
19660 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
19670 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
19680 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
19690 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
196a0 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
196b0 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
196c0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
196d0 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
196e0 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
196f0 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
19700 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
19710 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
19720 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
19730 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
19740 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
19750 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
19760 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
19770 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
19780 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
19790 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
197a0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
197b0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
197c0 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
197d0 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20  lWrite==0.      
197e0 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64       || pFile->d
197f0 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20  bUpdate==0.     
19800 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
19810 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31  transCntrChng==1
19820 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   );.    pFile->i
19830 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30  nNormalWrite = 0
19840 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20  ;.#endif.    .  
19850 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
19860 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
19870 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
19880 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
19890 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
198a0 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
198b0 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a  IRST, SHARED_SIZ
198c0 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  E, 0);.      if(
198d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
198e0 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  & (eFileLock==SH
198f0 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
19900 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20  ode->nShared>1) 
19910 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e  ){.        /* on
19920 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20  ly re-establish 
19930 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
19940 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
19950 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72          int shar
19960 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
19970 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
19980 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
19990 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
199a0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
199b0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
199c0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
199d0 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73   1);.      } els
199e0 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70  e {.        skip
199f0 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
19a00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
19a10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19a20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
19a30 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
19a40 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
19a50 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
19a60 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
19a70 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
19a80 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20   1, 0);.    } . 
19a90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19aa0 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  E_OK && pFile->e
19ab0 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  FileLock>=RESERV
19ac0 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65  ED_LOCK && conte
19ad0 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
19ae0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
19af0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
19b00 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
19b10 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
19b20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72  0);.      if( !r
19b30 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f  c ){ .        co
19b40 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
19b50 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  = 0; .      }.  
19b60 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
19b70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
19b80 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
19b90 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
19ba0 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20  nShared>1)){.   
19bb0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
19bc0 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
19bd0 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  CK;.    }.  }.  
19be0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19bf0 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K && eFileLock==
19c00 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20  NO_LOCK ){..    
19c10 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
19c20 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
19c30 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
19c40 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
19c50 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
19c60 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
19c70 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
19c80 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
19c90 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
19ca0 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
19cb0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .    unsigned lo
19cc0 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f  ng long sharedLo
19cd0 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f  ckByte = SHARED_
19ce0 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
19cf0 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49  aredByte;.    pI
19d00 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
19d10 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
19d20 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
19d30 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
19d40 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
19d50 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
19d60 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
19d70 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
19d80 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
19d90 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68       if( !skipSh
19da0 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ared ){.        
19db0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
19dc0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
19dd0 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
19de0 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20  ckByte, 1, 0);. 
19df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19e00 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20   !rc ){.        
19e10 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
19e20 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
19e30 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
19e40 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
19e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19e60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19e70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49  E_OK ){.      pI
19e80 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
19e90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
19ea0 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
19eb0 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
19ec0 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 20 63 6c  e->nLock==0 ) cl
19ed0 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
19ee0 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
19ef0 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74    .  sqlite3_mut
19f00 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d  ex_leave(pInode-
19f10 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20  >pLockMutex);.  
19f20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19f30 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
19f40 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
19f50 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  eLock;.  }.  ret
19f60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19f70 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20   Close a file & 
19f80 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63  cleanup AFP spec
19f90 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  ific locking con
19fa0 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20  text .*/.static 
19fb0 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c  int afpClose(sql
19fc0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
19fd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19fe0 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
19ff0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1a000 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65  File*)id;.  asse
1a010 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61  rt( id!=0 );.  a
1a020 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  fpUnlock(id, NO_
1a030 4c 4f 43 4b 29 3b 0a 20 20 61 73 73 65 72 74 28  LOCK);.  assert(
1a040 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e 6f   unixFileMutexNo
1a050 74 68 65 6c 64 28 70 46 69 6c 65 29 20 29 3b 0a  theld(pFile) );.
1a060 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1a070 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  ();.  if( pFile-
1a080 3e 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 75  >pInode ){.    u
1a090 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
1a0a0 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
1a0b0 6e 6f 64 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  node;.    sqlite
1a0c0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 49  3_mutex_enter(pI
1a0d0 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78  node->pLockMutex
1a0e0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
1a0f0 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  e->nLock ){.    
1a100 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1a110 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
1a120 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
1a130 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
1a140 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a  ile just.      *
1a150 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
1a160 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
1a170 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
1a180 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
1a190 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
1a1a0 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
1a1b0 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20  ->aPending.  It 
1a1c0 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
1a1d0 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65  cally closed whe
1a1e0 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  n.      ** the l
1a1f0 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
1a200 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
1a210 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64      setPendingFd
1a220 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
1a230 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1a240 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70  _leave(pInode->p
1a250 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 7d 0a  LockMutex);.  }.
1a260 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
1a270 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c  fo(pFile);.  sql
1a280 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
1a290 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
1a2a0 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e  ;.  rc = closeUn
1a2b0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e  ixFile(id);.  un
1a2c0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
1a2d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a2e0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1a2f0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1a300 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1a310 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
1a320 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
1a330 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c  ove is the AFP l
1a340 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
1a350 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
1a360 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
1a370 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
1a380 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
1a390 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
1a3a0 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
1a3b0 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
1a3c0 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74  e.  If you don't
1a3d0 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d   compile for a m
1a3e0 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e  ac, then the "un
1a3f0 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69  ix-afp".** VFS i
1a400 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
1a410 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
1a420 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
1a430 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
1a440 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
1a450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a460 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1a470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4b0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
1a4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a500 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1a510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a520 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69   Begin NFS Locki
1a530 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
1a540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a550 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ***/..#if define
1a560 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1a570 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1a580 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20  CKING_STYLE./*. 
1a590 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
1a5a0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
1a5b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
1a5c0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
1a5d0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a  .  eFileLock. **
1a5e0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
1a5f0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
1a600 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20  D_LOCK.. **. ** 
1a610 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
1a620 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
1a630 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
1a640 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
1a650 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65  ow. ** the reque
1a660 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
1a670 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
1a680 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f   is a no-op.. */
1a690 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55  .static int nfsU
1a6a0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
1a6b0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
1a6c0 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e  eLock){.  return
1a6d0 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c   posixUnlock(id,
1a6e0 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a   eFileLock, 1);.
1a6f0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  }..#endif /* def
1a700 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1a710 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
1a720 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
1a730 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  /./*.** The code
1a740 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46   above is the NF
1a750 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  S lock implement
1a760 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65  ation.  The code
1a770 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20   is specific.** 
1a780 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f  to MacOSX and do
1a790 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f  es not work on o
1a7a0 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f  ther unix platfo
1a7b0 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61  rms.  No alterna
1a7c0 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  tive.** is avail
1a7d0 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a  able.  .**.*****
1a7e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a7f0 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20   End of the NFS 
1a800 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
1a810 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
1a820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
1a830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
1a880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
1a8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e  ************ Non
1a8e0 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33  -locking sqlite3
1a8f0 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a  _file methods **
1a900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
1a920 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69 73  * The next divis
1a930 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70  ion contains imp
1a940 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  lementations for
1a950 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20   all methods of 
1a960 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  the .** sqlite3_
1a970 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65  file object othe
1a980 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69  r than the locki
1a990 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65  ng methods.  The
1a9a0 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68   locking.** meth
1a9b0 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65 64  ods were defined
1a9c0 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62   in divisions ab
1a9d0 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67  ove (one locking
1a9e0 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64   method per.** d
1a9f0 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65  ivision).  Those
1aa00 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61 72   methods that ar
1aa10 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  e common to all 
1aa20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a  locking modes.**
1aa30 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67 65   are gather toge
1aa40 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64  ther into this d
1aa50 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a  ivision..*/../*.
1aa60 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
1aa70 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20  ffset passed as 
1aa80 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1aa90 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63  ent, then read c
1aaa0 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74  nt .** bytes int
1aab0 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74  o pBuf. Return t
1aac0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1aad0 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
1aae0 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20  ..**.** NB:  If 
1aaf0 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50  you define USE_P
1ab00 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41  READ or USE_PREA
1ab10 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  D64, then it mig
1ab20 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65  ht also.** be ne
1ab30 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e  cessary to defin
1ab40 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20  e _XOPEN_SOURCE 
1ab50 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73  to be 500.  This
1ab60 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20   varies from.** 
1ab70 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e  one system to an
1ab80 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51  other.  Since SQ
1ab90 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65  Lite does not de
1aba0 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a  fine USE_PREAD.*
1abb0 2a 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20 62 79  * in any form by
1abc0 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c   default, we wil
1abd0 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
1abe0 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
1abf0 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69  OURCE..** See ti
1ac00 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20  ckets #2741 and 
1ac10 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  #2681..**.** To 
1ac20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
1ac30 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
1ac40 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20  n a failed read 
1ac50 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
1ac60 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
1ac70 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1ac80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1ac90 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69  ekAndRead(unixFi
1aca0 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
1acb0 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f  int64 offset, vo
1acc0 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
1acd0 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  t){.  int got;. 
1ace0 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b 0a   int prior = 0;.
1acf0 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53  #if (!defined(US
1ad00 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66  E_PREAD) && !def
1ad10 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
1ad20 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  )).  i64 newOffs
1ad30 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  et;.#endif.  TIM
1ad40 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73 65  ER_START;.  asse
1ad50 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30 78  rt( cnt==(cnt&0x
1ad60 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65  1ffff) );.  asse
1ad70 72 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b 0a 20  rt( id->h>2 );. 
1ad80 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64   do{.#if defined
1ad90 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20 20  (USE_PREAD).    
1ada0 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64  got = osPread(id
1adb0 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
1adc0 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d  offset);.    Sim
1add0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
1ade0 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20  t = -1 );.#elif 
1adf0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
1ae00 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f  D64).    got = o
1ae10 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20  sPread64(id->h, 
1ae20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
1ae30 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  t);.    Simulate
1ae40 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
1ae50 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e  1 );.#else.    n
1ae60 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
1ae70 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
1ae80 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53  SEEK_SET);.    S
1ae90 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1aea0 6e 65 77 4f 66 66 73 65 74 20 3d 20 2d 31 20 29  newOffset = -1 )
1aeb0 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  ;.    if( newOff
1aec0 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  set<0 ){.      s
1aed0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75  toreLastErrno((u
1aee0 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72  nixFile*)id, err
1aef0 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  no);.      retur
1af00 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
1af10 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d  got = osRead(id-
1af20 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
1af30 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67  #endif.    if( g
1af40 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b  ot==cnt ) break;
1af50 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29  .    if( got<0 )
1af60 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
1af70 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20  o==EINTR ){ got 
1af80 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  = 1; continue; }
1af90 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30  .      prior = 0
1afa0 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
1afb0 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
1afc0 2a 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b 0a 20  *)id,  errno);. 
1afd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1afe0 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30 20  }else if( got>0 
1aff0 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d 20  ){.      cnt -= 
1b000 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  got;.      offse
1b010 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20  t += got;.      
1b020 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20  prior += got;.  
1b030 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64      pBuf = (void
1b040 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a 29  *)(got + (char*)
1b050 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pBuf);.    }.  }
1b060 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a  while( got>0 );.
1b070 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f    TIMER_END;.  O
1b080 53 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20  STRACE(("READ   
1b090 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
1b0a0 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %llu\n",.       
1b0b0 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b       id->h, got+
1b0c0 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72  prior, offset-pr
1b0d0 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  ior, TIMER_ELAPS
1b0e0 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  ED));.  return g
1b0f0 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a  ot+prior;.}../*.
1b100 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
1b110 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
1b120 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
1b130 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
1b140 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
1b150 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
1b160 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
1b170 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
1b180 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
1b190 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
1b1a0 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
1b1b0 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64  ile *id, .  void
1b1c0 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
1b1d0 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
1b1e0 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  t64 offset.){.  
1b1f0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1b200 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
1b210 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61  ;.  int got;.  a
1b220 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61  ssert( id );.  a
1b230 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30  ssert( offset>=0
1b240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
1b250 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  t>0 );..  /* If 
1b260 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
1b270 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
1b280 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
1b290 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
1b2a0 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
1b2b0 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
1b2c0 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
1b2d0 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
1b2e0 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
1b2f0 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
1b300 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74  ile->pPreallocat
1b310 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  edUnused==0.    
1b320 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
1b330 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
1b340 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
1b350 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
1b360 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
1b370 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1b380 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
1b390 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
1b3a0 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20 72  h of this read r
1b3b0 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62  equest as possib
1b3c0 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e  le by transferin
1b3d0 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d  g.  ** data from
1b3e0 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
1b3f0 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  ing using memcpy
1b400 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66  ().  */.  if( of
1b410 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  fset<pFile->mmap
1b420 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
1b430 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46  offset+amt <= pF
1b440 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1b450 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42  .      memcpy(pB
1b460 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69  uf, &((u8 *)(pFi
1b470 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
1b480 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a  [offset], amt);.
1b490 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b4a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1b4b0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
1b4c0 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  py = pFile->mmap
1b4d0 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
1b4e0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
1b4f0 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
1b500 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
1b510 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a  ffset], nCopy);.
1b520 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
1b530 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
1b540 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
1b550 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
1b560 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
1b570 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1b580 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52    got = seekAndR
1b590 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ead(pFile, offse
1b5a0 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  t, pBuf, amt);. 
1b5b0 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b   if( got==amt ){
1b5c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1b5d0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
1b5e0 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
1b5f0 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
1b600 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
1b610 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1b620 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
1b630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
1b640 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
1b650 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74  le, 0);   /* not
1b660 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20   a system error 
1b670 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64  */.    /* Unread
1b680 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75   parts of the bu
1b690 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72  ffer must be zer
1b6a0 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  o-filled */.    
1b6b0 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
1b6c0 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61  pBuf)[got], 0, a
1b6d0 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74  mt-got);.    ret
1b6e0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1b6f0 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
1b700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1b710 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66 69  t to seek the fi
1b720 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 61  le-descriptor pa
1b730 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
1b740 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a  t argument to.**
1b750 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65 74   absolute offset
1b760 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74 65   iOff, then atte
1b770 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42 75  mpt to write nBu
1b780 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
1b790 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20  from.** pBuf to 
1b7a0 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  it. If an error 
1b7b0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 2d  occurs, return -
1b7c0 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72 72  1 and set *piErr
1b7d0 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  no. Otherwise, .
1b7e0 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 63  ** return the ac
1b7f0 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  tual number of b
1b800 79 74 65 73 20 77 72 69 74 74 65 6e 20 28 77 68  ytes written (wh
1b810 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73 20  ich may be less 
1b820 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a  than.** nBuf)..*
1b830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1b840 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20 69  kAndWriteFd(.  i
1b850 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20  nt fd,          
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b870 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1b880 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  r to write to */
1b890 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20 20  .  i64 iOff,    
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8b0 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65     /* File offse
1b8c0 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69  t to begin writi
1b8d0 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ng at */.  const
1b8e0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
1b8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1b900 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  py data from thi
1b910 73 20 62 75 66 66 65 72 20 74 6f 20 74 68 65 20  s buffer to the 
1b920 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  file */.  int nB
1b930 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1b940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1b950 65 20 6f 66 20 62 75 66 66 65 72 20 70 42 75 66  e of buffer pBuf
1b960 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
1b970 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20 20  nt *piErrno     
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b990 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d  * OUT: Error num
1b9a0 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63 63  ber if error occ
1b9b0 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  urs */.){.  int 
1b9c0 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1b9d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1b9e0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1b9f0 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
1ba00 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3d  .  assert( nBuf=
1ba10 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66 29 20  =(nBuf&0x1ffff) 
1ba20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e  );.  assert( fd>
1ba30 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  2 );.  assert( p
1ba40 69 45 72 72 6e 6f 21 3d 30 20 29 3b 0a 20 20 6e  iErrno!=0 );.  n
1ba50 42 75 66 20 26 3d 20 30 78 31 66 66 66 66 3b 0a  Buf &= 0x1ffff;.
1ba60 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 0a    TIMER_START;..
1ba70 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
1ba80 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 72 63 20  PREAD).  do{ rc 
1ba90 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65 28  = (int)osPwrite(
1baa0 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20  fd, pBuf, nBuf, 
1bab0 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28 20 72  iOff); }while( r
1bac0 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
1bad0 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66  NTR );.#elif def
1bae0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
1baf0 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e  ).  do{ rc = (in
1bb00 74 29 6f 73 50 77 72 69 74 65 36 34 28 66 64 2c  t)osPwrite64(fd,
1bb10 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66   pBuf, nBuf, iOf
1bb20 66 29 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  f);}while( rc<0 
1bb30 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29  && errno==EINTR)
1bb40 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20  ;.#else.  do{.  
1bb50 20 20 69 36 34 20 69 53 65 65 6b 20 3d 20 6c 73    i64 iSeek = ls
1bb60 65 65 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53 45  eek(fd, iOff, SE
1bb70 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d  EK_SET);.    Sim
1bb80 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 69 53  ulateIOError( iS
1bb90 65 65 6b 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20  eek = -1 );.    
1bba0 69 66 28 20 69 53 65 65 6b 3c 30 20 29 7b 0a 20  if( iSeek<0 ){. 
1bbb0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1bbc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bbd0 0a 20 20 20 20 72 63 20 3d 20 6f 73 57 72 69 74  .    rc = osWrit
1bbe0 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  e(fd, pBuf, nBuf
1bbf0 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3c  );.  }while( rc<
1bc00 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
1bc10 52 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54  R );.#endif..  T
1bc20 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52  IMER_END;.  OSTR
1bc30 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d  ACE(("WRITE   %-
1bc40 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
1bc50 75 5c 6e 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f  u\n", fd, rc, iO
1bc60 66 66 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  ff, TIMER_ELAPSE
1bc70 44 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30  D));..  if( rc<0
1bc80 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65 72   ) *piErrno = er
1bc90 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rno;.  return rc
1bca0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  ;.}.../*.** Seek
1bcb0 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69   to the offset i
1bcc0 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65  n id->offset the
1bcd0 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73  n read cnt bytes
1bce0 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52   into pBuf..** R
1bcf0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1bd00 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
1bd10 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65  ly read.  Update
1bd20 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a   the offset..**.
1bd30 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
1bd40 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
1bd50 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
1bd60 20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45   write the lastE
1bd70 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
1bd80 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
1bd90 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
1bda0 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74   int seekAndWrit
1bdb0 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  e(unixFile *id, 
1bdc0 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73  i64 offset, cons
1bdd0 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  t void *pBuf, in
1bde0 74 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72 6e  t cnt){.  return
1bdf0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28   seekAndWriteFd(
1be00 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 70  id->h, offset, p
1be10 42 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e 6c  Buf, cnt, &id->l
1be20 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f  astErrno);.}.../
1be30 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
1be40 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
1be50 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
1be60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
1be70 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
1be80 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
1be90 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
1bea0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1beb0 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  ixWrite(.  sqlit
1bec0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
1bed0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
1bee0 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
1bef0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
1bf00 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46  fset .){.  unixF
1bf10 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1bf20 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
1bf30 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61  t wrote = 0;.  a
1bf40 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61  ssert( id );.  a
1bf50 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
1bf60 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1bf70 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1bf80 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
1bf90 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
1bfa0 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
1bfb0 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
1bfc0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1bfd0 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
1bfe0 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1bff0 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
1c000 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 50  ssert( pFile->pP
1c010 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
1c020 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
1c030 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
1c040 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
1c050 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
1c060 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
1c070 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1c080 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
1c090 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
1c0a0 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
1c0b0 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
1c0c0 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
1c0d0 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  to.  ** doing a 
1c0e0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1c0f0 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
1c100 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
1c110 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e  er than a.  ** n
1c120 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
1c130 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64  ile) then record
1c140 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
1c150 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
1c160 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49   has changed.  I
1c170 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1c180 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64  n counter is mod
1c190 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68  ified, record th
1c1a0 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f  at.  ** fact too
1c1b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
1c1c0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
1c1d0 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
1c1e0 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f  dbUpdate = 1;  /
1c1f0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68  * The database h
1c200 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
1c210 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73   */.    if( offs
1c220 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74  et<=24 && offset
1c230 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20  +amt>=27 ){.    
1c240 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
1c250 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b  char oldCntr[4];
1c260 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1c270 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1c280 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b  .      rc = seek
1c290 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32  AndRead(pFile, 2
1c2a0 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a  4, oldCntr, 4);.
1c2b0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1c2c0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1c2d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34 20        if( rc!=4 
1c2e0 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74  || memcmp(oldCnt
1c2f0 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75 66  r, &((char*)pBuf
1c300 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29  )[24-offset], 4)
1c310 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
1c320 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
1c330 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  hng = 1;  /* The
1c340 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1c350 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64  nter has changed
1c360 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
1c370 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
1c380 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1c390 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 29  _MMAP_READWRITE)
1c3a0 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   && SQLITE_MAX_M
1c3b0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
1c3c0 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
1c3d0 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20  h of this write 
1c3e0 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
1c3f0 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
1c400 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
1c410 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
1c420 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
1c430 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
1c440 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
1c450 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
1c460 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
1c470 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1c480 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
1c490 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
1c4a0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
1c4b0 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  et], pBuf, amt);
1c4c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1c4d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1c4e0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
1c4f0 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  opy = pFile->mma
1c500 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  pSize - offset;.
1c510 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28        memcpy(&((
1c520 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
1c530 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
1c540 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b  ], pBuf, nCopy);
1c550 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
1c560 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
1c570 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
1c580 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
1c590 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
1c5a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1c5b0 20 0a 20 20 77 68 69 6c 65 28 20 28 77 72 6f 74   .  while( (wrot
1c5c0 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1c5d0 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
1c5e0 70 42 75 66 2c 20 61 6d 74 29 29 3c 61 6d 74 20  pBuf, amt))<amt 
1c5f0 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20 20  && wrote>0 ){.  
1c600 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
1c610 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72      offset += wr
1c620 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
1c630 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
1c640 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
1c650 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
1c660 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
1c670 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
1c680 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
1c690 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
1c6a0 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 77 72 6f  ;..  if( amt>wro
1c6b0 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72  te ){.    if( wr
1c6c0 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e  ote<0 && pFile->
1c6d0 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50  lastErrno!=ENOSP
1c6e0 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61  C ){.      /* la
1c6f0 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
1c700 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20  eekAndWrite */. 
1c710 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1c720 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1c730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c740 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1c750 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e 6f  pFile, 0); /* no
1c760 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
1c770 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1c780 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1c790 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1c7a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c7b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1c7c0 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ST./*.** Count t
1c7d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
1c7e0 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61  lsyncs and norma
1c7f0 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69  l syncs.  This i
1c800 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a  s used to test.*
1c810 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64  * that syncs and
1c820 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f   fullsyncs are o
1c830 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65 20  ccurring at the 
1c840 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
1c850 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
1c860 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
1c870 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1c880 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
1c890 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20  if../*.** We do 
1c8a0 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65 6d  not trust system
1c8b0 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77  s to provide a w
1c8c0 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63  orking fdatasync
1c8d0 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a  ().  Some do..**
1c8e0 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20   Others do no.  
1c8f0 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20 77  To be safe, we w
1c900 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74  ill stick with t
1c910 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f  he (slightly slo
1c920 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e  wer).** fsync().
1c930 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61   If you know tha
1c940 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f  t your system do
1c950 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61  es support fdata
1c960 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79  sync() correctly
1c970 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79  ,.** then simply
1c980 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44   compile with -D
1c990 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73  fdatasync=fdatas
1c9a0 79 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46 44  ync or -DHAVE_FD
1c9b0 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20 21  ATASYNC.*/.#if !
1c9c0 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e  defined(fdatasyn
1c9d0 63 29 20 26 26 20 21 48 41 56 45 5f 46 44 41 54  c) && !HAVE_FDAT
1c9e0 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66  ASYNC.# define f
1c9f0 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23  datasync fsync.#
1ca00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
1ca10 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1ca20 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70  NC to 0 or 1 dep
1ca30 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
1ca40 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
1ca50 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72  F_FULLFSYNC macr
1ca60 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46  o is defined.  F
1ca70 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75  _FULLFSYNC is cu
1ca80 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20  rrently.** only 
1ca90 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
1caa0 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74   OS X.  But that
1cab0 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a   could change..*
1cac0 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  /.#ifdef F_FULLF
1cad0 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41  SYNC.# define HA
1cae0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23  VE_FULLFSYNC 1.#
1caf0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41  else.# define HA
1cb00 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23  VE_FULLFSYNC 0.#
1cb10 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
1cb20 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d  e fsync() system
1cb30 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77   call does not w
1cb40 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65  ork as advertise
1cb50 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69  d on many.** uni
1cb60 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20  x systems.  The 
1cb70 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64  following proced
1cb80 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ure is an attemp
1cb90 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  t to make.** it 
1cba0 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a  work better..**.
1cbb0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f  ** The SQLITE_NO
1cbc0 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61  _SYNC macro disa
1cbd0 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29  bles all fsync()
1cbe0 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  s.  This is usef
1cbf0 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  ul.** for testin
1cc00 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  g when we want t
1cc10 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68  o run through th
1cc20 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69  e test suite qui
1cc30 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65  ckly..** You are
1cc40 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65   strongly advise
1cc50 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f  d *not* to deplo
1cc60 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  y with SQLITE_NO
1cc70 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64  _SYNC.** enabled
1cc80 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  , however, since
1cc90 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
1cca0 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e  SYNC enabled, an
1ccb0 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20   OS crash.** or 
1ccc0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69  power failure wi
1ccd0 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70  ll likely corrup
1cce0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1ccf0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ile..**.** SQLit
1cd00 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f  e sets the dataO
1cd10 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20  nly flag if the 
1cd20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1cd30 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
1cd40 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e  * The idea behin
1cd50 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68  d dataOnly is th
1cd60 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c  at it should onl
1cd70 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  y write the file
1cd80 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64   content.** to d
1cd90 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f  isk, not the ino
1cda0 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74  de.  We only set
1cdb0 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65   dataOnly if the
1cdc0 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a   file size is .*
1cdd0 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63  * unchanged sinc
1cde0 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
1cdf0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  is part of the i
1ce00 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  node.  However, 
1ce10 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c  .** Ted Ts'o tel
1ce20 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61  ls us that fdata
1ce30 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f  sync() will also
1ce40 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65   write the inode
1ce50 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   if the.** file 
1ce60 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64  size has changed
1ce70 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c  .  The only real
1ce80 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
1ce90 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a  een fdatasync().
1cea0 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20  ** and fsync(), 
1ceb0 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73  Ted tells us, is
1cec0 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
1ced0 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68  ) will not flush
1cee0 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66   the.** inode if
1cef0 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77   the mtime or ow
1cf00 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f  ner or other ino
1cf10 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61  de attributes ha
1cf20 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57  ve changed..** W
1cf30 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
1cf40 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
1cf50 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66   not the other f
1cf60 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20  ile attributes, 
1cf70 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20  so.** as far as 
1cf80 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72  SQLite is concer
1cf90 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e  ned, an fdatasyn
1cfa0 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64  c() is always ad
1cfb0 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77  equate..** So, w
1cfc0 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61  e always use fda
1cfd0 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69  tasync() if it i
1cfe0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67  s available, reg
1cff0 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68  ardless of.** th
1d000 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
1d010 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f  ataOnly flag..*/
1d020 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c  .static int full
1d030 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69  _fsync(int fd, i
1d040 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74  nt fullSync, int
1d050 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e   dataOnly){.  in
1d060 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
1d070 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66  following "ifdef
1d080 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f  /elif/else/" blo
1d090 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ck has the same 
1d0a0 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a  structure as.  *
1d0b0 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e  * the one below.
1d0c0 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65   It is replicate
1d0d0 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f  d here solely to
1d0e0 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e   avoid clutterin
1d0f0 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72  g .  ** up the r
1d100 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68  eal code with th
1d110 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  e UNUSED_PARAMET
1d120 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a  ER() macros..  *
1d130 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1d140 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  NO_SYNC.  UNUSED
1d150 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
1d160 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1d170 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
1d180 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1d190 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69  (dataOnly);.#eli
1d1a0 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1d1b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1d1c0 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1d1d0 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
1d1e0 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
1d1f0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1d200 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
1d210 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
1d220 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20  cord the number 
1d230 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65  of times that we
1d240 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79   do a normal fsy
1d250 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46  nc() and .  ** F
1d260 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69  ULLSYNC.  This i
1d270 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
1d280 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  sting to verify 
1d290 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64  that this proced
1d2a0 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61  ure.  ** gets ca
1d2b0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  lled with the co
1d2c0 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e  rrect arguments.
1d2d0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1d2e0 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66  ITE_TEST.  if( f
1d2f0 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65  ullSync ) sqlite
1d300 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
1d310 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79  ++;.  sqlite3_sy
1d320 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
1d330 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
1d340 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
1d350 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1d360 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
1d370 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
1d380 6f 70 2e 20 20 42 75 74 20 67 6f 20 61 68 65 61  op.  But go ahea
1d390 64 20 61 6e 64 20 63 61 6c 6c 20 66 73 74 61 74  d and call fstat
1d3a0 28 29 20 74 6f 20 76 61 6c 69 64 61 74 65 20 74  () to validate t
1d3b0 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  he file.  ** des
1d3c0 63 72 69 70 74 6f 72 20 61 73 20 77 65 20 6e 65  criptor as we ne
1d3d0 65 64 20 61 20 6d 65 74 68 6f 64 20 74 6f 20 70  ed a method to p
1d3e0 72 6f 76 6f 6b 65 20 61 20 66 61 69 6c 75 72 65  rovoke a failure
1d3f0 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 63 6f 76   during.  ** cov
1d400 65 72 61 74 65 20 74 65 73 74 69 6e 67 2e 0a 20  erate testing.. 
1d410 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1d420 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 7b 0a 20 20  E_NO_SYNC.  {.  
1d430 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1d440 66 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73  f;.    rc = osFs
1d450 74 61 74 28 66 64 2c 20 26 62 75 66 29 3b 0a 20  tat(fd, &buf);. 
1d460 20 7d 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55   }.#elif HAVE_FU
1d470 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75  LLFSYNC.  if( fu
1d480 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  llSync ){.    rc
1d490 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46   = osFcntl(fd, F
1d4a0 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a  _FULLFSYNC, 0);.
1d4b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1d4c0 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66  = 1;.  }.  /* If
1d4d0 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66   the FULLFSYNC f
1d4e0 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b  ailed, fall back
1d4f0 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61   to attempting a
1d500 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20  n fsync()..  ** 
1d510 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20  It shouldn't be 
1d520 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c  possible for ful
1d530 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f  lfsync to fail o
1d540 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a  n the local .  *
1d550 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f  * file system (o
1d560 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75  n OSX), so failu
1d570 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  re indicates tha
1d580 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a  t FULLFSYNC.  **
1d590 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64   isn't supported
1d5a0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73   for this file s
1d5b0 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d  ystem. So, attem
1d5c0 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a  pt an fsync .  *
1d5d0 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20  * and (for now) 
1d5e0 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68  ignore the overh
1d5f0 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c  ead of a superfl
1d600 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e  uous fcntl call.
1d610 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20    .  ** It'd be 
1d620 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74  better to detect
1d630 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f   fullfsync suppo
1d640 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69  rt once and avoi
1d650 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74  d .  ** the fcnt
1d660 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d  l call every tim
1d670 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64  e sync is called
1d680 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20  ..  */.  if( rc 
1d690 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29  ) rc = fsync(fd)
1d6a0 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  ;..#elif defined
1d6b0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a  (__APPLE__).  /*
1d6c0 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20   fdatasync() on 
1d6d0 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74  HFS+ doesn't yet
1d6e0 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20   flush the file 
1d6f0 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67  size if it chang
1d700 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1d710 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77  * so currently w
1d720 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65  e default to the
1d730 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64 65   macro that rede
1d740 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20  fines fdatasync 
1d750 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20  to fsync.  */.  
1d760 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1d770 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64  #else .  rc = fd
1d780 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66  atasync(fd);.#if
1d790 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
1d7a0 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e  ( rc==-1 && errn
1d7b0 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20  o==ENOTSUP ){.  
1d7c0 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1d7d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
1d7e0 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65  OS_VXWORKS */.#e
1d7f0 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
1d800 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69  LITE_NO_SYNC eli
1d810 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1d820 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58   */..  if( OS_VX
1d830 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31  WORKS && rc!= -1
1d840 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
1d850 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1d860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1d870 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1d880 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
1d890 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c  y containing fil
1d8a0 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20  e zFilename..** 
1d8b0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
1d8c0 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  pFd is set to th
1d8d0 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65  e opened file de
1d8e0 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20  scriptor and.** 
1d8f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1d900 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
1d910 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65  or occurs, eithe
1d920 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  r SQLITE_NOMEM.*
1d930 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54  * or SQLITE_CANT
1d940 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64  OPEN is returned
1d950 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74   and *pFd is set
1d960 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   to an undefined
1d970 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  .** value..**.**
1d980 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   The directory f
1d990 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
1d9a0 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20  s used for only 
1d9b0 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a  one thing - to.*
1d9c0 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72 65  * fsync() a dire
1d9d0 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73 75  ctory to make su
1d9e0 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  re file creation
1d9f0 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65 76   and deletion ev
1da00 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73  ents.** are flus
1da10 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53 75  hed to disk.  Su
1da20 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e 6f  ch fsyncs are no
1da30 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77 65  t needed on newe
1da40 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20  r.** journaling 
1da50 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75 74  filesystems, but
1da60 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
1da70 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74 65   older filesyste
1da80 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ms..**.** This r
1da90 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f 76  outine can be ov
1daa0 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
1dab0 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20 69  he xSetSysCall i
1dac0 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65  nterface..** The
1dad0 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72   ability to over
1dae0 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ride this routin
1daf0 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20 73  e was added in s
1db00 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a  upport of the.**
1db10 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1db20 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64 69  x.  Opening a di
1db30 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65 63  rectory is a sec
1db40 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20 61  urity risk (we a
1db50 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d  re.** told) so m
1db60 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69 64  aking it overrid
1db70 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65  eable allows the
1db80 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1db90 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20  x to.** replace 
1dba0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
1dbb0 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  h a harmless no-
1dbc0 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68 69  op.  To make thi
1dbd0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e  s routine.** a n
1dbe0 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69 74  o-op, replace it
1dbf0 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68 61   with a stub tha
1dc00 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1dc10 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a 2a  _OK but leaves.*
1dc20 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61 20  * *pFd set to a 
1dc30 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1dc40 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1dc50 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1dc60 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1dc70 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1dc80 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  losing.** the fi
1dc90 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70  le descriptor *p
1dca0 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29  Fd using close()
1dcb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1dcc0 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f  openDirectory(co
1dcd0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1dce0 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a  ame, int *pFd){.
1dcf0 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
1dd00 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20  fd = -1;.  char 
1dd10 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zDirname[MAX_PAT
1dd20 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c  HNAME+1];..  sql
1dd30 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
1dd40 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72  X_PATHNAME, zDir
1dd50 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  name, "%s", zFil
1dd60 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69  ename);.  for(ii
1dd70 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69  =(int)strlen(zDi
1dd80 72 6e 61 6d 65 29 3b 20 69 69 3e 30 20 26 26 20  rname); ii>0 && 
1dd90 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f  zDirname[ii]!='/
1dda0 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20  '; ii--);.  if( 
1ddb0 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72  ii>0 ){.    zDir
1ddc0 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b  name[ii] = '\0';
1ddd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1dde0 28 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 21 3d 27  ( zDirname[0]!='
1ddf0 2f 27 20 29 20 7a 44 69 72 6e 61 6d 65 5b 30 5d  /' ) zDirname[0]
1de00 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7a 44 69 72   = '.';.    zDir
1de10 6e 61 6d 65 5b 31 5d 20 3d 20 30 3b 0a 20 20 7d  name[1] = 0;.  }
1de20 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f  .  fd = robust_o
1de30 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
1de40 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
1de50 20 30 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30   0);.  if( fd>=0
1de60 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
1de70 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
1de80 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61  s\n", fd, zDirna
1de90 6d 65 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 46 64  me));.  }.  *pFd
1dea0 20 3d 20 66 64 3b 0a 20 20 69 66 28 20 66 64 3e   = fd;.  if( fd>
1deb0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1dec0 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20  TE_OK;.  return 
1ded0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1dee0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
1def0 54 2c 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72  T, "openDirector
1df00 79 22 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 7d  y", zDirname);.}
1df10 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1df20 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
1df30 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
1df40 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
1df50 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49  to disk..**.** I
1df60 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68  f dataOnly==0 th
1df70 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65  en both the file
1df80 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20   itself and its 
1df90 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a  metadata (file.*
1dfa0 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74  * size, access t
1dfb0 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79  ime, etc) are sy
1dfc0 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e  nced.  If dataOn
1dfd0 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20  ly!=0 then only 
1dfe0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61  the.** file data
1dff0 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
1e000 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c  * Under Unix, al
1e010 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  so make sure tha
1e020 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  t the directory 
1e030 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1e040 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
1e050 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d  reated by fsync-
1e060 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
1e070 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
1e080 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20  the file..** If 
1e090 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  we do not do thi
1e0a0 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74  s and we encount
1e0b0 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
1e0c0 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72  re, the director
1e0d0 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74  y.** entry for t
1e0e0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1e0f0 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72   not exist after
1e100 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65   we reboot.  The
1e110 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20   next.** SQLite 
1e120 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69  to access the fi
1e130 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77  le will not know
1e140 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1e150 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73  l exists (becaus
1e160 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  e.** the directo
1e170 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1e180 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76   journal was nev
1e190 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20  er created) and 
1e1a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
1e1b0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
1e1c0 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79   back - possibly
1e1d0 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61   leading to data
1e1e0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1e1f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1e200 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  nixSync(sqlite3_
1e210 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
1e220 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
1e230 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1e240 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1e250 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61  d;..  int isData
1e260 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51  Only = (flags&SQ
1e270 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
1e280 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c  LY);.  int isFul
1e290 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30  lsync = (flags&0
1e2a0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1e2b0 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68  C_FULL;..  /* Ch
1e2c0 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
1e2d0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1e2e0 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
1e2f0 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
1e300 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
1e310 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1e320 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
1e330 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1e340 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
1e350 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
1e360 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
1e370 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
1e380 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
1e390 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
1e3a0 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
1e3b0 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
1e3c0 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
1e3d0 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
1e3e0 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
1e3f0 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
1e400 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
1e410 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
1e420 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
1e430 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
1e440 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63  pFile->h));.  rc
1e450 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46   = full_fsync(pF
1e460 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79  ile->h, isFullsy
1e470 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b  nc, isDataOnly);
1e480 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1e490 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
1e4a0 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72  ( rc ){.    stor
1e4b0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
1e4c0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65  , errno);.    re
1e4d0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1e4e0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
1e4f0 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e  SYNC, "full_fsyn
1e500 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  c", pFile->zPath
1e510 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73  );.  }..  /* Als
1e520 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65  o fsync the dire
1e530 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
1e540 20 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65   the file if the
1e550 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20   DIRSYNC flag.  
1e560 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73  ** is set.  This
1e570 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f   is a one-time o
1e580 63 63 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e 79  ccurrence.  Many
1e590 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c   systems (exampl
1e5a0 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72  es: AIX).  ** ar
1e5b0 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e  e unable to fsyn
1e5c0 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73  c a directory, s
1e5d0 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20  o ignore errors 
1e5e0 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20  on the fsync..  
1e5f0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1e600 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
1e610 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a  FILE_DIRSYNC ){.
1e620 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20      int dirfd;. 
1e630 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52     OSTRACE(("DIR
1e640 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75  SYNC %s (have_fu
1e650 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73  llfsync=%d fulls
1e660 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c  ync=%d)\n", pFil
1e670 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20  e->zPath,.      
1e680 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46        HAVE_FULLF
1e690 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63  SYNC, isFullsync
1e6a0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f  ));.    rc = osO
1e6b0 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69  penDirectory(pFi
1e6c0 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66  le->zPath, &dirf
1e6d0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
1e6e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e6f0 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69     full_fsync(di
1e700 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rfd, 0, 0);.    
1e710 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
1e720 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c  File, dirfd, __L
1e730 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73  INE__);.    }els
1e740 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1e750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
1e760 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72 63  OPEN );.      rc
1e770 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e780 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63    }.    pFile->c
1e790 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49  trlFlags &= ~UNI
1e7a0 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20  XFILE_DIRSYNC;. 
1e7b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1e7c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
1e7d0 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
1e7e0 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
1e7f0 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
1e800 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71   unixTruncate(sq
1e810 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1e820 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e  i64 nByte){.  un
1e830 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1e840 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
1e850 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1e860 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
1e870 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1e880 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1e890 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a  ERR_TRUNCATE );.
1e8a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
1e8b0 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
1e8c0 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
1e8d0 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75  r this file, tru
1e8e0 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66  ncate the.  ** f
1e8f0 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ile so that it c
1e900 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e  onsists of an in
1e910 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
1e920 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65  chunks (i.e. the
1e930 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c  .  ** actual fil
1e940 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65  e size after the
1e950 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62   operation may b
1e960 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
1e970 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a  e requested.  **
1e980 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   size)..  */.  i
1e990 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1e9a0 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  k>0 ){.    nByte
1e9b0 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69   = ((nByte + pFi
1e9c0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29  le->szChunk - 1)
1e9d0 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29  /pFile->szChunk)
1e9e0 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
1e9f0 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  k;.  }..  rc = r
1ea00 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1ea10 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29  pFile->h, nByte)
1ea20 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1ea30 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1ea40 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
1ea50 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1ea60 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1ea70 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1ea80 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1ea90 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
1eaa0 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
1eab0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49  E_DEBUG.    /* I
1eac0 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1ead0 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
1eae0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1eaf0 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
1eb00 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68      ** doing a h
1eb10 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1eb20 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
1eb30 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
1eb40 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20  r than a.    ** 
1eb50 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1eb60 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75  file) and we tru
1eb70 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
1eb80 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20  o zero length,. 
1eb90 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63     ** that effec
1eba0 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74  tively updates t
1ebb0 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
1ebc0 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68  r.  This might h
1ebd0 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65  appen.    ** whe
1ebe0 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61  n restoring a da
1ebf0 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
1ec00 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d   backup API from
1ec10 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20   a zero-length. 
1ec20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20     ** source..  
1ec30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69    */.    if( pFi
1ec40 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
1ec50 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b  e && nByte==0 ){
1ec60 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  .      pFile->tr
1ec70 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
1ec80 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  .    }.#endif..#
1ec90 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1eca0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 2f 2a  AP_SIZE>0.    /*
1ecb0 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
1ecc0 20 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64 20   just truncated 
1ecd0 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65  to a size smalle
1ece0 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
1ecf0 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70 70  ntly.    ** mapp
1ed00 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63  ed region, reduc
1ed10 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  e the effective 
1ed20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20  mapping size as 
1ed30 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c  well. SQLite wil
1ed40 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65 61  l.    ** use rea
1ed50 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20  d() and write() 
1ed60 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62  to access data b
1ed70 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74  eyond this point
1ed80 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a   from now on.  .
1ed90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1eda0 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  Byte<pFile->mmap
1edb0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 46  Size ){.      pF
1edc0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  ile->mmapSize = 
1edd0 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23 65 6e  nByte;.    }.#en
1ede0 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  dif..    return 
1edf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
1ee00 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
1ee10 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
1ee20 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
1ee30 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
1ee40 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  int unixFileSize
1ee50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1ee60 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  d, i64 *pSize){.
1ee70 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
1ee80 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61  ct stat buf;.  a
1ee90 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
1eea0 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e  c = osFstat(((un
1eeb0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
1eec0 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74  &buf);.  Simulat
1eed0 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
1eee0 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
1eef0 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
1ef00 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  rno((unixFile*)i
1ef10 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  d, errno);.    r
1ef20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1ef30 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20  RR_FSTAT;.  }.  
1ef40 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f  *pSize = buf.st_
1ef50 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  size;..  /* When
1ef60 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d   opening a zero-
1ef70 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74  size database, t
1ef80 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  he findInodeInfo
1ef90 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  () procedure.  *
1efa0 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c  * writes a singl
1efb0 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74  e byte into that
1efc0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
1efd0 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  o work around a 
1efe0 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  bug.  ** in the 
1eff0 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73  OS-X msdos files
1f000 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72  ystem.  In order
1f010 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   to avoid proble
1f020 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20  ms with upper.  
1f030 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65  ** layers, we ne
1f040 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69  ed to report thi
1f050 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a  s file size as z
1f060 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20  ero even though 
1f070 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c  it is.  ** reall
1f080 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33  y 1.   Ticket #3
1f090 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  260..  */.  if( 
1f0a0 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69  *pSize==1 ) *pSi
1f0b0 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75  ze = 0;...  retu
1f0c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f0d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1f0e0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1f0f0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1f100 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e  PLE__)./*.** Han
1f110 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c  dler for proxy-l
1f120 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74  ocking file-cont
1f130 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69  rol verbs.  Defi
1f140 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65  ned below in the
1f150 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  .** proxying loc
1f160 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  king division..*
1f170 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
1f180 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  xyFileControl(sq
1f190 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
1f1a0 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  void*);.#endif..
1f1b0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
1f1c0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1f1d0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51 4c  o handle the SQL
1f1e0 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
1f1f0 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e  INT .** file-con
1f200 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20  trol operation. 
1f210 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61 74   Enlarge the dat
1f220 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73 20  abase to nBytes 
1f230 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e  in size.** (roun
1f240 64 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65  ded up to the ne
1f250 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20  xt chunk-size). 
1f260 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1f270 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e   is already.** n
1f280 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2c  Bytes or larger,
1f290 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1f2a0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1f2b0 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a  tic int fcntlSiz
1f2c0 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a  eHint(unixFile *
1f2d0 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74 65  pFile, i64 nByte
1f2e0 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ){.  if( pFile->
1f2f0 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
1f300 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20 20   i64 nSize;     
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f320 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c 65 20  * Required file 
1f330 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75  size */.    stru
1f340 63 74 20 73 74 61 74 20 62 75 66 3b 20 20 20 20  ct stat buf;    
1f350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
1f360 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e  d to hold return
1f370 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61 74   values of fstat
1f380 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66  () */.   .    if
1f390 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d  ( osFstat(pFile-
1f3a0 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20  >h, &buf) ){.   
1f3b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f3c0 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1f3d0 20 20 7d 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d    }..    nSize =
1f3e0 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e   ((nByte+pFile->
1f3f0 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69  szChunk-1) / pFi
1f400 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
1f410 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
1f420 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36     if( nSize>(i6
1f430 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b  4)buf.st_size ){
1f440 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
1f450 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1f460 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
1f470 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20  X_FALLOCATE.    
1f480 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65    /* The code be
1f490 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20  low is handling 
1f4a0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1f4b0 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28   of osFallocate(
1f4c0 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  ) .      ** corr
1f4d0 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c  ectly. posix_fal
1f4e0 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69  locate() is defi
1f4f0 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20  ned to "returns 
1f500 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
1f510 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e   .      ** or an
1f520 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e   error number on
1f530 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20    failure". See 
1f540 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20  the manpage for 
1f550 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  details. */.    
1f560 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20    int err;.     
1f570 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72   do{.        err
1f580 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70   = osFallocate(p
1f590 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f  File->h, buf.st_
1f5a0 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e  size, nSize-buf.
1f5b0 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  st_size);.      
1f5c0 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e  }while( err==EIN
1f5d0 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TR );.      if( 
1f5e0 65 72 72 20 26 26 20 65 72 72 21 3d 45 49 4e 56  err && err!=EINV
1f5f0 41 4c 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  AL ) return SQLI
1f600 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1f610 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49  #else.      /* I
1f620 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f  f the OS does no
1f630 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c  t have posix_fal
1f640 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69  locate(), fake i
1f650 74 2e 20 57 72 69 74 65 20 61 20 0a 20 20 20 20  t. Write a .    
1f660 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65    ** single byte
1f670 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74   to the last byt
1f680 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20  e in each block 
1f690 74 68 61 74 20 66 61 6c 6c 73 20 65 6e 74 69 72  that falls entir
1f6a0 65 6c 79 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  ely.      ** wit
1f6b0 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64  hin the extended
1f6c0 20 72 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20 69   region. Then, i
1f6d0 66 20 72 65 71 75 69 72 65 64 2c 20 61 20 73 69  f required, a si
1f6e0 6e 67 6c 65 20 62 79 74 65 0a 20 20 20 20 20 20  ngle byte.      
1f6f0 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 28 6e 53  ** at offset (nS
1f700 69 7a 65 2d 31 29 2c 20 74 6f 20 73 65 74 20 74  ize-1), to set t
1f710 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
1f720 69 6c 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ile correctly.. 
1f730 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
1f740 61 20 73 69 6d 69 6c 61 72 20 74 65 63 68 6e 69  a similar techni
1f750 71 75 65 20 74 6f 20 74 68 61 74 20 75 73 65 64  que to that used
1f760 20 62 79 20 67 6c 69 62 63 20 6f 6e 20 73 79 73   by glibc on sys
1f770 74 65 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  tems.      ** th
1f780 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  at do not have a
1f790 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28   real fallocate(
1f7a0 29 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  ) call..      */
1f7b0 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20  .      int nBlk 
1f7c0 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65  = buf.st_blksize
1f7d0 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65  ;  /* File-syste
1f7e0 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a  m block size */.
1f7f0 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65        int nWrite
1f800 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f810 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1f820 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79 20  ytes written by 
1f830 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
1f840 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74 65        i64 iWrite
1f850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f860 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74    /* Next offset
1f870 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1f880 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d 20  .      iWrite = 
1f890 28 62 75 66 2e 73 74 5f 73 69 7a 65 2f 6e 42 6c  (buf.st_size/nBl
1f8a0 6b 29 2a 6e 42 6c 6b 20 2b 20 6e 42 6c 6b 20 2d  k)*nBlk + nBlk -
1f8b0 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
1f8c0 28 20 69 57 72 69 74 65 3e 3d 62 75 66 2e 73 74  ( iWrite>=buf.st
1f8d0 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  _size );.      a
1f8e0 73 73 65 72 74 28 20 28 28 69 57 72 69 74 65 2b  ssert( ((iWrite+
1f8f0 31 29 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20  1)%nBlk)==0 );. 
1f900 20 20 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70       for(/*no-op
1f910 2a 2f 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a 65  */; iWrite<nSize
1f920 2b 6e 42 6c 6b 2d 31 3b 20 69 57 72 69 74 65 2b  +nBlk-1; iWrite+
1f930 3d 6e 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 20  =nBlk ){.       
1f940 20 69 66 28 20 69 57 72 69 74 65 3e 3d 6e 53 69   if( iWrite>=nSi
1f950 7a 65 20 29 20 69 57 72 69 74 65 20 3d 20 6e 53  ze ) iWrite = nS
1f960 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  ize - 1;.       
1f970 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e   nWrite = seekAn
1f980 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57  dWrite(pFile, iW
1f990 72 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20  rite, "", 1);.  
1f9a0 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
1f9b0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
1f9c0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1f9d0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1f9e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53      }.  }..#if S
1f9f0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1fa00 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c  IZE>0.  if( pFil
1fa10 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30  e->mmapSizeMax>0
1fa20 20 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d   && nByte>pFile-
1fa30 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
1fa40 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28   int rc;.    if(
1fa50 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c   pFile->szChunk<
1fa60 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1fa70 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1fa80 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65  (pFile->h, nByte
1fa90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  ) ){.        sto
1faa0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1fab0 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
1fac0 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1fad0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1fae0 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
1faf0 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
1fb00 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1fb10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  }.    }..    rc 
1fb20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46  = unixMapfile(pF
1fb30 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ile, nByte);.   
1fb40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1fb50 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1fb60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1fb70 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1fb80 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74   initially negat
1fb90 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
1fba0 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
1fbb0 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
1fbc0 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
1fbd0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
1fbe0 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
1fbf0 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
1fc00 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
1fc10 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
1fc20 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
1fc30 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
1fc40 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
1fc50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1fc60 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78  unixModeBit(unix
1fc70 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
1fc80 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
1fc90 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
1fca0 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
1fcb0 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
1fcc0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
1fcd0 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
1fce0 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
1fcf0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1fd00 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
1fd10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
1fd20 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
1fd30 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
1fd40 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
1fd50 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
1fd60 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  int unixGetTempn
1fd70 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
1fd80 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a  ar *zBuf);../*.*
1fd90 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  * Information an
1fda0 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20  d control of an 
1fdb0 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
1fdc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fdd0 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  unixFileControl(
1fde0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1fdf0 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
1fe00 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c  pArg){.  unixFil
1fe10 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1fe20 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74  File*)id;.  swit
1fe30 63 68 28 20 6f 70 20 29 7b 0a 23 69 66 20 64 65  ch( op ){.#if de
1fe40 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
1fe50 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
1fe60 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f  TE_ENABLE_BATCH_
1fe70 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20  ATOMIC_WRITE).  
1fe80 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1fe90 4e 54 4c 5f 42 45 47 49 4e 5f 41 54 4f 4d 49 43  NTL_BEGIN_ATOMIC
1fea0 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20  _WRITE: {.      
1feb0 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c  int rc = osIoctl
1fec0 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f  (pFile->h, F2FS_
1fed0 49 4f 43 5f 53 54 41 52 54 5f 41 54 4f 4d 49 43  IOC_START_ATOMIC
1fee0 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20 72  _WRITE);.      r
1fef0 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54  eturn rc ? SQLIT
1ff00 45 5f 49 4f 45 52 52 5f 42 45 47 49 4e 5f 41 54  E_IOERR_BEGIN_AT
1ff10 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  OMIC : SQLITE_OK
1ff20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ff30 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 4f   SQLITE_FCNTL_CO
1ff40 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54  MMIT_ATOMIC_WRIT
1ff50 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  E: {.      int r
1ff60 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c  c = osIoctl(pFil
1ff70 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 43  e->h, F2FS_IOC_C
1ff80 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49  OMMIT_ATOMIC_WRI
1ff90 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  TE);.      retur
1ffa0 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 49 4f  n rc ? SQLITE_IO
1ffb0 45 52 52 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49  ERR_COMMIT_ATOMI
1ffc0 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  C : SQLITE_OK;. 
1ffd0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1ffe0 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 4f 4c 4c 42  LITE_FCNTL_ROLLB
1fff0 41 43 4b 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  ACK_ATOMIC_WRITE
20000 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  : {.      int rc
20010 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c 65   = osIoctl(pFile
20020 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 41 42  ->h, F2FS_IOC_AB
20030 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52 49  ORT_VOLATILE_WRI
20040 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  TE);.      retur
20050 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 49 4f  n rc ? SQLITE_IO
20060 45 52 52 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54 4f  ERR_ROLLBACK_ATO
20070 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b  MIC : SQLITE_OK;
20080 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
20090 20 5f 5f 6c 69 6e 75 78 5f 5f 20 26 26 20 53 51   __linux__ && SQ
200a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43  LITE_ENABLE_BATC
200b0 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 2a  H_ATOMIC_WRITE *
200c0 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  /..    case SQLI
200d0 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
200e0 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  TE: {.      *(in
200f0 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  t*)pArg = pFile-
20100 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20  >eFileLock;.    
20110 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20120 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
20130 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
20140 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20  LAST_ERRNO: {.  
20150 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
20160 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  = pFile->lastErr
20170 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
20180 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20190 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
201a0 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
201b0 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ZE: {.      pFil
201c0 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  e->szChunk = *(i
201d0 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
201e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
201f0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
20200 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
20210 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20  IZE_HINT: {.    
20220 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
20230 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
20240 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
20250 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69  rc = fcntlSizeHi
20260 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34 20  nt(pFile, *(i64 
20270 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 53  *)pArg);.      S
20280 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
20290 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 72  nign(0);.      r
202a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
202b0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
202c0 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41  FCNTL_PERSIST_WA
202d0 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d  L: {.      unixM
202e0 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e  odeBit(pFile, UN
202f0 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  IXFILE_PERSIST_W
20300 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  AL, (int*)pArg);
20310 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
20320 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
20330 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
20340 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
20350 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20  VERWRITE: {.    
20360 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46    unixModeBit(pF
20370 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53  ile, UNIXFILE_PS
20380 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  OW, (int*)pArg);
20390 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
203a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
203b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
203c0 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a  CNTL_VFSNAME: {.
203d0 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
203e0 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Arg = sqlite3_mp
203f0 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c  rintf("%s", pFil
20400 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b  e->pVfs->zName);
20410 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
20420 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
20430 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
20440 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
20450 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  E: {.      char 
20460 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  *zTFile = sqlite
20470 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 70 46 69 6c  3_malloc64( pFil
20480 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  e->pVfs->mxPathn
20490 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ame );.      if(
204a0 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20   zTFile ){.     
204b0 20 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61     unixGetTempna
204c0 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  me(pFile->pVfs->
204d0 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69  mxPathname, zTFi
204e0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 63  le);.        *(c
204f0 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46  har**)pArg = zTF
20500 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ile;.      }.   
20510 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20520 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
20530 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
20540 5f 48 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20  _HAS_MOVED: {.  
20550 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
20560 3d 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70  = fileHasMoved(p
20570 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74  File);.      ret
20580 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20590 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
205a0 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f  TE_ENABLE_SETLK_
205b0 54 49 4d 45 4f 55 54 0a 20 20 20 20 63 61 73 65  TIMEOUT.    case
205c0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
205d0 43 4b 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20  CK_TIMEOUT: {.  
205e0 20 20 20 20 70 46 69 6c 65 2d 3e 69 42 75 73 79      pFile->iBusy
205f0 54 69 6d 65 6f 75 74 20 3d 20 2a 28 69 6e 74 2a  Timeout = *(int*
20600 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74  )pArg;.      ret
20610 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20620 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
20630 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
20640 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20  SIZE>0.    case 
20650 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
20660 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  P_SIZE: {.      
20670 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a  i64 newLimit = *
20680 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20  (i64*)pArg;.    
20690 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
206a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
206b0 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33  newLimit>sqlite3
206c0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
206d0 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  map ){.        n
206e0 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  ewLimit = sqlite
206f0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
20700 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Mmap;.      }.. 
20710 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
20720 65 20 6f 66 20 6e 65 77 4c 69 6d 69 74 20 6d 61  e of newLimit ma
20730 79 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  y be eventually 
20740 63 61 73 74 20 74 6f 20 28 73 69 7a 65 5f 74 29  cast to (size_t)
20750 20 61 6e 64 20 70 61 73 73 65 64 0a 20 20 20 20   and passed.    
20760 20 20 2a 2a 20 74 6f 20 6d 6d 61 70 28 29 2e 20    ** to mmap(). 
20770 52 65 73 74 72 69 63 74 20 69 74 73 20 76 61 6c  Restrict its val
20780 75 65 20 74 6f 20 32 47 42 20 69 66 20 28 73 69  ue to 2GB if (si
20790 7a 65 5f 74 29 20 69 73 20 6e 6f 74 20 61 74 20  ze_t) is not at 
207a0 6c 65 61 73 74 20 61 0a 20 20 20 20 20 20 2a 2a  least a.      **
207b0 20 36 34 2d 62 69 74 20 74 79 70 65 2e 20 2a 2f   64-bit type. */
207c0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
207d0 6d 69 74 3e 30 20 26 26 20 73 69 7a 65 6f 66 28  mit>0 && sizeof(
207e0 73 69 7a 65 5f 74 29 3c 38 20 29 7b 0a 20 20 20  size_t)<8 ){.   
207f0 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
20800 28 6e 65 77 4c 69 6d 69 74 20 26 20 30 78 37 46  (newLimit & 0x7F
20810 46 46 46 46 46 46 29 3b 0a 20 20 20 20 20 20 7d  FFFFFF);.      }
20820 0a 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70  ..      *(i64*)p
20830 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  Arg = pFile->mma
20840 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20  pSizeMax;.      
20850 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
20860 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69  && newLimit!=pFi
20870 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
20880 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68  && pFile->nFetch
20890 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
208a0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
208b0 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  eMax = newLimit;
208c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
208d0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  le->mmapSize>0 )
208e0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78  {.          unix
208f0 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
20900 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
20910 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69   unixMapfile(pFi
20920 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  le, -1);.       
20930 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
20940 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20950 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
20960 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
20970 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
20980 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20  lls this method 
20990 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69  to signal that i
209a0 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a  t has done.    *
209b0 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  * a rollback and
209c0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
209d0 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  se is therefore 
209e0 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20  unchanged and.  
209f0 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74    ** it hence it
20a00 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74   is OK for the t
20a10 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67  ransaction chang
20a20 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a  e counter to be.
20a30 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64      ** unchanged
20a40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
20a50 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  e SQLITE_FCNTL_D
20a60 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20  B_UNCHANGED: {. 
20a70 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
20a80 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d  )id)->dbUpdate =
20a90 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
20aa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20ab0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  }.#endif.#if SQL
20ac0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
20ad0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
20ae0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
20af0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
20b00 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_SET_LOCKPRO
20b10 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65  XYFILE:.    case
20b20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45   SQLITE_FCNTL_GE
20b30 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
20b40 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
20b50 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
20b60 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20  (id,op,pArg);.  
20b70 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
20b80 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
20b90 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
20ba0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
20bb0 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
20bc0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
20bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 64  .}../*.** If pFd
20be0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  ->sectorSize is 
20bf0 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 74 68  non-zero when th
20c00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
20c10 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 0a 2a  alled, it is a.*
20c20 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  * no-op. Otherwi
20c30 73 65 2c 20 74 68 65 20 76 61 6c 75 65 73 20 6f  se, the values o
20c40 66 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a  f pFd->sectorSiz
20c50 65 20 61 6e 64 20 0a 2a 2a 20 70 46 64 2d 3e 64  e and .** pFd->d
20c60 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
20c70 74 69 63 73 20 61 72 65 20 73 65 74 20 61 63 63  tics are set acc
20c80 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 69  ording to the fi
20c90 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 63 68  le-system .** ch
20ca0 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 20 0a  aracteristics. .
20cb0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
20cc0 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  two versions of 
20cd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f  this function. O
20ce0 6e 65 20 66 6f 72 20 51 4e 58 20 61 6e 64 20 6f  ne for QNX and o
20cf0 6e 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6f 74  ne for all.** ot
20d00 68 65 72 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  her systems..*/.
20d10 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  #ifndef __QNXNTO
20d20 5f 5f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  __.static void s
20d30 65 74 44 65 76 69 63 65 43 68 61 72 61 63 74 65  etDeviceCharacte
20d40 72 69 73 74 69 63 73 28 75 6e 69 78 46 69 6c 65  ristics(unixFile
20d50 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74   *pFd){.  assert
20d60 28 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61  ( pFd->deviceCha
20d70 72 61 63 74 65 72 69 73 74 69 63 73 3d 3d 30 20  racteristics==0 
20d80 7c 7c 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69  || pFd->sectorSi
20d90 7a 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ze!=0 );.  if( p
20da0 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d 3d  Fd->sectorSize==
20db0 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  0 ){.#if defined
20dc0 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64  (__linux__) && d
20dd0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
20de0 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49  ABLE_BATCH_ATOMI
20df0 43 5f 57 52 49 54 45 29 0a 20 20 20 20 69 6e 74  C_WRITE).    int
20e00 20 72 65 73 3b 0a 20 20 20 20 75 33 32 20 66 20   res;.    u32 f 
20e10 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  = 0;..    /* Che
20e20 63 6b 20 66 6f 72 20 73 75 70 70 6f 72 74 20 66  ck for support f
20e30 6f 72 20 46 32 46 53 20 61 74 6f 6d 69 63 20 62  or F2FS atomic b
20e40 61 74 63 68 20 77 72 69 74 65 73 2e 20 2a 2f 0a  atch writes. */.
20e50 20 20 20 20 72 65 73 20 3d 20 6f 73 49 6f 63 74      res = osIoct
20e60 6c 28 70 46 64 2d 3e 68 2c 20 46 32 46 53 5f 49  l(pFd->h, F2FS_I
20e70 4f 43 5f 47 45 54 5f 46 45 41 54 55 52 45 53 2c  OC_GET_FEATURES,
20e80 20 26 66 29 3b 0a 20 20 20 20 69 66 28 20 72 65   &f);.    if( re
20e90 73 3d 3d 30 20 26 26 20 28 66 20 26 20 46 32 46  s==0 && (f & F2F
20ea0 53 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d 49 43  S_FEATURE_ATOMIC
20eb0 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20  _WRITE) ){.     
20ec0 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72   pFd->deviceChar
20ed0 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 53 51  acteristics = SQ
20ee0 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48  LITE_IOCAP_BATCH
20ef0 5f 41 54 4f 4d 49 43 3b 0a 20 20 20 20 7d 0a 23  _ATOMIC;.    }.#
20f00 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78  endif /* __linux
20f10 5f 5f 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  __ && SQLITE_ENA
20f20 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
20f30 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20 20 2f  _WRITE */..    /
20f40 2a 20 53 65 74 20 74 68 65 20 50 4f 57 45 52 53  * Set the POWERS
20f50 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 66 6c  AFE_OVERWRITE fl
20f60 61 67 20 69 66 20 72 65 71 75 65 73 74 65 64 2e  ag if requested.
20f70 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 64 2d   */.    if( pFd-
20f80 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
20f90 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20  XFILE_PSOW ){.  
20fa0 20 20 20 20 70 46 64 2d 3e 64 65 76 69 63 65 43      pFd->deviceC
20fb0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 7c  haracteristics |
20fc0 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  = SQLITE_IOCAP_P
20fd0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
20fe0 54 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  TE;.    }..    p
20ff0 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  Fd->sectorSize =
21000 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
21010 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
21020 0a 7d 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75 64  .}.#else.#includ
21030 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e  e <sys/dcmd_blk.
21040 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
21050 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74 61 74  /statvfs.h>.stat
21060 69 63 20 76 6f 69 64 20 73 65 74 44 65 76 69 63  ic void setDevic
21070 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
21080 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
21090 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ){.  if( pFile->
210a0 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20  sectorSize == 0 
210b0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
210c0 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  atvfs fsInfo;.  
210d0 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74       .    /* Set
210e0 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f   defaults for no
210f0 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65  n-supported file
21100 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70  systems */.    p
21110 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
21120 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
21130 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  T_SECTOR_SIZE;. 
21140 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
21150 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
21160 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74  = 0;.    if( fst
21170 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20  atvfs(pFile->h, 
21180 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
21190 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b   {.      return;
211a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
211b0 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
211c0 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70 22  _basetype, "tmp"
211d0 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ) ) {.      pFil
211e0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
211f0 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
21200 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
21210 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
21220 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c  cs =.        SQL
21230 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
21240 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c  4K |       /* Al
21250 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  l ram filesystem
21260 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d   writes are atom
21270 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
21280 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
21290 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
212a0 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
212b0 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
212c0 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
212f0 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
21300 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
21310 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
21320 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
21330 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
21340 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
21350 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21370 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
21380 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
21390 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
213a0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74 72  }else if( strstr
213b0 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
213c0 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a 20  pe, "etfs") ){. 
213d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
213e0 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
213f0 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
21400 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
21410 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
21420 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63 6c        /* etfs cl
21430 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74 65  uster size write
21440 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
21450 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d 3e          (pFile->
21460 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32  sectorSize / 512
21470 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   * SQLITE_IOCAP_
21480 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20 20  ATOMIC512) |.   
21490 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
214a0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20  P_SAFE_APPEND | 
214b0 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68     /* growing th
214c0 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
214d0 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20  occur until.    
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21500 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73    ** the write s
21510 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20  ucceeds */.     
21520 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
21530 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
21540 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
21550 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
21560 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
21570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21590 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
215a0 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
215b0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
215c0 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
215d0 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78  f_basetype, "qnx
215e0 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  6") ){.      pFi
215f0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
21600 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
21610 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
21620 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
21630 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
21640 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
21650 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20 41  C |         /* A
21660 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72  ll filesystem wr
21670 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
21680 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
21690 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
216a0 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77  END |    /* grow
216b0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65  ing the file doe
216c0 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69  s not occur unti
216d0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
216e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216f0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77          ** the w
21700 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f  rite succeeds */
21710 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
21720 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
21730 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
21740 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
21750 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
21760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21780 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
21790 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
217a0 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
217b0 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28 66  se if( !strcmp(f
217c0 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
217d0 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20 20  , "qnx4") ){.   
217e0 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
217f0 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
21800 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
21810 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
21820 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
21830 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73      /* full bits
21840 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72  et of atomics fr
21850 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69  om max sector si
21860 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a  ze and smaller *
21870 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c  /.        ((pFil
21880 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
21890 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
218a0 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c  AP_ATOMIC512) <<
218b0 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20   1) - 2 |.      
218c0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
218d0 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20  EQUENTIAL |     
218e0 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73  /* The ram files
218f0 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69  ystem has no wri
21900 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20  te behind.      
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21930 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65  ** so it is orde
21940 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  red */.        0
21950 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
21960 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f  strstr(fsInfo.f_
21970 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22 29  basetype, "dos")
21980 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
21990 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
219a0 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
219b0 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
219c0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
219d0 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75   =.        /* fu
219e0 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f  ll bitset of ato
219f0 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65  mics from max se
21a00 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d  ctor size and sm
21a10 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  aller */.       
21a20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72   ((pFile->sector
21a30 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c  Size / 512 * SQL
21a40 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
21a50 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c  512) << 1) - 2 |
21a60 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
21a70 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
21a80 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
21a90 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
21aa0 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
21ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ad0 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
21ae0 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
21af0 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
21b00 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
21b10 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
21b20 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
21b30 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
21b40 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20 2f  OMIC512 |      /
21b50 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f  * blocks are ato
21b60 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
21b70 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
21b80 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
21b90 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
21ba0 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
21bb0 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
21be0 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
21bf0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  s */.        0;.
21c00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c      }.  }.  /* L
21c10 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69 66  ast chance verif
21c20 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  ication.  If the
21c30 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 6e   sector size isn
21c40 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  't a multiple of
21c50 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69   512.  ** then i
21c60 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f  t isn't valid.*/
21c70 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65  .  if( pFile->se
21c80 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20 21  ctorSize % 512 !
21c90 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  = 0 ){.    pFile
21ca0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
21cb0 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20  ristics = 0;.   
21cc0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
21cd0 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
21ce0 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
21cf0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
21d00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
21d10 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
21d20 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
21d30 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
21d40 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
21d50 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
21d60 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
21d70 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
21d80 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
21d90 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
21da0 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
21db0 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
21dc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
21dd0 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
21de0 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
21df0 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
21e00 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
21e10 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
21e20 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
21e30 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
21e40 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
21e50 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
21e60 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
21e70 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
21e80 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
21e90 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
21ea0 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
21eb0 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
21ec0 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75  ixFile *pFd = (u
21ed0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
21ee0 65 74 44 65 76 69 63 65 43 68 61 72 61 63 74 65  etDeviceCharacte
21ef0 72 69 73 74 69 63 73 28 70 46 64 29 3b 0a 20 20  ristics(pFd);.  
21f00 72 65 74 75 72 6e 20 70 46 64 2d 3e 73 65 63 74  return pFd->sect
21f10 6f 72 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  orSize;.}../*.**
21f20 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69   Return the devi
21f30 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
21f40 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  cs for the file.
21f50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53 20  .**.** This VFS 
21f60 69 73 20 73 65 74 20 75 70 20 74 6f 20 72 65 74  is set up to ret
21f70 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  urn SQLITE_IOCAP
21f80 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
21f90 52 49 54 45 20 62 79 20 64 65 66 61 75 6c 74 2e  RITE by default.
21fa0 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61  .** However, tha
21fb0 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e 74  t choice is cont
21fc0 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63 65 20  roversial since 
21fd0 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20  technically the 
21fe0 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69  underlying.** fi
21ff0 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e  le system does n
22000 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69 64  ot always provid
22010 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65 72  e powersafe over
22020 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74 68  writes.  (In oth
22030 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74  er.** words, aft
22040 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20  er a power-loss 
22050 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66 20  event, parts of 
22060 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65  the file that we
22070 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74  re never.** writ
22080 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75 70  ten might end up
22090 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e 29   being altered.)
220a0 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50    However, non-P
220b0 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73 20  SOW behavior is 
220c0 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61  very,.** very ra
220d0 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74 69  re.  And asserti
220e0 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61 20  ng PSOW makes a 
220f0 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e 20  large reduction 
22100 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a  in the amount.**
22110 20 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f 4f   of required I/O
22120 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c   for journaling,
22130 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20   since a lot of 
22140 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d 69  padding is elimi
22150 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65  nated..**  Hence
22160 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41 46  , while POWERSAF
22170 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 6f  E_OVERWRITE is o
22180 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68  n by default, th
22190 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63 6f  ere is a file-co
221a0 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62  ntrol.** availab
221b0 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66  le to turn it of
221c0 66 20 61 6e 64 20 55 52 49 20 71 75 65 72 79 20  f and URI query 
221d0 70 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c 61  parameter availa
221e0 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f  ble to turn it o
221f0 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
22200 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72  t unixDeviceChar
22210 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
22220 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
22230 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d   unixFile *pFd =
22240 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
22250 20 20 73 65 74 44 65 76 69 63 65 43 68 61 72 61    setDeviceChara
22260 63 74 65 72 69 73 74 69 63 73 28 70 46 64 29 3b  cteristics(pFd);
22270 0a 20 20 72 65 74 75 72 6e 20 70 46 64 2d 3e 64  .  return pFd->d
22280 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
22290 74 69 63 73 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  tics;.}..#if !de
222a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
222b0 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
222c0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
222d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
222e0 68 65 20 73 79 73 74 65 6d 20 70 61 67 65 20 73  he system page s
222f0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ize..**.** This 
22300 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
22310 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 64 69  not be called di
22320 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65 72 20  rectly by other 
22330 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
22340 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20  e. .** Instead, 
22350 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  it should be cal
22360 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20 6f 73  led via macro os
22370 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e 0a 2a  Getpagesize()..*
22380 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
22390 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f 69  xGetpagesize(voi
223a0 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d){.#if OS_VXWOR
223b0 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30 32 34  KS.  return 1024
223c0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
223d0 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20 20 72  _BSD_SOURCE).  r
223e0 65 74 75 72 6e 20 67 65 74 70 61 67 65 73 69 7a  eturn getpagesiz
223f0 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  e();.#else.  ret
22400 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e 66  urn (int)sysconf
22410 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29 3b 0a  (_SC_PAGESIZE);.
22420 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69 66  #endif.}..#endif
22430 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
22440 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
22450 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
22460 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66 6e  _SIZE>0 */..#ifn
22470 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22480 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  WAL../*.** Objec
22490 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  t used to repres
224a0 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65  ent an shared me
224b0 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a  mory buffer.  .*
224c0 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70  *.** When multip
224d0 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72  le threads all r
224e0 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d  eference the sam
224f0 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63  e wal-index, eac
22500 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20  h thread.** has 
22510 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20  its own unixShm 
22520 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79  object, but they
22530 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20   all point to a 
22540 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a  single instance.
22550 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53  ** of this unixS
22560 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20  hmNode object.  
22570 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
22580 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69  each wal-index i
22590 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79  s opened.** only
225a0 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73   once per proces
225b0 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e  s..**.** Each un
225c0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
225d0 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
225e0 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e   a single unixIn
225f0 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  odeInfo object..
22600 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c  ** We could coal
22610 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74  esce this object
22620 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49   into unixInodeI
22630 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f  nfo, but that wo
22640 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72  uld mean.** ever
22650 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74  y open file that
22660 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68   does not use sh
22670 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20  ared memory (in 
22680 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73  other words, mos
22690 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29  t.** open files)
226a0 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63   would have to c
226b0 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73  arry around this
226c0 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
226d0 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75  on.  So.** the u
226e0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
226f0 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ect contains a p
22700 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75  ointer to this u
22710 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
22720 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69  t.** and the uni
22730 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
22740 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20  is created only 
22750 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  when needed..**.
22760 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  ** unixMutexHeld
22770 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
22780 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72  when creating or
22790 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74   destroying.** t
227a0 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68  his object or wh
227b0 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
227c0 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  riting the follo
227d0 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a  wing fields:.**.
227e0 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a  **      nRef.**.
227f0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
22800 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
22810 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
22820 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
22830 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66  d:.** .**      f
22840 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
22850 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
22860 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75  r unixShmNode.mu
22870 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
22880 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e   or unixShmNode.
22890 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75  nRef==0 and.** u
228a0 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69  nixMutexHeld() i
228b0 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
228c0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
228d0 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
228e0 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
228f0 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  ure..*/.struct u
22900 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75  nixShmNode {.  u
22910 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
22920 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69  node;     /* uni
22930 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20  xInodeInfo that 
22940 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f  owns this SHM no
22950 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
22960 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
22970 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61     /* Mutex to a
22980 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63  ccess this objec
22990 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  t */.  char *zFi
229a0 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
229b0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
229c0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
229d0 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
229f0 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
22a00 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73  iptor */.  int s
22a10 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  zRegion;        
22a20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
22a30 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
22a40 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20  egions */.  u16 
22a50 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  nRegion;        
22a60 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
22a70 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e  f array apRegion
22a80 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f   */.  u8 isReado
22a90 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
22aa0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
22ab0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20 69 73  -only */.  u8 is
22ac0 55 6e 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20  Unlocked;       
22ad0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
22ae0 20 6e 6f 20 44 4d 53 20 6c 6f 63 6b 20 68 65 6c   no DMS lock hel
22af0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70  d */.  char **ap
22b00 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
22b10 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 61    /* Array of ma
22b20 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  pped shared-memo
22b30 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
22b40 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
22b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22b60 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20  mber of unixShm 
22b70 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
22b80 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e   to this */.  un
22b90 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  ixShm *pFirst;  
22ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
22bb0 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20  unixShm objects 
22bc0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
22bd0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
22be0 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78 63  E_DEBUG.  u8 exc
22bf0 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
22c00 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
22c10 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
22c20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61  held */.  u8 sha
22c30 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
22c40 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
22c50 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
22c60 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68  d */.  u8 nextSh
22c70 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
22c80 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
22c90 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76  ble unixShm.id v
22ca0 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
22cb0 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75  ;../*.** Structu
22cc0 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  re used internal
22cd0 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74  ly by this VFS t
22ce0 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  o record the sta
22cf0 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e  te of an.** open
22d00 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63   shared memory c
22d10 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
22d20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
22d30 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61  ields are initia
22d40 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
22d50 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
22d60 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61  d and.** are rea
22d70 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65  d-only thereafte
22d80 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78  r:.**.**    unix
22d90 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20  Shm.pFile.**    
22da0 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a  unixShm.id.**.**
22db0 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64   All other field
22dc0 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65  s are read/write
22dd0 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e 70  .  The unixShm.p
22de0 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74  File->mutex must
22df0 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c   be held.** whil
22e00 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20  e accessing any 
22e10 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64  read/write field
22e20 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  s..*/.struct uni
22e30 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d  xShm {.  unixShm
22e40 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
22e50 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
22e60 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64  lying unixShmNod
22e70 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e  e object */.  un
22e80 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20  ixShm *pNext;   
22e90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
22ea0 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68   unixShm with th
22eb0 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f  e same unixShmNo
22ec0 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75  de */.  u8 hasMu
22ed0 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
22ee0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f     /* True if ho
22ef0 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68  lding the unixSh
22f00 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20  mNode mutex */. 
22f10 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20   u8 id;         
22f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
22f30 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  d of this connec
22f40 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20  tion within its 
22f50 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
22f60 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b   u16 sharedMask;
22f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
22f80 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
22f90 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31  cks held */.  u1
22fa0 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  6 exclMask;     
22fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
22fc0 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
22fd0 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a  cks held */.};..
22fe0 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20  /*.** Constants 
22ff0 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
23000 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58  .*/.#define UNIX
23010 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32  _SHM_BASE   ((22
23020 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
23030 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f 2a  K)*4)         /*
23040 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65   first lock byte
23050 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
23060 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49  _SHM_DMS    (UNI
23070 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54  X_SHM_BASE+SQLIT
23080 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a  E_SHM_NLOCK)  /*
23090 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20   deadman switch 
230a0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20  */../*.** Apply 
230b0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
230c0 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74  ocks for all byt
230d0 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72  es from ofst thr
230e0 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a  ough ofst+n-1..*
230f0 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b  *.** Locks block
23100 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20   if the mask is 
23110 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d  exactly UNIX_SHM
23120 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62  _C and are non-b
23130 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72  locking.** other
23140 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
23150 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65  int unixShmSyste
23160 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 46 69 6c  mLock(.  unixFil
23170 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
23180 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e 65 63 74 69  /* Open connecti
23190 6f 6e 20 74 6f 20 74 68 65 20 57 41 4c 20 66 69  on to the WAL fi
231a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  le */.  int lock
231b0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Type,          /
231c0 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c  * F_UNLCK, F_RDL
231d0 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a  CK, or F_WRLCK *
231e0 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
231f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23200 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
23210 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f  locking range */
23220 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20  .  int n        
23230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23240 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
23250 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  lock */.){.  uni
23260 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
23270 64 65 3b 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63  de; /* Apply loc
23280 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
23290 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
232a0 67 6d 65 6e 74 20 2a 2f 0a 20 20 73 74 72 75 63  gment */.  struc
232b0 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20  t flock f;      
232c0 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61    /* The posix a
232d0 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20  dvisory locking 
232e0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
232f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23300 4b 3b 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20  K;    /* Result 
23310 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28  code form fcntl(
23320 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
23330 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d  s to the unixShm
23340 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
23350 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
23360 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 70 53 68   caller */.  pSh
23370 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  mNode = pFile->p
23380 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
23390 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
233a0 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  ode->nRef==0 || 
233b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
233c0 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ld(pShmNode->mut
233d0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61  ex) );..  /* Sha
233e0 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20  red locks never 
233f0 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f  span more than o
23400 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73  ne byte */.  ass
23410 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63  ert( n==1 || loc
23420 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29  kType!=F_RDLCK )
23430 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72  ;..  /* Locks ar
23440 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a  e within range *
23450 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  /.  assert( n>=1
23460 20 26 26 20 6e 3c 3d 53 51 4c 49 54 45 5f 53 48   && n<=SQLITE_SH
23470 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  M_NLOCK );..  if
23480 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
23490 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69   ){.    /* Initi
234a0 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e  alize the lockin
234b0 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
234c0 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c      f.l_type = l
234d0 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c  ockType;.    f.l
234e0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
234f0 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72  ET;.    f.l_star
23500 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e  t = ofst;.    f.
23510 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 20 20 20 20 72  l_len = n;.    r
23520 63 20 3d 20 6f 73 53 65 74 50 6f 73 69 78 41 64  c = osSetPosixAd
23530 76 69 73 6f 72 79 4c 6f 63 6b 28 70 53 68 6d 4e  visoryLock(pShmN
23540 6f 64 65 2d 3e 68 2c 20 26 66 2c 20 70 46 69 6c  ode->h, &f, pFil
23550 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63  e);.    rc = (rc
23560 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
23570 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
23580 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  Y;.  }..  /* Upd
23590 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  ate the global l
235a0 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f  ock state and do
235b0 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a   debug tracing *
235c0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
235d0 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61  DEBUG.  { u16 ma
235e0 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  sk;.  OSTRACE(("
235f0 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20  SHM-LOCK "));.  
23600 6d 61 73 6b 20 3d 20 6f 66 73 74 3e 33 31 20 3f  mask = ofst>31 ?
23610 20 30 78 66 66 66 66 20 3a 20 28 31 3c 3c 28 6f   0xffff : (1<<(o
23620 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66  fst+n)) - (1<<of
23630 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  st);.  if( rc==S
23640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23650 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
23660 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  UNLCK ){.      O
23670 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20  STRACE(("unlock 
23680 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
23690 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
236a0 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
236b0 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
236c0 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  e->sharedMask &=
236d0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73   ~mask;.    }els
236e0 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
236f0 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
23700 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
23710 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
23720 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
23730 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
23740 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
23750 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
23760 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
23770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
23780 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46  ert( lockType==F
23790 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20  _WRLCK );.      
237a0 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d  OSTRACE(("write-
237b0 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
237c0 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
237d0 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d  ode->exclMask |=
237e0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68   mask;.      pSh
237f0 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
23800 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
23810 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
23820 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
23830 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
23840 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25  TRACE(("unlock %
23850 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29  d failed", ofst)
23860 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
23870 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
23880 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
23890 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
238a0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d  failed"));.    }
238b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
238c0 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  rt( lockType==F_
238d0 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f  WRLCK );.      O
238e0 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c  STRACE(("write-l
238f0 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
23900 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ofst));.    }.  
23910 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d  }.  OSTRACE((" -
23920 20 61 66 74 65 72 77 61 72 64 73 20 25 30 33 78   afterwards %03x
23930 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20  ,%03x\n",.      
23940 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
23950 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e  haredMask, pShmN
23960 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b  ode->exclMask));
23970 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
23980 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20  eturn rc;       
23990 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   .}../*.** Retur
239a0 6e 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75  n the minimum nu
239b0 6d 62 65 72 20 6f 66 20 33 32 4b 42 20 73 68 6d  mber of 32KB shm
239c0 20 72 65 67 69 6f 6e 73 20 74 68 61 74 20 73 68   regions that sh
239d0 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20 61  ould be mapped a
239e0 74 0a 2a 2a 20 61 20 74 69 6d 65 2c 20 61 73 73  t.** a time, ass
239f0 75 6d 69 6e 67 20 74 68 61 74 20 65 61 63 68 20  uming that each 
23a00 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
23a10 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
23a20 70 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75  ple of the.** cu
23a30 72 72 65 6e 74 20 73 79 73 74 65 6d 20 70 61 67  rrent system pag
23a40 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55 73  e-size..**.** Us
23a50 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 31  ually, this is 1
23a60 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
23a70 73 65 65 6d 73 20 74 6f 20 62 65 20 73 79 73 74  seems to be syst
23a80 65 6d 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e  ems that are con
23a90 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 75 73  figured.** to us
23aa0 65 20 36 34 4b 42 20 70 61 67 65 73 20 2d 20 69  e 64KB pages - i
23ab0 6e 20 74 68 69 73 20 63 61 73 65 20 65 61 63 68  n this case each
23ac0 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 63 6f   mapping must co
23ad0 76 65 72 20 61 74 20 6c 65 61 73 74 20 74 77 6f  ver at least two
23ae0 0a 2a 2a 20 73 68 6d 20 72 65 67 69 6f 6e 73 2e  .** shm regions.
23af0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
23b00 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d  nixShmRegionPerM
23b10 61 70 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20  ap(void){.  int 
23b20 73 68 6d 73 7a 20 3d 20 33 32 2a 31 30 32 34 3b  shmsz = 32*1024;
23b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
23b40 48 4d 20 72 65 67 69 6f 6e 20 73 69 7a 65 20 2a  HM region size *
23b50 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 6f  /.  int pgsz = o
23b60 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b 20  sGetpagesize(); 
23b70 20 20 2f 2a 20 53 79 73 74 65 6d 20 70 61 67 65    /* System page
23b80 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73 73 65 72   size */.  asser
23b90 74 28 20 28 28 70 67 73 7a 2d 31 29 26 70 67 73  t( ((pgsz-1)&pgs
23ba0 7a 29 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 50 61  z)==0 );   /* Pa
23bb0 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
23bc0 61 20 70 6f 77 65 72 20 6f 66 20 32 20 2a 2f 0a  a power of 2 */.
23bd0 20 20 69 66 28 20 70 67 73 7a 3c 73 68 6d 73 7a    if( pgsz<shmsz
23be0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
23bf0 65 74 75 72 6e 20 70 67 73 7a 2f 73 68 6d 73 7a  eturn pgsz/shmsz
23c00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  ;.}../*.** Purge
23c10 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
23c20 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c  List list of all
23c30 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e   entries with un
23c40 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  ixShmNode.nRef==
23c50 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  0..**.** This is
23c60 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65   not a VFS share
23c70 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b  d-memory method;
23c80 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79   it is a utility
23c90 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
23ca0 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65  .** by VFS share
23cb0 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73  d-memory methods
23cc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23cd0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e   unixShmPurge(un
23ce0 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
23cf0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d  unixShmNode *p =
23d00 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53   pFd->pInode->pS
23d10 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  hmNode;.  assert
23d20 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
23d30 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  ) );.  if( p && 
23d40 41 4c 57 41 59 53 28 70 2d 3e 6e 52 65 66 3d 3d  ALWAYS(p->nRef==
23d50 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  0) ){.    int nS
23d60 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53  hmPerMap = unixS
23d70 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29  hmRegionPerMap()
23d80 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
23d90 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f   assert( p->pIno
23da0 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20  de==pFd->pInode 
23db0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
23dc0 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74  utex_free(p->mut
23dd0 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ex);.    for(i=0
23de0 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20  ; i<p->nRegion; 
23df0 69 2b 3d 6e 53 68 6d 50 65 72 4d 61 70 29 7b 0a  i+=nShmPerMap){.
23e00 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d        if( p->h>=
23e10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d  0 ){.        osM
23e20 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f  unmap(p->apRegio
23e30 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f  n[i], p->szRegio
23e40 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
23e50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23e60 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
23e70 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n[i]);.      }. 
23e80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23e90 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
23ea0 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68  n);.    if( p->h
23eb0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62  >=0 ){.      rob
23ec0 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70  ust_close(pFd, p
23ed0 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
23ee0 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b        p->h = -1;
23ef0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49  .    }.    p->pI
23f00 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
23f10 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
23f20 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
23f30 2f 2a 0a 2a 2a 20 54 68 65 20 44 4d 53 20 6c 6f  /*.** The DMS lo
23f40 63 6b 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ck has not yet b
23f50 65 65 6e 20 74 61 6b 65 6e 20 6f 6e 20 73 68 6d  een taken on shm
23f60 20 66 69 6c 65 20 70 53 68 6d 4e 6f 64 65 2e 20   file pShmNode. 
23f70 41 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 74 61  Attempt to.** ta
23f80 6b 65 20 69 74 20 6e 6f 77 2e 20 52 65 74 75 72  ke it now. Retur
23f90 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
23fa0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
23fb0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a   SQLite error.**
23fc0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
23fd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 44 4d  .**.** If the DM
23fe0 53 20 63 61 6e 6e 6f 74 20 62 65 20 6c 6f 63 6b  S cannot be lock
23ff0 65 64 20 62 65 63 61 75 73 65 20 74 68 69 73 20  ed because this 
24000 69 73 20 61 20 72 65 61 64 6f 6e 6c 79 5f 73 68  is a readonly_sh
24010 6d 3d 31 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  m=1 .** connecti
24020 6f 6e 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  on and no other 
24030 70 72 6f 63 65 73 73 20 61 6c 72 65 61 64 79 20  process already 
24040 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 2c 20 72 65  holds a lock, re
24050 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 52  turn.** SQLITE_R
24060 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54  EADONLY_CANTINIT
24070 20 61 6e 64 20 73 65 74 20 70 53 68 6d 4e 6f 64   and set pShmNod
24080 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 3d 31 2e  e->isUnlocked=1.
24090 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
240a0 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d  nixLockSharedMem
240b0 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
240c0 62 46 64 2c 20 75 6e 69 78 53 68 6d 4e 6f 64 65  bFd, unixShmNode
240d0 20 2a 70 53 68 6d 4e 6f 64 65 29 7b 0a 20 20 73   *pShmNode){.  s
240e0 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
240f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
24100 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 55 73  ITE_OK;..  /* Us
24110 65 20 46 5f 47 45 54 4c 4b 20 74 6f 20 64 65 74  e F_GETLK to det
24120 65 72 6d 69 6e 65 20 74 68 65 20 6c 6f 63 6b 73  ermine the locks
24130 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
24140 20 61 72 65 20 68 6f 6c 64 69 6e 67 0a 20 20 2a   are holding.  *
24150 2a 20 6f 6e 20 74 68 65 20 44 4d 53 20 62 79 74  * on the DMS byt
24160 65 2e 20 49 66 20 69 74 20 69 6e 64 69 63 61 74  e. If it indicat
24170 65 73 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20  es that another 
24180 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
24190 6e 67 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44  ng.  ** a SHARED
241a0 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 69 73   lock, then this
241b0 20 70 72 6f 63 65 73 73 20 6d 61 79 20 61 6c 73   process may als
241c0 6f 20 74 61 6b 65 20 61 20 53 48 41 52 45 44 20  o take a SHARED 
241d0 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 70 72  lock.  ** and pr
241e0 6f 63 65 65 64 20 77 69 74 68 20 6f 70 65 6e 69  oceed with openi
241f0 6e 67 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  ng the *-shm fil
24200 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72  e. .  **.  ** Or
24210 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 70 72  , if no other pr
24220 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
24230 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20   any lock, then 
24240 74 68 69 73 20 70 72 6f 63 65 73 73 0a 20 20 2a  this process.  *
24250 2a 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  * is the first t
24260 6f 20 6f 70 65 6e 20 69 74 2e 20 49 6e 20 74 68  o open it. In th
24270 69 73 20 63 61 73 65 20 74 61 6b 65 20 61 6e 20  is case take an 
24280 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
24290 6e 20 74 68 65 0a 20 20 2a 2a 20 44 4d 53 20 62  n the.  ** DMS b
242a0 79 74 65 20 61 6e 64 20 74 72 75 6e 63 61 74 65  yte and truncate
242b0 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 20   the *-shm file 
242c0 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
242d0 20 73 69 7a 65 2e 20 54 68 65 6e 0a 20 20 2a 2a   size. Then.  **
242e0 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20   downgrade to a 
242f0 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
24300 68 65 20 44 4d 53 20 62 79 74 65 2e 0a 20 20 2a  he DMS byte..  *
24310 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 6f 74 68 65  *.  ** If anothe
24320 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
24330 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
24340 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 44 4d  E lock on the DM
24350 53 20 62 79 74 65 2c 0a 20 20 2a 2a 20 72 65 74  S byte,.  ** ret
24360 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
24370 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 28 69  to the caller (i
24380 74 20 77 69 6c 6c 20 74 72 79 20 61 67 61 69 6e  t will try again
24390 29 2e 20 41 6e 20 65 61 72 6c 69 65 72 0a 20 20  ). An earlier.  
243a0 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ** version of th
243b0 69 73 20 63 6f 64 65 20 61 74 74 65 6d 70 74 65  is code attempte
243c0 64 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  d the SHARED loc
243d0 6b 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  k at this point.
243e0 20 42 75 74 0a 20 20 2a 2a 20 74 68 69 73 20 69   But.  ** this i
243f0 6e 74 72 6f 64 75 63 65 64 20 61 20 73 75 62 74  ntroduced a subt
24400 6c 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  le race conditio
24410 6e 3a 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  n: if the proces
24420 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a 20 45  s holding.  ** E
24430 58 43 4c 55 53 49 56 45 20 66 61 69 6c 65 64 20  XCLUSIVE failed 
24440 6a 75 73 74 20 62 65 66 6f 72 65 20 74 72 75 6e  just before trun
24450 63 61 74 69 6e 67 20 74 68 65 20 2a 2d 73 68 6d  cating the *-shm
24460 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 69 73   file, then this
24470 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6d 69  .  ** process mi
24480 67 68 74 20 6f 70 65 6e 20 61 6e 64 20 75 73 65  ght open and use
24490 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 20   the *-shm file 
244a0 77 69 74 68 6f 75 74 20 74 72 75 6e 63 61 74 69  without truncati
244b0 6e 67 20 69 74 2e 0a 20 20 2a 2a 20 41 6e 64 20  ng it..  ** And 
244c0 69 66 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  if the *-shm fil
244d0 65 20 68 61 73 20 62 65 65 6e 20 63 6f 72 72 75  e has been corru
244e0 70 74 65 64 20 62 79 20 61 20 70 6f 77 65 72 20  pted by a power 
244f0 66 61 69 6c 75 72 65 20 6f 72 0a 20 20 2a 2a 20  failure or.  ** 
24500 73 79 73 74 65 6d 20 63 72 61 73 68 2c 20 74 68  system crash, th
24510 65 20 64 61 74 61 62 61 73 65 20 69 74 73 65 6c  e database itsel
24520 66 20 6d 61 79 20 61 6c 73 6f 20 62 65 63 6f 6d  f may also becom
24530 65 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20  e corrupt.  */. 
24540 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
24550 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
24560 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 55 4e 49 58  k.l_start = UNIX
24570 5f 53 48 4d 5f 44 4d 53 3b 0a 20 20 6c 6f 63 6b  _SHM_DMS;.  lock
24580 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
24590 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
245a0 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
245b0 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  tl(pShmNode->h, 
245c0 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21  F_GETLK, &lock)!
245d0 3d 30 20 29 20 7b 0a 20 20 20 20 72 63 20 3d 20  =0 ) {.    rc = 
245e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
245f0 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  K;.  }else if( l
24600 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e  ock.l_type==F_UN
24610 4c 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  LCK ){.    if( p
24620 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
24630 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 70 53 68  nly ){.      pSh
24640 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65  mNode->isUnlocke
24650 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  d = 1;.      rc 
24660 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
24670 59 5f 43 41 4e 54 49 4e 49 54 3b 0a 20 20 20 20  Y_CANTINIT;.    
24680 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
24690 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
246a0 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c  ock(pDbFd, F_WRL
246b0 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  CK, UNIX_SHM_DMS
246c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
246d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
246e0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
246f0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30  e(pShmNode->h, 0
24700 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
24710 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
24720 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
24730 50 45 4e 2c 22 66 74 72 75 6e 63 61 74 65 22 2c  PEN,"ftruncate",
24740 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
24750 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
24760 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
24770 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57  lock.l_type==F_W
24780 52 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  RLCK ){.    rc =
24790 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
247a0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
247b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
247c0 73 65 72 74 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70  sert( lock.l_typ
247d0 65 3d 3d 46 5f 55 4e 4c 43 4b 20 7c 7c 20 6c 6f  e==F_UNLCK || lo
247e0 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  ck.l_type==F_RDL
247f0 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 75  CK );.    rc = u
24800 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
24810 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c  (pDbFd, F_RDLCK,
24820 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
24830 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24840 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
24850 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  n a shared-memor
24860 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65  y area associate
24870 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61  d with open data
24880 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e  base file pDbFd.
24890 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69    .** This parti
248a0 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61  cular implementa
248b0 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65  tion uses mmappe
248c0 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  d files..**.** T
248d0 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20  he file used to 
248e0 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64  implement shared
248f0 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68  -memory is in th
24900 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
24910 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20  .** as the open 
24920 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
24930 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  d has the same n
24940 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20  ame as the open 
24950 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
24960 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22   with the "-shm"
24970 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20 20   suffix added.  
24980 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
24990 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
249a0 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75  e.** is "/home/u
249b0 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20  ser1/config.db" 
249c0 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68  then the file th
249d0 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  at is created an
249e0 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72  d mmapped.** for
249f0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
24a00 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f  ill be called "/
24a10 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
24a20 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a  g.db-shm".  .**.
24a30 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f  ** Another appro
24a40 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65  ach to is to use
24a50 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73   files in /dev/s
24a60 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f  hm or /dev/tmp o
24a70 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68  r an.** some oth
24a80 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20  er tmpfs mount. 
24a90 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e  But if a file in
24aa0 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69 72   a different dir
24ab0 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74  ectory.** from t
24ac0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24ad0 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64   is used, then d
24ae0 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73 20  iffering access 
24af0 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f  permissions.** o
24b00 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67  r a chroot() mig
24b10 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69 66  ht cause two dif
24b20 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73  ferent processes
24b30 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
24b40 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20  database to end 
24b50 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72 65  up using differe
24b60 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61  nt files for sha
24b70 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a  red memory - .**
24b80 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68   meaning that th
24b90 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64  eir memory would
24ba0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73   not really be s
24bb0 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e  hared - resultin
24bc0 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65  g.** in database
24bd0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65   corruption.  Ne
24be0 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73  vertheless, this
24bf0 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67   tmpfs file usag
24c00 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62  e.** can be enab
24c10 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
24c20 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ime using -DSQLI
24c30 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
24c40 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f  ="/dev/shm".** o
24c50 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  r the equivalent
24c60 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74 68  .  The use of th
24c70 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
24c80 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
24c90 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65  ime.** option re
24ca0 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f  sults in an inco
24cb0 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f  mpatible build o
24cc0 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64  f SQLite;  build
24cd0 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74  s of SQLite.** t
24ce0 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72 69  hat with differi
24cf0 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ng SQLITE_SHM_DI
24d00 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73  RECTORY settings
24d10 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
24d20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61  the.** same data
24d30 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
24d40 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61   same time, data
24d50 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
24d60 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
24d70 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54  esult. The SQLIT
24d80 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
24d90 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
24da0 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ion is considere
24db0 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65  d.** "unsupporte
24dc0 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77  d" and may go aw
24dd0 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20 53  ay in a future S
24de0 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a  QLite release..*
24df0 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
24e00 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d  g a new shared-m
24e10 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e  emory file, if n
24e20 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65  o other instance
24e30 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c  s of that.** fil
24e40 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
24e50 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72  open, in this pr
24e60 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65  ocess or in othe
24e70 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65  r processes, the
24e80 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75  n.** the file mu
24e90 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  st be truncated 
24ea0 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f  to zero length o
24eb0 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65  r have its heade
24ec0 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  r cleared..**.**
24ed0 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
24ee0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
24ef0 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67 20  pDbFd) is using 
24f00 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20  the "unix-excl" 
24f10 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e  VFS.** that mean
24f20 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73  s that an exclus
24f30 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ive lock is held
24f40 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
24f50 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61   file and.** tha
24f60 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
24f70 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f  sses are able to
24f80 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
24f90 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  he database.  In
24fa0 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77  .** that case, w
24fb0 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e do not really 
24fc0 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f  need shared memo
24fd0 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d  ry.  No shared m
24fe0 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73  emory.** file is
24ff0 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 73   created.  The s
25000 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
25010 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77  l be simulated w
25020 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e  ith heap memory.
25030 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
25040 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
25050 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
25060 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75  bFd){.  struct u
25070 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20  nixShm *p = 0;  
25080 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
25090 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
250a0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
250b0 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ct unixShmNode *
250c0 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54  pShmNode;   /* T
250d0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
250e0 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
250f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25100 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
25110 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
25120 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
25130 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20  o *pInode;      
25140 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65      /* The inode
25150 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72   of fd */.  char
25160 20 2a 7a 53 68 6d 3b 20 20 20 20 20 20 20 20 20   *zShm;         
25170 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
25180 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  he file used for
25190 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53   SHM */.  int nS
251a0 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  hmFilename;     
251b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
251c0 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c  e of the SHM fil
251d0 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a  ename in bytes *
251e0 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
251f0 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
25200 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  ew unixShm objec
25210 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  t. */.  p = sqli
25220 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
25230 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
25240 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
25250 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
25260 54 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  T;.  memset(p, 0
25270 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
25280 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
25290 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  pShm==0 );..  /*
252a0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
252b0 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f   a unixShmNode o
252c0 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78  bject already ex
252d0 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65  ists. Reuse an e
252e0 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65  xisting.  ** one
252f0 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65   if present. Cre
25300 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
25310 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
25320 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 46  .  assert( unixF
25330 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28  ileMutexNotheld(
25340 70 44 62 46 64 29 20 29 3b 0a 20 20 75 6e 69 78  pDbFd) );.  unix
25350 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
25360 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e  pInode = pDbFd->
25370 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f  pInode;.  pShmNo
25380 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68  de = pInode->pSh
25390 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68  mNode;.  if( pSh
253a0 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mNode==0 ){.    
253b0 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
253c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
253d0 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e     /* fstat() in
253e0 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  fo for database 
253f0 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  file */.#ifndef 
25400 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
25410 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74 20 63  TORY.    const c
25420 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68 20 3d  har *zBasePath =
25430 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a 23   pDbFd->zPath;.#
25440 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 61  endif..    /* Ca
25450 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66 69  ll fstat() to fi
25460 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65 72  gure out the per
25470 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
25480 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
25490 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a  f.    ** a new *
254a0 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65  -shm file is cre
254b0 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74  ated, an attempt
254c0 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
254d0 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a   create it.    *
254e0 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
254f0 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20  permissions..   
25500 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73   */.    if( osFs
25510 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73  tat(pDbFd->h, &s
25520 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 72  Stat) ){.      r
25530 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
25540 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f  _FSTAT;.      go
25550 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
25560 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
25570 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
25580 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65  ORY.    nShmFile
25590 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51  name = sizeof(SQ
255a0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
255b0 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a  RY) + 31;.#else.
255c0 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
255d0 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72 6c   = 6 + (int)strl
255e0 65 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a 23  en(zBasePath);.#
255f0 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f  endif.    pShmNo
25600 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
25610 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
25620 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46  ShmNode) + nShmF
25630 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69  ilename );.    i
25640 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
25650 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
25660 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
25670 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
25680 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
25690 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f     memset(pShmNo
256a0 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
256b0 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c  ShmNode)+nShmFil
256c0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d  ename);.    zShm
256d0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
256e0 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
256f0 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69  &pShmNode[1];.#i
25700 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
25710 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71  DIRECTORY.    sq
25720 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
25730 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
25740 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
25750 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
25760 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f  SHM_DIRECTORY "/
25770 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78  sqlite-shm-%x-%x
25780 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
25790 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53 74          (u32)sSt
257a0 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29  at.st_ino, (u32)
257b0 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23  sStat.st_dev);.#
257c0 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  else.    sqlite3
257d0 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69  _snprintf(nShmFi
257e0 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 2c 20 22 25  lename, zShm, "%
257f0 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50 61 74  s-shm", zBasePat
25800 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  h);.    sqlite3F
25810 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
25820 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 29 3b 0a  ->zPath, zShm);.
25830 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e  #endif.    pShmN
25840 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20  ode->h = -1;.   
25850 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
25860 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
25870 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
25880 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62 46  e->pInode = pDbF
25890 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69  d->pInode;.    i
258a0 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
258b0 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
258c0 78 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e  x ){.      pShmN
258d0 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
258e0 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
258f0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
25900 53 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ST);.      if( p
25910 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d  ShmNode->mutex==
25920 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
25930 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
25940 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
25950 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
25960 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
25970 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62     if( pInode->b
25980 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
25990 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  {.      if( 0==s
259a0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
259b0 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  an(pDbFd->zPath,
259c0 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c   "readonly_shm",
259d0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
259e0 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62  ShmNode->h = rob
259f0 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f  ust_open(zShm, O
25a00 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 28  _RDWR|O_CREAT, (
25a10 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37  sStat.st_mode&07
25a20 37 37 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  77));.      }.  
25a30 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
25a40 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ->h<0 ){.       
25a50 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72   pShmNode->h = r
25a60 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c  obust_open(zShm,
25a70 20 4f 5f 52 44 4f 4e 4c 59 2c 20 28 73 53 74 61   O_RDONLY, (sSta
25a80 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29  t.st_mode&0777))
25a90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
25aa0 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20  hmNode->h<0 ){. 
25ab0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
25ac0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
25ad0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
25ae0 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 29 3b 0a   "open", zShm);.
25af0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
25b00 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
25b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
25b20 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
25b30 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nly = 1;.      }
25b40 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
25b50 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75  is process is ru
25b60 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d  nning as root, m
25b70 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
25b80 65 20 53 48 4d 20 66 69 6c 65 0a 20 20 20 20 20  e SHM file.     
25b90 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62 79 20   ** is owned by 
25ba0 74 68 65 20 73 61 6d 65 20 75 73 65 72 20 74 68  the same user th
25bb0 61 74 20 6f 77 6e 73 20 74 68 65 20 6f 72 69 67  at owns the orig
25bc0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20  inal database.  
25bd0 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20  Otherwise,.     
25be0 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
25bf0 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20   owner will not 
25c00 62 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  be able to conne
25c10 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ct..      */.   
25c20 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28     robustFchown(
25c30 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74  pShmNode->h, sSt
25c40 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74  at.st_uid, sStat
25c50 2e 73 74 5f 67 69 64 29 3b 0a 0a 20 20 20 20 20  .st_gid);..     
25c60 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 53 68   rc = unixLockSh
25c70 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
25c80 2c 20 70 53 68 6d 4e 6f 64 65 29 3b 0a 20 20 20  , pShmNode);.   
25c90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25ca0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
25cb0 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
25cc0 49 4e 49 54 20 29 20 67 6f 74 6f 20 73 68 6d 5f  INIT ) goto shm_
25cd0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
25ce0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
25cf0 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
25d00 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
25d10 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
25d20 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20    p->pShmNode = 
25d30 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66  pShmNode;.#ifdef
25d40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
25d50 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65  p->id = pShmNode
25d60 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23  ->nextShmId++;.#
25d70 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65  endif.  pShmNode
25d80 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46  ->nRef++;.  pDbF
25d90 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75  d->pShm = p;.  u
25da0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
25db0 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
25dc0 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
25dd0 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
25de0 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
25df0 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
25e00 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
25e10 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
25e20 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
25e30 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
25e40 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
25e50 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74   unixShm) object
25e60 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
25e70 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
25e80 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
25e90 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
25ea0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
25eb0 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
25ec0 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
25ed0 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
25ee0 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
25ef0 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
25f00 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
25f10 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
25f20 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
25f30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
25f40 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
25f50 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
25f60 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
25f70 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
25f80 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
25f90 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
25fa0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
25fb0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
25fc0 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  rn rc;..  /* Jum
25fd0 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72  p here on any er
25fe0 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f  ror */.shm_open_
25ff0 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75  err:.  unixShmPu
26000 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20  rge(pDbFd);     
26010 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
26020 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
26030 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
26040 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
26050 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
26060 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
26070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
26080 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
26090 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
260a0 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
260b0 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
260c0 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
260d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
260e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
260f0 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
26100 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
26110 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
26120 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
26130 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
26140 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
26150 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
26160 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
26170 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
26180 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
26190 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
261a0 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
261b0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
261c0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62  erwise, if the b
261d0 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72  Extend parameter
261e0 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
261f0 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
26200 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
26210 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
26220 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
26230 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
26240 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
26250 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
26260 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
26270 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
26280 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
26290 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62  turned. If .** b
262a0 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65  Extend is non-ze
262b0 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
262c0 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
262d0 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
262e0 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
262f0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
26300 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
26310 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
26320 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
26330 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
26340 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
26350 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
26360 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
26370 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
26380 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
26390 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
263a0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
263b0 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
263c0 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
263d0 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
263e0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
263f0 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
26400 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
26410 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
26420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26430 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71  unixShmMap(.  sq
26440 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
26450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26460 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
26470 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
26480 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264a0 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
264b0 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
264c0 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
264e0 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
264f0 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e   */.  int bExten
26500 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
26510 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
26520 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
26530 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
26540 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
26550 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
26560 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
26570 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  mory */.){.  uni
26580 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
26590 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
265a0 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e  unixShm *p;.  un
265b0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
265c0 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
265d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
265e0 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e   nShmPerMap = un
265f0 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61  ixShmRegionPerMa
26600 70 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52  p();.  int nReqR
26610 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  egion;..  /* If 
26620 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
26630 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  y file has not y
26640 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
26650 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a  open it now. */.
26660 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68    if( pDbFd->pSh
26670 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  m==0 ){.    rc =
26680 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
26690 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20  emory(pDbFd);.  
266a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
266b0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
266c0 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46  .  }..  p = pDbF
266d0 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e  d->pShm;.  pShmN
266e0 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
266f0 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  e;.  sqlite3_mut
26700 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
26710 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
26720 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c   pShmNode->isUnl
26730 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 72 63 20  ocked ){.    rc 
26740 3d 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64  = unixLockShared
26750 4d 65 6d 6f 72 79 28 70 44 62 46 64 2c 20 70 53  Memory(pDbFd, pS
26760 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  hmNode);.    if(
26770 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26780 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
26790 74 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  t;.    pShmNode-
267a0 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d 20 30 3b  >isUnlocked = 0;
267b0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
267c0 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
267d0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
267e0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
267f0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
26800 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
26810 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
26820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
26830 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
26840 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
26850 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
26860 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
26870 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
26880 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
26890 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
268a0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d    /* Minimum num
268b0 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72  ber of regions r
268c0 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61  equired to be ma
268d0 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52  pped. */.  nReqR
268e0 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f  egion = ((iRegio
268f0 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20  n+nShmPerMap) / 
26900 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53  nShmPerMap) * nS
26910 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28  hmPerMap;..  if(
26920 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
26930 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b  on<nReqRegion ){
26940 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65  .    char **apNe
26950 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
26960 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
26970 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  pRegion[] array 
26980 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
26990 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a   = nReqRegion*sz
269a0 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e  Region;   /* Min
269b0 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
269c0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
269d0 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
269e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
269f0 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74    /* Used by fst
26a00 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68  at() */..    pSh
26a10 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
26a20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
26a30 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
26a40 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >=0 ){.      /* 
26a50 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
26a60 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
26a70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
26a80 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
26a90 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43  pace..      ** C
26aa0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
26ab0 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
26ac0 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
26ad0 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
26ae0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72   is.      ** lar
26af0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
26b00 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
26b10 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
26b20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
26b30 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d  sFstat(pShmNode-
26b40 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
26b50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26b60 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
26b70 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
26b80 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
26b90 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
26ba0 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e   sStat.st_size<n
26bb0 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
26bc0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
26bd0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
26be0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
26bf0 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74  f bExtend is set
26c00 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   to.        ** f
26c10 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
26c20 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
26c30 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
26c40 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
26c50 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
26c60 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
26c70 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  d ){.          g
26c80 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
26c90 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
26ca0 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
26cb0 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
26cc0 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64   is true, extend
26cd0 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68   the file. Do th
26ce0 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  is by.        **
26cf0 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
26d00 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e  e byte to the en
26d10 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70  d of each (OS) p
26d20 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20  age being.      
26d30 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f    ** allocated o
26d40 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68  r extended. Tech
26d50 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64  nically, we need
26d60 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74   only write to t
26d70 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61  he.        ** la
26d80 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  st page in order
26d90 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66   to extend the f
26da0 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67  ile. But writing
26db0 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20   to all new.    
26dc0 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72      ** pages for
26dd0 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c  ces the OS to al
26de0 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65  locate them imme
26df0 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72  diately, which r
26e00 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a  educes.        *
26e10 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66  * the chances of
26e20 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63   SIGBUS while ac
26e30 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70  cessing the mapp
26e40 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20  ed region later 
26e50 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
26e60 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20         else{.   
26e70 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
26e80 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34  nst int pgsz = 4
26e90 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69  096;.          i
26ea0 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20  nt iPg;..       
26eb0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
26ec0 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  he last byte of 
26ed0 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63  each newly alloc
26ee0 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
26ef0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
26f00 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74     assert( (nByt
26f10 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a  e % pgsz)==0 );.
26f20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50            for(iP
26f30 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  g=(sStat.st_size
26f40 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79  /pgsz); iPg<(nBy
26f50 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29  te/pgsz); iPg++)
26f60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
26f70 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t x = 0;.       
26f80 20 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64       if( seekAnd
26f90 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65  WriteFd(pShmNode
26fa0 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20  ->h, iPg*pgsz + 
26fb0 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 26  pgsz-1, "", 1, &
26fc0 78 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  x)!=1 ){.       
26fd0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
26fe0 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e  r *zFile = pShmN
26ff0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ode->zFilename;.
27000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
27010 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
27020 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
27030 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a  SIZE, "write", z
27040 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
27050 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
27060 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  e_out;.         
27070 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
27080 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27090 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
270a0 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
270b0 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
270c0 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
270d0 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
270e0 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
270f0 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69   = (char **)sqli
27100 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
27110 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
27120 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67  pRegion, nReqReg
27130 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20  ion*sizeof(char 
27140 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  *).    );.    if
27150 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
27160 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
27170 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
27180 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
27190 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
271a0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
271b0 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20  gion = apNew;.  
271c0 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
271d0 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52  e->nRegion<nReqR
271e0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69  egion ){.      i
271f0 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69  nt nMap = szRegi
27200 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20  on*nShmPerMap;. 
27210 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
27220 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20    void *pMem;.  
27230 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
27240 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
27250 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28    pMem = osMmap(
27260 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20  0, nMap,.       
27270 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
27280 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54  sReadonly ? PROT
27290 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41  _READ : PROT_REA
272a0 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20  D|PROT_WRITE, . 
272b0 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53             MAP_S
272c0 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d  HARED, pShmNode-
272d0 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36  >h, szRegion*(i6
272e0 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  4)pShmNode->nReg
272f0 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ion.        );. 
27300 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
27310 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
27320 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
27330 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
27340 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20  E_IOERR_SHMMAP, 
27350 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65  "mmap", pShmNode
27360 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
27370 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
27380 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
27390 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
273a0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
273b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
273c0 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  (szRegion);.    
273d0 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20      if( pMem==0 
273e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
273f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
27400 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
27410 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
27420 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27430 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20     memset(pMem, 
27440 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  0, szRegion);.  
27450 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72      }..      for
27460 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d  (i=0; i<nShmPerM
27470 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ap; i++){.      
27480 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
27490 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
274a0 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63  Region+i] = &((c
274b0 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67  har*)pMem)[szReg
274c0 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  ion*i];.      }.
274d0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
274e0 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50  nRegion += nShmP
274f0 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  erMap;.    }.  }
27500 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
27510 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
27520 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
27530 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d  {.    *pp = pShm
27540 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  Node->apRegion[i
27550 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65  Region];.  }else
27560 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
27570 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
27580 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26  e->isReadonly &&
27590 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
275a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
275b0 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33  DONLY;.  sqlite3
275c0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
275d0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
275e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
275f0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
27600 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
27610 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
27620 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  egment..**.** No
27630 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61  te that the rela
27640 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
27650 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c   SHAREd and EXCL
27660 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61  USIVE locks is a
27670 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65   little.** diffe
27680 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69  rent here than i
27690 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68  n posix.  In xSh
276a0 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e  mLock(), one can
276b0 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   go from unlocke
276c0 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61  d.** to shared a
276d0 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20  nd back or from 
276e0 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c  unlocked to excl
276f0 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20  usive and back. 
27700 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20   But one may.** 
27710 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72  not go from shar
27720 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
27730 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76  or from exclusiv
27740 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a  e to shared..*/.
27750 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
27760 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
27770 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
27780 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
27790 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
277a0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
277b0 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
277c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277d0 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
277e0 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
277f0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
27800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27810 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
27820 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
27830 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
27840 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
27850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27860 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
27870 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
27880 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
27890 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
278a0 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;      /* Connec
278b0 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
278c0 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
278d0 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62  unixShm *p = pDb
278e0 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20  Fd->pShm;       
278f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
27900 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
27910 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69   locked */.  uni
27920 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20  xShm *pX;       
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27940 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
27950 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
27960 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ngs */.  unixShm
27970 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
27980 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f   p->pShmNode;  /
27990 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
279a0 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20   file iNode */. 
279b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
279c0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
279d0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
279e0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
279f0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
27a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a10 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
27a20 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
27a30 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
27a40 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
27a50 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
27a60 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
27a70 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
27a80 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
27a90 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  e );.  assert( o
27aa0 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
27ab0 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
27ac0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
27ad0 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
27ae0 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
27af0 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
27b00 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
27b10 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
27b20 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
27b30 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
27b40 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
27b50 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
27b60 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
27b70 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
27b80 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
27b90 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
27ba0 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
27bb0 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
27bc0 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
27bd0 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
27be0 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
27bf0 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
27c00 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
27c10 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
27c20 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
27c30 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
27c40 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
27c50 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
27c60 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
27c70 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c  );..  mask = (1<
27c80 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
27c90 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74  <ofst);.  assert
27ca0 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
27cb0 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
27cc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
27cd0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
27ce0 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
27cf0 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
27d00 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
27d10 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
27d20 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
27d30 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
27d40 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
27d50 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
27d60 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
27d70 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
27d80 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
27d90 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
27da0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
27db0 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
27dc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
27dd0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
27de0 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
27df0 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
27e00 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
27e10 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
27e20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
27e30 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
27e40 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
27e50 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
27e60 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
27e70 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
27e80 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
27e90 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73  Fd, F_UNLCK, ofs
27ea0 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
27eb0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
27ec0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27ed0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
27ee0 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
27ef0 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
27f00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27f10 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
27f20 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
27f30 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
27f40 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
27f50 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
27f60 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
27f70 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
27f80 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
27f90 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
27fa0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
27fb0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
27fc0 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
27fd0 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
27fe0 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
27ff0 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
28000 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
28010 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
28020 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
28030 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
28040 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
28050 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
28060 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
28070 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
28080 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
28090 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
280a0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
280b0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
280c0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
280d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
280e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
280f0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
28100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
28110 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
28120 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
28130 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
28140 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
28150 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
28160 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
28170 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
28190 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
281a0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
281b0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
281c0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
281d0 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  , F_RDLCK, ofst+
281e0 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
281f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
28200 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
28210 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
28220 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
28230 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
28240 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
28250 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28260 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
28270 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
28280 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
28290 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
282a0 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
282b0 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
282c0 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
282d0 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
282e0 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
282f0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
28300 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
28310 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
28320 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
28330 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
28340 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
28350 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
28360 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
28370 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
28380 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
28390 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
283a0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
283b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
283c0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
283d0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
283e0 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
283f0 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
28400 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
28410 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
28420 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
28430 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
28440 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
28450 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28460 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
28470 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
28480 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b  k(pDbFd, F_WRLCK
28490 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
284a0 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
284b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
284c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
284d0 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
284e0 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
284f0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
28500 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
28510 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
28520 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
28530 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
28540 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
28550 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
28560 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
28570 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ot %03x,%03x\n",
28580 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
28590 64 2c 20 6f 73 47 65 74 70 69 64 28 30 29 2c 20  d, osGetpid(0), 
285a0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
285b0 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
285c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
285d0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
285e0 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
285f0 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
28600 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
28610 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
28620 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
28630 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
28640 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
28650 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
28660 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
28670 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
28680 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
28690 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
286a0 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
286b0 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
286c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
286d0 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
286e0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
286f0 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
28700 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
28710 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d  d);.  sqlite3Mem
28720 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 20 20  oryBarrier();   
28730 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65        /* compile
28740 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79  r-defined memory
28750 20 62 61 72 72 69 65 72 20 2a 2f 0a 20 20 61 73   barrier */.  as
28760 73 65 72 74 28 20 75 6e 69 78 46 69 6c 65 4d 75  sert( unixFileMu
28770 74 65 78 4e 6f 74 68 65 6c 64 28 28 75 6e 69 78  texNotheld((unix
28780 46 69 6c 65 2a 29 66 64 29 20 29 3b 0a 20 20 75  File*)fd) );.  u
28790 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
287a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
287b0 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f  * Also mutex, fo
287c0 72 20 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a  r redundancy */.
287d0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
287e0 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ();.}../*.** Clo
287f0 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
28800 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
28810 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e  .  Delete the un
28820 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f  derlying .** sto
28830 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c  rage if deleteFl
28840 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ag is true..**.*
28850 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
28860 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   shared memory a
28870 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
28880 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68  he connection th
28890 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
288a0 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
288b0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
288c0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d  c int unixShmUnm
288d0 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
288e0 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
288f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
28900 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
28910 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64   file */.  int d
28920 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20  eleteFlag       
28930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
28940 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f  lete shared-memo
28950 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ry if true */.){
28960 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20  .  unixShm *p;  
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28980 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
28990 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
289a0 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  d */.  unixShmNo
289b0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
289c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
289d0 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
289e0 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
289f0 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20   unixShm **pp;  
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
28a20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e  over sibling con
28a30 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e  nections */.  un
28a40 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20  ixFile *pDbFd;  
28a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28a60 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
28a70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
28a80 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69  ..  pDbFd = (uni
28a90 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  xFile*)fd;.  p =
28aa0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
28ab0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
28ac0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
28ad0 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
28ae0 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74  mNode;..  assert
28af0 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
28b00 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
28b10 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
28b20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
28b30 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
28b40 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65   );..  /* Remove
28b50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
28b60 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
28b70 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
28b80 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
28b90 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
28ba0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
28bb0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
28bc0 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
28bd0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
28be0 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
28bf0 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
28c00 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
28c10 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
28c20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
28c30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
28c40 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
28c50 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
28c60 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
28c70 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
28c80 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
28c90 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
28ca0 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
28cb0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
28cc0 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
28cd0 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
28ce0 20 61 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c   assert( unixFil
28cf0 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 44  eMutexNotheld(pD
28d00 62 46 64 29 20 29 3b 0a 20 20 75 6e 69 78 45 6e  bFd) );.  unixEn
28d10 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
28d20 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
28d30 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d  nRef>0 );.  pShm
28d40 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Node->nRef--;.  
28d50 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
28d60 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef==0 ){.    if(
28d70 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70   deleteFlag && p
28d80 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
28d90 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  .      osUnlink(
28da0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
28db0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
28dc0 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62  unixShmPurge(pDb
28dd0 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  Fd);.  }.  unixL
28de0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
28df0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28e00 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65  ;.}...#else.# de
28e10 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20  fine unixShmMap 
28e20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
28e30 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a  nixShmLock    0.
28e40 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
28e50 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
28e60 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20  ne unixShmUnmap 
28e70 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    0.#endif /* #i
28e80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28e90 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 53 51  T_WAL */..#if SQ
28ea0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
28eb0 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74  ZE>0./*.** If it
28ec0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6d 65   is currently me
28ed0 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d  mory mapped, unm
28ee0 61 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a  ap file pFd..*/.
28ef0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
28f00 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69  Unmapfile(unixFi
28f10 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65  le *pFd){.  asse
28f20 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  rt( pFd->nFetchO
28f30 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ut==0 );.  if( p
28f40 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29  Fd->pMapRegion )
28f50 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70  {.    osMunmap(p
28f60 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20  Fd->pMapRegion, 
28f70 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
28f80 75 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70  ual);.    pFd->p
28f90 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20  MapRegion = 0;. 
28fa0 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
28fb0 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d   = 0;.    pFd->m
28fc0 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
28fd0 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
28fe0 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
28ff0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  he size of the m
29000 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61  emory mapping ma
29010 69 6e 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65  intained by file
29020 20 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20   .** descriptor 
29030 70 46 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65  pFd to nNew byte
29040 73 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20  s. Any existing 
29050 6d 61 70 70 69 6e 67 20 69 73 20 64 69 73 63 61  mapping is disca
29060 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  rded..**.** If s
29070 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
29080 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68  function sets th
29090 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
290a0 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ables:.**.**    
290b0 20 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70     unixFile.pMap
290c0 52 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  Region.**       
290d0 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a  unixFile.mmapSiz
290e0 65 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46  e.**       unixF
290f0 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75  ile.mmapSizeActu
29100 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75  al.**.** If unsu
29110 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 65 72 72  ccessful, an err
29120 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 6f  or message is lo
29130 67 67 65 64 20 76 69 61 20 73 71 6c 69 74 65 33  gged via sqlite3
29140 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68  _log() and.** th
29150 65 20 74 68 72 65 65 20 76 61 72 69 61 62 6c 65  e three variable
29160 73 20 61 62 6f 76 65 20 61 72 65 20 7a 65 72 6f  s above are zero
29170 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
29180 20 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a   SQLite should.*
29190 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63 63 65 73  * continue acces
291a0 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  sing the databas
291b0 65 20 75 73 69 6e 67 20 74 68 65 20 78 52 65 61  e using the xRea
291c0 64 28 29 20 61 6e 64 20 78 57 72 69 74 65 28 29  d() and xWrite()
291d0 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  .** methods..*/.
291e0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
291f0 52 65 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e 69  Remapfile(.  uni
29200 78 46 69 6c 65 20 2a 70 46 64 2c 20 20 20 20 20  xFile *pFd,     
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29220 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
29230 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20  object */.  i64 
29240 6e 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 20  nNew            
29250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
29260 65 71 75 69 72 65 64 20 6d 61 70 70 69 6e 67 20  equired mapping 
29270 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  size */.){.  con
29280 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  st char *zErr = 
29290 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68 20  "mmap";.  int h 
292a0 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20 20 20 20  = pFd->h;       
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
292c0 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
292d0 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c  r open on db fil
292e0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67  e */.  u8 *pOrig
292f0 20 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d   = (u8 *)pFd->pM
29300 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50  apRegion;   /* P
29310 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
29320 74 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a  t file mapping *
29330 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67 20 3d 20  /.  i64 nOrig = 
29340 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
29350 75 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  ual;     /* Size
29360 20 6f 66 20 70 4f 72 69 67 20 72 65 67 69 6f 6e   of pOrig region
29370 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
29380 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20  8 *pNew = 0;    
29390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293a0 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20      /* Location 
293b0 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a  of new mapping *
293c0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  /.  int flags = 
293d0 50 52 4f 54 5f 52 45 41 44 3b 20 20 20 20 20 20  PROT_READ;      
293e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
293f0 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61  s to pass to mma
29400 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  p() */..  assert
29410 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
29420 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
29430 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53   nNew>pFd->mmapS
29440 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
29450 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70   nNew<=pFd->mmap
29460 53 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73 73  SizeMax );.  ass
29470 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20  ert( nNew>0 );. 
29480 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d   assert( pFd->mm
29490 61 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46  apSizeActual>=pF
294a0 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20  d->mmapSize );. 
294b0 20 61 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49   assert( MAP_FAI
294c0 4c 45 44 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65  LED!=0 );..#ifde
294d0 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45  f SQLITE_MMAP_RE
294e0 41 44 57 52 49 54 45 0a 20 20 69 66 28 20 28 70  ADWRITE.  if( (p
294f0 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  Fd->ctrlFlags & 
29500 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29  UNIXFILE_RDONLY)
29510 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d 20 50  ==0 ) flags |= P
29520 52 4f 54 5f 57 52 49 54 45 3b 0a 23 65 6e 64 69  ROT_WRITE;.#endi
29530 66 0a 0a 20 20 69 66 28 20 70 4f 72 69 67 20 29  f..  if( pOrig )
29540 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41  {.#if HAVE_MREMA
29550 50 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73 65  P.    i64 nReuse
29560 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
29570 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73  ;.#else.    cons
29580 74 20 69 6e 74 20 73 7a 53 79 73 70 61 67 65 20  t int szSyspage 
29590 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28  = osGetpagesize(
295a0 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73  );.    i64 nReus
295b0 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69  e = (pFd->mmapSi
295c0 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61 67 65  ze & ~(szSyspage
295d0 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
295e0 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70 4f 72   u8 *pReq = &pOr
295f0 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20 20  ig[nReuse];..   
29600 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70 61   /* Unmap any pa
29610 67 65 73 20 6f 66 20 74 68 65 20 65 78 69 73 74  ges of the exist
29620 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68 61 74  ing mapping that
29630 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75 73 65   cannot be reuse
29640 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52  d. */.    if( nR
29650 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a 20  euse!=nOrig ){. 
29660 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 52       osMunmap(pR
29670 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73 65  eq, nOrig-nReuse
29680 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48 41  );.    }..#if HA
29690 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70 4e  VE_MREMAP.    pN
296a0 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70 4f  ew = osMremap(pO
296b0 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e 65  rig, nReuse, nNe
296c0 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56  w, MREMAP_MAYMOV
296d0 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 22  E);.    zErr = "
296e0 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a 20  mremap";.#else. 
296f0 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70     pNew = osMmap
29700 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65 75  (pReq, nNew-nReu
29710 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53  se, flags, MAP_S
29720 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75 73 65  HARED, h, nReuse
29730 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21  );.    if( pNew!
29740 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
29750 20 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 70       if( pNew!=p
29760 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  Req ){.        o
29770 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e 4e  sMunmap(pNew, nN
29780 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20 20  ew - nReuse);.  
29790 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a        pNew = 0;.
297a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
297b0 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 72 69       pNew = pOri
297c0 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  g;.      }.    }
297d0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
297e0 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 65  The attempt to e
297f0 78 74 65 6e 64 20 74 68 65 20 65 78 69 73 74 69  xtend the existi
29800 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65  ng mapping faile
29810 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f 0a 20  d. Free it. */. 
29820 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50     if( pNew==MAP
29830 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65 77 3d  _FAILED || pNew=
29840 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75  =0 ){.      osMu
29850 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75  nmap(pOrig, nReu
29860 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
29870 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69 73 20    /* If pNew is 
29880 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79 20  still NULL, try 
29890 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65 6e 74  to create an ent
298a0 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70 69 6e  irely new mappin
298b0 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77  g. */.  if( pNew
298c0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  ==0 ){.    pNew 
298d0 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e 65 77  = osMmap(0, nNew
298e0 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41  , flags, MAP_SHA
298f0 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20 7d 0a  RED, h, 0);.  }.
29900 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50  .  if( pNew==MAP
29910 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 70  _FAILED ){.    p
29920 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e 4e 65  New = 0;.    nNe
29930 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69 78 4c  w = 0;.    unixL
29940 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f  ogError(SQLITE_O
29950 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e 7a 50  K, zErr, pFd->zP
29960 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ath);..    /* If
29970 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62 6f 76   the mmap() abov
29980 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 65  e failed, assume
29990 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73 65 71   that all subseq
299a0 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61 6c 6c  uent mmap() call
299b0 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 70 72  s.    ** will pr
299c0 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f 6f 2e  obably fail too.
299d0 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73   Fall back to us
299e0 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65  ing xRead/xWrite
299f0 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20 20 20   exclusively.   
29a00 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65   ** in this case
29a10 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e 6d  .  */.    pFd->m
29a20 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a  mapSizeMax = 0;.
29a30 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61 70 52    }.  pFd->pMapR
29a40 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20 2a 29  egion = (void *)
29a50 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61  pNew;.  pFd->mma
29a60 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d 61  pSize = pFd->mma
29a70 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4e  pSizeActual = nN
29a80 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d  ew;.}../*.** Mem
29a90 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70  ory map or remap
29aa0 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
29ab0 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70   by file-descrip
29ac0 74 6f 72 20 70 46 64 20 28 69 66 20 74 68 65 20  tor pFd (if the 
29ad0 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61  file.** is alrea
29ae0 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65  dy mapped, the e
29af0 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
29b00 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74  is replaced by t
29b10 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20  he new). Or, if 
29b20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64  .** there alread
29b30 79 20 65 78 69 73 74 73 20 61 20 6d 61 70 70 69  y exists a mappi
29b40 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ng for this file
29b50 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
29b60 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61  still .** outsta
29b70 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29 20 72  nding xFetch() r
29b80 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c  eferences to it,
29b90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
29ba0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
29bb0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42   If parameter nB
29bc0 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  yte is non-negat
29bd0 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ive, then it is 
29be0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
29bf0 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61  ze of .** the ma
29c00 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e  pping to create.
29c10 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e   Otherwise, if n
29c20 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68 61  Byte is less tha
29c30 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
29c40 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73   .** requested s
29c50 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65 20  ize is the size 
29c60 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
29c70 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20  isk. The actual 
29c80 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  size of the.** c
29c90 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69  reated mapping i
29ca0 73 20 65 69 74 68 65 72 20 74 68 65 20 72 65 71  s either the req
29cb0 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74  uested size or t
29cc0 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75  he value configu
29cd0 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51  red .** using SQ
29ce0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
29cf0 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76 65 72  LIMIT, whichever
29d00 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a   is smaller..**.
29d10 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
29d20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
29d30 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65  rror occurs (eve
29d40 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67  n if the mapping
29d50 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65   is not.** recre
29d60 61 74 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  ated as a result
29d70 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
29d80 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61  references) or a
29d90 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a  n SQLite error.*
29da0 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  * code otherwise
29db0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29dc0 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78  unixMapfile(unix
29dd0 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e  File *pFd, i64 n
29de0 4d 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Map){.  assert( 
29df0 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e  nMap>=0 || pFd->
29e00 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
29e10 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30    assert( nMap>0
29e20 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69   || (pFd->mmapSi
29e30 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d  ze==0 && pFd->pM
29e40 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a  apRegion==0) );.
29e50 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63    if( pFd->nFetc
29e60 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20  hOut>0 ) return 
29e70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
29e80 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20  ( nMap<0 ){.    
29e90 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
29ea0 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  buf;          /*
29eb0 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
29ec0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
29ed0 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
29ee0 46 64 2d 3e 68 2c 20 26 73 74 61 74 62 75 66 29  Fd->h, &statbuf)
29ef0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29f00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
29f10 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  TAT;.    }.    n
29f20 4d 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74  Map = statbuf.st
29f30 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  _size;.  }.  if(
29f40 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53   nMap>pFd->mmapS
29f50 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d  izeMax ){.    nM
29f60 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ap = pFd->mmapSi
29f70 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 61 73  zeMax;.  }..  as
29f80 73 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c 7c 20  sert( nMap>0 || 
29f90 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d  (pFd->mmapSize==
29fa0 30 20 26 26 20 70 46 64 2d 3e 70 4d 61 70 52 65  0 && pFd->pMapRe
29fb0 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66  gion==0) );.  if
29fc0 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61  ( nMap!=pFd->mma
29fd0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 75 6e 69  pSize ){.    uni
29fe0 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64 2c 20  xRemapfile(pFd, 
29ff0 6e 4d 61 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  nMap);.  }..  re
2a000 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2a010 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2a020 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
2a030 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  >0 */../*.** If 
2a040 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e  possible, return
2a050 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2a060 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20  mapping of file 
2a070 66 64 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f  fd starting at o
2a080 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54  ffset.** iOff. T
2a090 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20  he mapping must 
2a0a0 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20  be valid for at 
2a0b0 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73  least nAmt bytes
2a0c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
2a0d0 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65  a pointer can be
2a0e0 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65   obtained, store
2a0f0 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72   it in *pp and r
2a100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
2a110 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63  .** Or, if one c
2a120 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72  annot but no err
2a130 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
2a140 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  pp to 0 and retu
2a150 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
2a160 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20   Finally, if an 
2a170 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
2a180 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
2a190 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  te error code. T
2a1a0 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  he final.** valu
2a1b0 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65  e of *pp is unde
2a1c0 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
2a1d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  se..**.** If thi
2a1e0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
2a1f0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2a200 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
2a210 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a  t eventually .**
2a220 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   release the ref
2a230 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e  erence by callin
2a240 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e  g unixUnfetch().
2a250 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2a260 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74 65 33  nixFetch(sqlite3
2a270 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
2a280 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76  Off, int nAmt, v
2a290 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53  oid **pp){.#if S
2a2a0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
2a2b0 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65  IZE>0.  unixFile
2a2c0 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c   *pFd = (unixFil
2a2d0 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  e *)fd;   /* The
2a2e0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
2a2f0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e  base file */.#en
2a300 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a  dif.  *pp = 0;..
2a310 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
2a320 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28  MAP_SIZE>0.  if(
2a330 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
2a340 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  x>0 ){.    if( p
2a350 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d  Fd->pMapRegion==
2a360 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  0 ){.      int r
2a370 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  c = unixMapfile(
2a380 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  pFd, -1);.      
2a390 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a3a0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
2a3b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64     }.    if( pFd
2a3c0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f  ->mmapSize >= iO
2a3d0 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20  ff+nAmt ){.     
2a3e0 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70   *pp = &((u8 *)p
2a3f0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
2a400 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64  iOff];.      pFd
2a410 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20  ->nFetchOut++;. 
2a420 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2a430 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a440 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  OK;.}../*.** If 
2a450 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
2a460 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  nt is non-NULL, 
2a470 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
2a480 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a  on releases a .*
2a490 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61  * reference obta
2a4a0 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ined by an earli
2a4b0 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46  er call to unixF
2a4c0 65 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f  etch(). The seco
2a4d0 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70  nd.** argument p
2a4e0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
2a4f0 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74  nction must be t
2a500 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63  he same as the c
2a510 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
2a520 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61  argument that wa
2a530 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
2a540 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f  unixFetch() invo
2a550 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f  cation. .**.** O
2a560 72 2c 20 69 66 20 74 68 65 20 74 68 69 72 64 20  r, if the third 
2a570 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c  argument is NULL
2a580 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
2a590 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61  tion is being ca
2a5a0 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f  lled .** to info
2a5b0 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  rm the VFS layer
2a5c0 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67   that, according
2a5d0 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65   to POSIX, any e
2a5e0 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
2a5f0 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69  .** may now be i
2a600 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
2a610 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a  d be unmapped..*
2a620 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2a630 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33  xUnfetch(sqlite3
2a640 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
2a650 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23  Off, void *p){.#
2a660 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
2a670 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78  AP_SIZE>0.  unix
2a680 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69  File *pFd = (uni
2a690 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a  xFile *)fd;   /*
2a6a0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
2a6b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2a6c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2a6d0 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a  TER(iOff);..  /*
2a6e0 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20   If p==0 (unmap 
2a6f0 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29  the entire file)
2a700 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
2a710 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69   be no outstandi
2a720 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20  ng .  ** xFetch 
2a730 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20  references. Or, 
2a740 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67  if p!=0 (meaning
2a750 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68   it is an xFetch
2a760 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a   reference),.  *
2a770 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  * then there mus
2a780 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
2a790 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20  e outstanding.  
2a7a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d  */.  assert( (p=
2a7b0 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63  =0)==(pFd->nFetc
2a7c0 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  hOut==0) );..  /
2a7d0 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75  * If p!=0, it mu
2a7e0 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66  st match the iOf
2a7f0 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73  f value. */.  as
2a800 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d  sert( p==0 || p=
2a810 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d  =&((u8 *)pFd->pM
2a820 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20  apRegion)[iOff] 
2a830 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  );..  if( p ){. 
2a840 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
2a850 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t--;.  }else{.  
2a860 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
2a870 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  pFd);.  }..  ass
2a880 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
2a890 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a  Out>=0 );.#else.
2a8a0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2a8b0 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44  ER(fd);.  UNUSED
2a8c0 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
2a8d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2a8e0 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a  R(iOff);.#endif.
2a8f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a900 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  OK;.}../*.** Her
2a910 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65  e ends the imple
2a920 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mentation of all
2a930 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
2a940 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  thods..**.******
2a950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a960 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c   End sqlite3_fil
2a970 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e Methods ******
2a980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a990 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2a9a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9e0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
2a9f0 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63   This division c
2aa00 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69  ontains definiti
2aa10 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  ons of sqlite3_i
2aa20 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2aa30 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d  s that.** implem
2aa40 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65  ent various file
2aa50 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
2aa60 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f  ies.  It also co
2aa70 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
2aa80 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72  ns.** of "finder
2aa90 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20  " functions.  A 
2aaa0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
2aab0 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74  is used to locat
2aac0 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  e the appropriat
2aad0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f  e.** sqlite3_io_
2aae0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66  methods object f
2aaf0 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  or a particular 
2ab00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
2ab10 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20  The pAppData.** 
2ab20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c  field of the sql
2ab30 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a  ite3_vfs VFS obj
2ab40 65 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c  ects are initial
2ab50 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74  ized to be point
2ab60 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f  ers to.** the co
2ab70 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e  rrect finder-fun
2ab80 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56  ction for that V
2ab90 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66  FS..**.** Most f
2aba0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  inder functions 
2abb0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2abc0 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69   to a fixed sqli
2abd0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
2abe0 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f  * object.  The o
2abf0 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20  nly interesting 
2ac00 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
2ac10 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  is autolockIoFin
2ac20 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f  der, which.** lo
2ac30 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73  oks at the files
2ac40 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74  ystem type and t
2ac50 72 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68  ries to guess th
2ac60 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a  e best locking.*
2ac70 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20  * strategy from 
2ac80 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  that..**.** For 
2ac90 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
2aca0 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61  F, two objects a
2acb0 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a  re created:.**.*
2acc0 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65 61  *    (1) The rea
2acd0 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  l finder-functio
2ace0 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29  n named "FImpt()
2acf0 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  "..**.**    (2) 
2ad00 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74  A constant point
2ad10 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  er to this funct
2ad20 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22  ion named just "
2ad30 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70  F"..**.**.** A p
2ad40 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20  ointer to the F 
2ad50 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20  pointer is used 
2ad60 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61 20  as the pAppData 
2ad70 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a  value for VFS.**
2ad80 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61   objects.  We ha
2ad90 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e  ve to do this in
2ada0 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67  stead of letting
2adb0 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a   pAppData point.
2adc0 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20 74  ** directly at t
2add0 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  he finder-functi
2ade0 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c  on since C90 rul
2adf0 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69  es prevent a voi
2ae00 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61  d*.** from be ca
2ae10 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69  st into a functi
2ae20 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  on pointer..**.*
2ae30 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e  *.** Each instan
2ae40 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  ce of this macro
2ae50 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f   generates two o
2ae60 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  bjects:.**.**   
2ae70 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71  *  A constant sq
2ae80 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2ae90 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54   object call MET
2aea0 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63  HOD that has loc
2aeb0 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74  king.**      met
2aec0 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b  hods CLOSE, LOCK
2aed0 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c  , UNLOCK, CKRESL
2aee0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  OCK..**.**   *  
2aef0 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69  An I/O method fi
2af00 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  nder function ca
2af10 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61 74  lled FINDER that
2af20 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
2af30 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  er.**      to th
2af40 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20  e METHOD object 
2af50 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
2af60 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69  bullet..*/.#defi
2af70 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e  ne IOMETHODS(FIN
2af80 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49  DER,METHOD,VERSI
2af90 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e  ON,CLOSE,LOCK,UN
2afa0 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d  LOCK,CKLOCK,SHMM
2afb0 41 50 29 20 20 20 20 20 5c 0a 73 74 61 74 69 63  AP)     \.static
2afc0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2afd0 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44  o_methods METHOD
2afe0 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20 20   = {            
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b000 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53         \.   VERS
2b010 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ION,            
2b020 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
2b030 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ion */          
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b050 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45        \.   CLOSE
2b060 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b070 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2b080 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0a0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65       \.   unixRe
2b0b0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
2b0c0 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
2b0d0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0f0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69      \.   unixWri
2b100 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
2b110 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
2b120 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b140 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e     \.   unixTrun
2b150 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
2b160 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
2b170 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b190 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c    \.   unixSync,
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1b0 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20     /* xSync */  
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1e0 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69   \.   unixFileSi
2b1f0 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
2b200 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
2b210 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b230 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20  \.   LOCK,      
2b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b250 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20   /* xLock */    
2b260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2b280 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20  .   UNLOCK,     
2b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2a0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20  /* xUnlock */   
2b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b2d0 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20     CKLOCK,      
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b2f0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
2b300 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
2b310 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2b320 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
2b330 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l,            /*
2b340 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f   xFileControl */
2b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b360 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2b370 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c   unixSectorSize,
2b380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b390 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20  xSectorSize */  
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2b3c0 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
2b3d0 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78  teristics,  /* x
2b3e0 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69  DeviceCapabiliti
2b3f0 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  es */           
2b400 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 53            \.   S
2b410 48 4d 4d 41 50 2c 20 20 20 20 20 20 20 20 20 20  HMMAP,          
2b420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2b430 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20  hmMap */        
2b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b450 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2b460 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  ixShmLock,      
2b470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2b480 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  mLock */        
2b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4a0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2b4b0 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  xShmBarrier,    
2b4c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2b4d0 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20  Barrier */      
2b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4f0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2b500 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
2b510 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
2b520 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20  nmap */         
2b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b540 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
2b550 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
2b560 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
2b570 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b590 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e       \.   unixUn
2b5a0 66 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  fetch,          
2b5b0 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63        /* xUnfetc
2b5c0 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  h */            
2b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5e0 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20      \.};        
2b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b630 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
2b640 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2b650 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d  hods *FINDER##Im
2b660 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pl(const char *z
2b670 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20  , unixFile *p){ 
2b680 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52    \.  UNUSED_PAR
2b690 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45  AMETER(z); UNUSE
2b6a0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20  D_PARAMETER(p); 
2b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6d0 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54   \.  return &MET
2b6e0 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20  HOD;            
2b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b720 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  \.}             
2b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2b770 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
2b780 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2b790 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52   *(*const FINDER
2b7a0 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
2b7b0 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a  ixFile *p)    \.
2b7c0 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d      = FINDER##Im
2b7d0 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  pl;../*.** Here 
2b7e0 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  are all of the s
2b7f0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2b800 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  s objects for ea
2b810 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  ch of the.** loc
2b820 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
2b830 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74    Functions that
2b840 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73   return pointers
2b850 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64   to these method
2b860 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72  s.** are also cr
2b870 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48  eated..*/.IOMETH
2b880 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69  ODS(.  posixIoFi
2b890 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2b8a0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2b8b0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f  ion name */.  po
2b8c0 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  sixIoMethods,   
2b8d0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2b8e0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2b8f0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33  ject name */.  3
2b900 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b910 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2b920 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d  ed memory and mm
2b930 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a  ap are enabled *
2b940 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
2b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b960 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2b970 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
2b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b990 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2b9a0 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20  .  unixUnlock,  
2b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b9c0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2b9d0 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
2b9e0 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a  ervedLock,    /*
2b9f0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2ba00 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2ba10 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 20  unixShmMap      
2ba20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2ba30 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
2ba40 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f  .IOMETHODS(.  no
2ba50 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
2ba60 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2ba70 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2ba80 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  */.  nolockIoMet
2ba90 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f  hods,          /
2baa0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2bab0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2bac0 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20   */.  3,        
2bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bae0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2baf0 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20 65 6e   and mmap are en
2bb00 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  abled */.  noloc
2bb10 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
2bb20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2bb30 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
2bb40 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
2bb50 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2bb60 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
2bb70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
2bb80 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2bb90 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
2bba0 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
2bbb0 63 6b 2c 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ck,  /* xCheckRe
2bbc0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2bbd0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbf0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2bc00 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
2bc10 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  S(.  dotlockIoFi
2bc20 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f  nder,          /
2bc30 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2bc40 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c  n name */.  dotl
2bc50 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
2bc60 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2bc70 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2bc80 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
2bc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bca0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2bcb0 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2bcc0 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  led */.  dotlock
2bcd0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2bce0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2bcf0 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
2bd00 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2bd10 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2bd20 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55  od */.  dotlockU
2bd30 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2bd40 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2bd50 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
2bd60 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2bd70 6b 2c 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  k, /* xCheckRese
2bd80 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2bd90 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bdb0 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2bdc0 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54   */.)..#if SQLIT
2bdd0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2bde0 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
2bdf0 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65  (.  flockIoFinde
2be00 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2be10 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2be20 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b   name */.  flock
2be30 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
2be40 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2be50 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2be60 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
2be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be80 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2be90 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
2bea0 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f  ed */.  flockClo
2beb0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2bec0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2bed0 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63  od */.  flockLoc
2bee0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2bef0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2bf00 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f  d */.  flockUnlo
2bf10 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2bf20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2bf30 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65  od */.  flockChe
2bf40 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
2bf50 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2bf60 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2bf70 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
2bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bf90 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
2bfa0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
2bfb0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45   OS_VXWORKS.IOME
2bfc0 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69  THODS(.  semIoFi
2bfd0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2bfe0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2bff0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2c000 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  semIoMethods,   
2c010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2c020 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2c030 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2c040 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
2c050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2c060 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
2c070 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d  isabled */.  sem
2c080 58 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  XClose,         
2c090 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2c0a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
2c0b0 58 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  XLock,          
2c0c0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2c0d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58  method */.  semX
2c0e0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
2c0f0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2c100 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
2c110 58 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  XCheckReservedLo
2c120 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ck,    /* xCheck
2c130 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2c140 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
2c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c160 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
2c170 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
2c180 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
2c190 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2c1a0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2c1b0 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
2c1c0 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72  S(.  afpIoFinder
2c1d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2c1e0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2c1f0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49  n name */.  afpI
2c200 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
2c210 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2c220 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2c230 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
2c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c250 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2c260 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2c270 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73  led */.  afpClos
2c280 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2c290 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2c2a0 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b  hod */.  afpLock
2c2b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c2c0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2c2d0 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63  od */.  afpUnloc
2c2e0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2c2f0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2c300 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63  hod */.  afpChec
2c310 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
2c320 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
2c330 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2c340 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c360 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2c370 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
2c380 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
2c390 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20  cking method is 
2c3a0 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22  a "super-method"
2c3b0 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68   in the sense th
2c3c0 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73  at it.** opens s
2c3d0 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65  econdary file de
2c3e0 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68  scriptors for th
2c3f0 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b  e conch and lock
2c400 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74   files and.** it
2c410 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74   uses proxy, dot
2c420 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20  -file, AFP, and 
2c430 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
2c440 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65  methods on those
2c450 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69  .** secondary fi
2c460 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72  les.  For this r
2c470 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
2c480 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
2c490 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63  nts.** proxy loc
2c4a0 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20  king is located 
2c4b0 6d 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77  much further dow
2c4c0 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  n in the file.  
2c4d0 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74  But we need.** t
2c4e0 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64  o go ahead and d
2c4f0 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65  efine the sqlite
2c500 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64  3_io_methods and
2c510 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
2c520 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  .** for proxy lo
2c530 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20  cking here.  So 
2c540 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61  we forward decla
2c550 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f  re the I/O metho
2c560 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ds..*/.#if defin
2c570 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2c580 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2c590 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
2c5a0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f  tic int proxyClo
2c5b0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  se(sqlite3_file*
2c5c0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
2c5d0 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
2c5e0 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
2c5f0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c  tic int proxyUnl
2c600 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
2c610 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
2c620 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65  int proxyCheckRe
2c630 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
2c640 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b  e3_file*, int*);
2c650 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72  .IOMETHODS(.  pr
2c660 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  oxyIoFinder,    
2c670 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2c680 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2c690 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68  */.  proxyIoMeth
2c6a0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
2c6b0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2c6c0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2c6d0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
2c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6f0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2c700 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2c710 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20    proxyClose,   
2c720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c730 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2c740 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20    proxyLock,    
2c750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c760 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2c770 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20   proxyUnlock,   
2c780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2c790 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2c7a0 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65    proxyCheckRese
2c7b0 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78  rvedLock,   /* x
2c7c0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2c7d0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7f0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2c800 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
2c810 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f  endif../* nfs lo
2c820 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b  ckd on OSX 10.3+
2c830 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77   doesn't clear w
2c840 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20  rite locks when 
2c850 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
2c860 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  et */.#if define
2c870 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2c880 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2c890 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
2c8a0 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69  THODS(.  nfsIoFi
2c8b0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2c8c0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
2c8d0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
2c8e0 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20   nfsIoMethods,  
2c8f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2c900 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2c910 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2c920 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
2c930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c940 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2c950 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2c960 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
2c970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2c980 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2c990 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c9b0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2c9c0 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   nfsUnlock,     
2c9d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c9e0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
2c9f0 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
2ca00 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a  rvedLock,     /*
2ca10 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2ca20 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2ca30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2ca40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2ca50 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
2ca60 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ).#endif..#if de
2ca70 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2ca80 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2ca90 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2caa0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e  /* .** This "fin
2cab0 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74  der" function at
2cac0 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
2cad0 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ine the best loc
2cae0 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a  king strategy .*
2caf0 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  * for the databa
2cb00 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74  se file "filePat
2cb10 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74  h".  It then ret
2cb20 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  urns the sqlite3
2cb30 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
2cb40 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
2cb50 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74  ments that strat
2cb60 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  egy..**.** This 
2cb70 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e  is for MacOSX on
2cb80 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly..*/.static co
2cb90 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2cba0 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b  ethods *autolock
2cbb0 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20  IoFinderImpl(.  
2cbc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
2cbd0 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65  Path,    /* name
2cbe0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2cbf0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
2cc00 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20  ile *pNew       
2cc10 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65      /* open file
2cc20 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
2cc30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2cc40 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  .){.  static con
2cc50 73 74 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e  st struct Mappin
2cc60 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  g {.    const ch
2cc70 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b  ar *zFilesystem;
2cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cc90 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   Filesystem type
2cca0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e   name */.    con
2ccb0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2ccc0 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b  thods *pMethods;
2ccd0 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74     /* Appropriat
2cce0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
2ccf0 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d   */.  } aMap[] =
2cd00 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20   {.    { "hfs", 
2cd10 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
2cd20 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73  ds },.    { "ufs
2cd30 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65  ",    &posixIoMe
2cd40 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
2cd50 61 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d  afpfs",  &afpIoM
2cd60 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
2cd70 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f  "smbfs",  &afpIo
2cd80 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
2cd90 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f   "webdav", &nolo
2cda0 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ckIoMethods },. 
2cdb0 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b     { 0, 0 }.  };
2cdc0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
2cdd0 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
2cde0 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
2cdf0 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
2ce00 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
2ce10 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
2ce20 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
2ce30 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
2ce40 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
2ce50 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
2ce60 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
2ce70 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
2ce80 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
2ce90 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
2cea0 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73    }.  if( statfs
2ceb0 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e  (filePath, &fsIn
2cec0 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) != -1 ){.   
2ced0 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c   if( fsInfo.f_fl
2cee0 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59  ags & MNT_RDONLY
2cef0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2cf00 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2cf10 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  s;.    }.    for
2cf20 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46  (i=0; aMap[i].zF
2cf30 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b  ilesystem; i++){
2cf40 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
2cf50 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
2cf60 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a  ename, aMap[i].z
2cf70 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29  Filesystem)==0 )
2cf80 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2cf90 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64   aMap[i].pMethod
2cfa0 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
2cfb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75  .  }..  /* Defau
2cfc0 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73  lt case. Handles
2cfd0 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73  , amongst others
2cfe0 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65  , "nfs"..  ** Te
2cff0 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  st byte-range lo
2d000 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29  ck using fcntl()
2d010 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75  . If the call su
2d020 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73  cceeds, .  ** as
2d030 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69  sume that the fi
2d040 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
2d050 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c  ts POSIX style l
2d060 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f  ocks. .  */.  lo
2d070 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
2d080 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
2d090 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
2d0a0 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
2d0b0 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
2d0c0 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
2d0d0 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46  RDLCK;.  if( osF
2d0e0 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
2d0f0 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
2d100 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66  )!=-1 ) {.    if
2d110 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
2d120 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e  f_fstypename, "n
2d130 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fs")==0 ){.     
2d140 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65   return &nfsIoMe
2d150 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73  thods;.    } els
2d160 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e {.      return
2d170 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2d180 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2d190 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74  .    return &dot
2d1a0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
2d1b0 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73   }.}.static cons
2d1c0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2d1d0 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74  hods .  *(*const
2d1e0 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
2d1f0 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  r)(const char*,u
2d200 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f  nixFile*) = auto
2d210 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
2d220 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  ;..#endif /* def
2d230 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2d240 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2d250 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
2d260 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  /..#if OS_VXWORK
2d270 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 22 66 69  S./*.** This "fi
2d280 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 66  nder" function f
2d290 6f 72 20 56 78 57 6f 72 6b 73 20 63 68 65 63 6b  or VxWorks check
2d2a0 73 20 74 6f 20 73 65 65 20 69 66 20 70 6f 73 69  s to see if posi
2d2b0 78 20 61 64 76 69 73 6f 72 79 0a 2a 2a 20 6c 6f  x advisory.** lo
2d2c0 63 6b 69 6e 67 20 77 6f 72 6b 73 2e 20 20 49 66  cking works.  If
2d2d0 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 20 74   it does, then t
2d2e0 68 61 74 20 69 73 20 77 68 61 74 20 69 73 20 75  hat is what is u
2d2f0 73 65 64 2e 20 20 49 66 20 69 74 20 64 6f 65 73  sed.  If it does
2d300 20 6e 6f 74 0a 2a 2a 20 77 6f 72 6b 2c 20 74 68   not.** work, th
2d310 65 6e 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 6e  en fallback to n
2d320 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
2d330 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ocking..*/.stati
2d340 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2d350 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 76 78 77 6f  io_methods *vxwo
2d360 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28  rksIoFinderImpl(
2d370 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
2d380 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e  ilePath,    /* n
2d390 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2d3a0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ase file */.  un
2d3b0 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20  ixFile *pNew    
2d3c0 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70         /* the op
2d3d0 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a  en file object *
2d3e0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  /.){.  struct fl
2d3f0 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20  ock lockInfo;.. 
2d400 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29   if( !filePath )
2d410 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65  {.    /* If file
2d420 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Path==NULL that 
2d430 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
2d440 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e  ling with a tran
2d450 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a  sient file.    *
2d460 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  * that does not 
2d470 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
2d480 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
2d490 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2d4a0 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73  s;.  }..  /* Tes
2d4b0 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20  t if fcntl() is 
2d4c0 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73  supported and us
2d4d0 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  e POSIX style lo
2d4e0 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  cks..  ** Otherw
2d4f0 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ise fall back to
2d500 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
2d510 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a  hore method..  *
2d520 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
2d530 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
2d540 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
2d550 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
2d560 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
2d570 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
2d580 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
2d590 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d  f( osFcntl(pNew-
2d5a0 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
2d5b0 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a  ckInfo)!=-1 ) {.
2d5c0 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69      return &posi
2d5d0 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  xIoMethods;.  }e
2d5e0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2d5f0 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &semIoMethods;. 
2d600 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73   }.}.static cons
2d610 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2d620 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74  hods .  *(*const
2d630 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72   vxworksIoFinder
2d640 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
2d650 69 78 46 69 6c 65 2a 29 20 3d 20 76 78 77 6f 72  ixFile*) = vxwor
2d660 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ksIoFinderImpl;.
2d670 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
2d680 57 4f 52 4b 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  WORKS */../*.** 
2d690 41 6e 20 61 62 73 74 72 61 63 74 20 74 79 70 65  An abstract type
2d6a0 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74   for a pointer t
2d6b0 6f 20 61 6e 20 49 4f 20 6d 65 74 68 6f 64 20 66  o an IO method f
2d6c0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a  inder function:.
2d6d0 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74  */.typedef const
2d6e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2d6f0 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79  ods *(*finder_ty
2d700 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pe)(const char*,
2d710 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a  unixFile*);.../*
2d720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
2d770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d780 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33  ******** sqlite3
2d790 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
2d7a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d7b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
2d7c0 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
2d7d0 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
2d7e0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74  mentation of met
2d7f0 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73  hods on the.** s
2d800 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
2d810 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  t..*/../*.** Ini
2d820 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74  tialize the cont
2d830 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78  ents of the unix
2d840 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  File structure p
2d850 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64  ointed to by pId
2d860 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d870 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a  fillInUnixFile(.
2d880 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2d890 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  Vfs,      /* Poi
2d8a0 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
2d8b0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20  ct */.  int h,  
2d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8d0 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
2d8e0 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20  criptor of file 
2d8f0 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
2d900 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2d910 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69  pId,      /* Wri
2d920 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69  te to the unixFi
2d930 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72  le structure her
2d940 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2d950 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
2d960 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
2d970 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
2d980 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61  */.  int ctrlFla
2d990 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
2d9a0 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49  Zero or more UNI
2d9b0 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a  XFILE_* values *
2d9c0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  /.){.  const sql
2d9d0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2d9e0 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  *pLockingStyle;.
2d9f0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2da00 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
2da10 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Id;.  int rc = S
2da20 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2da30 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64  ert( pNew->pInod
2da40 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a  e==NULL );..  /*
2da50 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75   No locking occu
2da60 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  rs in temporary 
2da70 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  files */.  asser
2da80 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20  t( zFilename!=0 
2da90 7c 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26 20  || (ctrlFlags & 
2daa0 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29  UNIXFILE_NOLOCK)
2dab0 21 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  !=0 );..  OSTRAC
2dac0 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E(("OPEN    %-3d
2dad0 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
2dae0 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  name));.  pNew->
2daf0 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70  h = h;.  pNew->p
2db00 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e  Vfs = pVfs;.  pN
2db10 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c  ew->zPath = zFil
2db20 65 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63  ename;.  pNew->c
2db30 74 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29 63  trlFlags = (u8)c
2db40 74 72 6c 46 6c 61 67 73 3b 0a 23 69 66 20 53 51  trlFlags;.#if SQ
2db50 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
2db60 5a 45 3e 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61  ZE>0.  pNew->mma
2db70 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74  pSizeMax = sqlit
2db80 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
2db90 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20  zMmap;.#endif.  
2dba0 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  if( sqlite3_uri_
2dbb0 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c  boolean(((ctrlFl
2dbc0 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 55  ags & UNIXFILE_U
2dbd0 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20  RI) ? zFilename 
2dbe0 3a 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  : 0),.          
2dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc00 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f   "psow", SQLITE_
2dc10 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
2dc20 49 54 45 29 20 29 7b 0a 20 20 20 20 70 4e 65 77  ITE) ){.    pNew
2dc30 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
2dc40 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20  NIXFILE_PSOW;.  
2dc50 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 70  }.  if( strcmp(p
2dc60 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78  Vfs->zName,"unix
2dc70 2d 65 78 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  -excl")==0 ){.  
2dc80 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2dc90 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58  s |= UNIXFILE_EX
2dca0 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  CL;.  }..#if OS_
2dcb0 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e  VXWORKS.  pNew->
2dcc0 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e  pId = vxworksFin
2dcd0 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d  dFileId(zFilenam
2dce0 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e  e);.  if( pNew->
2dcf0 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74  pId==0 ){.    ct
2dd00 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2dd10 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20  ILE_NOLOCK;.    
2dd20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2dd30 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  M_BKPT;.  }.#end
2dd40 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c  if..  if( ctrlFl
2dd50 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e  ags & UNIXFILE_N
2dd60 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f  OLOCK ){.    pLo
2dd70 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f  ckingStyle = &no
2dd80 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
2dd90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63   }else{.    pLoc
2dda0 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28  kingStyle = (**(
2ddb0 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66  finder_type*)pVf
2ddc0 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69  s->pAppData)(zFi
2ddd0 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23  lename, pNew);.#
2dde0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2ddf0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2de00 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c     /* Cache zFil
2de10 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63  ename in the loc
2de20 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46  king context (AF
2de30 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76  P and dotlock ov
2de40 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20  erride) for.    
2de50 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74  ** proxyLock act
2de60 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69  ivation is possi
2de70 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78  ble (remote prox
2de80 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62  y is based on db
2de90 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46   name).    ** zF
2dea0 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20  ilename remains 
2deb0 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65  valid until file
2dec0 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73   is closed, to s
2ded0 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e  upport */.    pN
2dee0 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
2def0 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c  xt = (void*)zFil
2df00 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  ename;.#endif.  
2df10 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e  }..  if( pLockin
2df20 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78  gStyle == &posix
2df30 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65  IoMethods.#if de
2df40 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2df50 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2df60 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2df70 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53      || pLockingS
2df80 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65  tyle == &nfsIoMe
2df90 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29  thods.#endif.  )
2dfa0 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  {.    unixEnterM
2dfb0 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
2dfc0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
2dfd0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
2dfe0 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
2dff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e000 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
2e010 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 66  or occurred in f
2e020 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20  indInodeInfo(), 
2e030 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
2e040 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20  escriptor.      
2e050 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ** immediately, 
2e060 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67  before releasing
2e070 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64   the mutex. find
2e080 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20  InodeInfo() may 
2e090 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e  fail.      ** in
2e0a0 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
2e0b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2e0c0 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74  *   (a) A call t
2e0d0 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64  o fstat() failed
2e0e0 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29  ..      **   (b)
2e0f0 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64   A malloc failed
2e100 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2e110 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29   ** Scenario (b)
2e120 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20   may only occur 
2e130 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  if the process i
2e140 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68  s holding no oth
2e150 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  er.      ** file
2e160 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
2e170 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
2e180 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72  le. If there wer
2e190 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20  e other file.   
2e1a0 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
2e1b0 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  s on this file, 
2e1c0 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77  then no malloc w
2e1d0 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64  ould be required
2e1e0 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e   by.      ** fin
2e1f0 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66  dInodeInfo(). If
2e200 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
2e210 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73  e, it is quite s
2e220 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20  afe to close.   
2e230 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d     ** handle h -
2e240 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e   as it is guaran
2e250 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73  teed that no pos
2e260 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65  ix locks will be
2e270 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20   released.      
2e280 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a  ** by doing so..
2e290 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2e2a0 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61  * If scenario (a
2e2b0 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72  ) caused the err
2e2c0 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61  or then things a
2e2d0 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20  re not so safe. 
2e2e0 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  The.      ** imp
2e2f0 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e  licit assumption
2e300 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66   here is that if
2e310 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20   fstat() fails, 
2e320 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20  things are in.  
2e330 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20      ** such bad 
2e340 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70  shape that dropp
2e350 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77  ing a lock or tw
2e360 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  o doesn't matter
2e370 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   much..      */.
2e380 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2e390 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2e3a0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d  NE__);.      h =
2e3b0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75   -1;.    }.    u
2e3c0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2e3d0 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
2e3e0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2e3f0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
2e400 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c  (__APPLE__).  el
2e410 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
2e420 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65  tyle == &afpIoMe
2e430 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
2e440 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  AFP locking uses
2e450 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2e460 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2e470 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
2e480 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69   ** the afpLocki
2e490 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a  ngContext..    *
2e4a0 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67  /.    afpLocking
2e4b0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
2e4c0 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
2e4d0 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d  Context = pCtx =
2e4e0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
2e4f0 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  4( sizeof(*pCtx)
2e500 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78   );.    if( pCtx
2e510 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2e520 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2e530 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
2e540 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69        /* NB: zFi
2e550 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e  lename exists an
2e560 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  d remains valid 
2e570 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69  until the file i
2e580 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a  s closed.      *
2e590 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72  * according to r
2e5a0 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34  equirement F1114
2e5b0 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74  1.  So we do not
2e5c0 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a   need to make a.
2e5d0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
2e5e0 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a   the filename. *
2e5f0 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62  /.      pCtx->db
2e600 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
2e610 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65  ;.      pCtx->re
2e620 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20  served = 0;.    
2e630 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a    srandomdev();.
2e640 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d        unixEnterM
2e650 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63  utex();.      rc
2e660 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2e670 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2e680 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28  node);.      if(
2e690 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e6a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e6b0 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63  3_free(pNew->loc
2e6c0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
2e6d0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2e6e0 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2e6f0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68  NE__);.        h
2e700 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
2e710 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
2e720 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20  tex();        . 
2e730 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2e740 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
2e750 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f  kingStyle == &do
2e760 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29  tlockIoMethods )
2e770 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65  {.    /* Dotfile
2e780 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2e790 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2e7a0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
2e7b0 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
2e7c0 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b   the dotlockLock
2e7d0 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20  ingContext .    
2e7e0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f  */.    char *zLo
2e7f0 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20  ckFile;.    int 
2e800 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61  nFilename;.    a
2e810 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
2e820 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65  !=0 );.    nFile
2e830 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  name = (int)strl
2e840 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  en(zFilename) + 
2e850 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65  6;.    zLockFile
2e860 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
2e870 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 46 69 6c  e3_malloc64(nFil
2e880 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
2e890 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a  zLockFile==0 ){.
2e8a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2e8b0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2e8c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2e8d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2e8e0 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b  nFilename, zLock
2e8f0 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f  File, "%s" DOTLO
2e900 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65  CK_SUFFIX, zFile
2e910 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
2e920 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
2e930 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c  ntext = zLockFil
2e940 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  e;.  }..#if OS_V
2e950 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66  XWORKS.  else if
2e960 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2e970 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73  == &semIoMethods
2e980 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64   ){.    /* Named
2e990 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
2e9a0 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
2e9b0 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
2e9c0 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69  s to be.    ** i
2e9d0 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
2e9e0 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  emLockingContext
2e9f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78  .    */.    unix
2ea00 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2ea10 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
2ea20 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
2ea30 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
2ea40 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( (rc==SQLITE_O
2ea50 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e  K) && (pNew->pIn
2ea60 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29  ode->pSem==NULL)
2ea70 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
2ea80 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d  zSemName = pNew-
2ea90 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
2eaa0 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  e;.      int n;.
2eab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2eac0 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
2ead0 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22  AME, zSemName, "
2eae0 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20  /%s.sem",.      
2eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb00 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e   pNew->pId->zCan
2eb10 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
2eb20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65     for( n=1; zSe
2eb30 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a  mName[n]; n++ ).
2eb40 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d          if( zSem
2eb50 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a  Name[n]=='/' ) z
2eb60 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27  SemName[n] = '_'
2eb70 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49  ;.      pNew->pI
2eb80 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d  node->pSem = sem
2eb90 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20  _open(zSemName, 
2eba0 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31  O_CREAT, 0666, 1
2ebb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
2ebc0 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20  w->pInode->pSem 
2ebd0 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b  == SEM_FAILED ){
2ebe0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2ebf0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2ec00 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
2ec10 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b  Inode->aSemName[
2ec20 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  0] = '\0';.     
2ec30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69   }.    }.    uni
2ec40 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
2ec50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73   }.#endif.  .  s
2ec60 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 4e  toreLastErrno(pN
2ec70 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f 53 5f 56  ew, 0);.#if OS_V
2ec80 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21  XWORKS.  if( rc!
2ec90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2eca0 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62    if( h>=0 ) rob
2ecb0 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2ecc0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2ecd0 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73    h = -1;.    os
2ece0 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  Unlink(zFilename
2ecf0 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  );.    pNew->ctr
2ed00 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2ed10 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23  LE_DELETE;.  }.#
2ed20 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d  endif.  if( rc!=
2ed30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ed40 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75   if( h>=0 ) robu
2ed50 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
2ed60 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d  , __LINE__);.  }
2ed70 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
2ed80 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69  pMethod = pLocki
2ed90 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65  ngStyle;.    Ope
2eda0 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
2edb0 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70    verifyDbFile(p
2edc0 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  New);.  }.  retu
2edd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2ede0 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
2edf0 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69  of a directory i
2ee00 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74  n which to put t
2ee10 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a  emporary files..
2ee20 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c  ** If no suitabl
2ee30 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
2ee40 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62   directory can b
2ee50 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
2ee60 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
2ee70 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
2ee80 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64  TempFileDir(void
2ee90 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
2eea0 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
2eeb0 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20   = {.     0,.   
2eec0 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f    0,.     "/var/
2eed0 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72  tmp",.     "/usr
2eee0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d  /tmp",.     "/tm
2eef0 70 22 2c 0a 20 20 20 20 20 22 2e 22 0a 20 20 7d  p",.     ".".  }
2ef00 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
2ef10 20 69 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74   i = 0;.  struct
2ef20 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e   stat buf;.  con
2ef30 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
2ef40 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
2ef50 65 63 74 6f 72 79 3b 0a 0a 20 20 69 66 28 20 21  ectory;..  if( !
2ef60 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69  azDirs[0] ) azDi
2ef70 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[0] = getenv("
2ef80 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b  SQLITE_TMPDIR");
2ef90 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31  .  if( !azDirs[1
2efa0 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20  ] ) azDirs[1] = 
2efb0 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
2efc0 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20  ;.  while(1){.  
2efd0 20 20 69 66 28 20 7a 44 69 72 21 3d 30 0a 20 20    if( zDir!=0.  
2efe0 20 20 20 26 26 20 6f 73 53 74 61 74 28 7a 44 69     && osStat(zDi
2eff0 72 2c 20 26 62 75 66 29 3d 3d 30 0a 20 20 20 20  r, &buf)==0.    
2f000 20 26 26 20 53 5f 49 53 44 49 52 28 62 75 66 2e   && S_ISDIR(buf.
2f010 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20 20 26 26  st_mode).     &&
2f020 20 6f 73 41 63 63 65 73 73 28 7a 44 69 72 2c 20   osAccess(zDir, 
2f030 30 33 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  03)==0.    ){.  
2f040 20 20 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b      return zDir;
2f050 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2f060 3e 3d 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  >=sizeof(azDirs)
2f070 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
2f080 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ]) ) break;.    
2f090 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 2b  zDir = azDirs[i+
2f0a0 2b 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +];.  }.  return
2f0b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
2f0c0 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
2f0d0 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75  file name in zBu
2f0e0 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65  f.  zBuf must be
2f0f0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
2f100 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
2f110 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65  cess and must be
2f120 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
2f130 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  old at least.** 
2f140 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2f150 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
2f160 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d  c int unixGetTem
2f170 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
2f180 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63  char *zBuf){.  c
2f190 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b  onst char *zDir;
2f1a0 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20  .  int iLimit = 
2f1b0 30 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  0;..  /* It's od
2f1c0 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
2f1d0 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
2f1e0 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
2f1f0 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
2f200 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
2f210 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
2f220 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
2f230 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
2f240 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
2f250 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 7a  iling. .  */.  z
2f260 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 53 69  Buf[0] = 0;.  Si
2f270 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
2f280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2f290 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20  RR );..  zDir = 
2f2a0 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
2f2b0 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  );.  if( zDir==0
2f2c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2f2d0 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
2f2e0 54 48 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 36  TH;.  do{.    u6
2f2f0 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  4 r;.    sqlite3
2f300 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
2f310 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20  of(r), &r);.    
2f320 61 73 73 65 72 74 28 20 6e 42 75 66 3e 32 20 29  assert( nBuf>2 )
2f330 3b 0a 20 20 20 20 7a 42 75 66 5b 6e 42 75 66 2d  ;.    zBuf[nBuf-
2f340 32 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  2] = 0;.    sqli
2f350 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
2f360 66 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51  f, zBuf, "%s/"SQ
2f370 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
2f380 52 45 46 49 58 22 25 6c 6c 78 25 63 22 2c 0a 20  REFIX"%llx%c",. 
2f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3a0 20 20 20 20 7a 44 69 72 2c 20 72 2c 20 30 29 3b      zDir, r, 0);
2f3b0 0a 20 20 20 20 69 66 28 20 7a 42 75 66 5b 6e 42  .    if( zBuf[nB
2f3c0 75 66 2d 32 5d 21 3d 30 20 7c 7c 20 28 69 4c 69  uf-2]!=0 || (iLi
2f3d0 6d 69 74 2b 2b 29 3e 31 30 20 29 20 72 65 74 75  mit++)>10 ) retu
2f3e0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2f3f0 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63  .  }while( osAcc
2f400 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29  ess(zBuf,0)==0 )
2f410 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2f420 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  E_OK;.}..#if SQL
2f430 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2f440 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
2f450 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f  ned(__APPLE__)./
2f460 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20  *.** Routine to 
2f470 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78  transform a unix
2f480 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78  File into a prox
2f490 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69  y-locking unixFi
2f4a0 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  le..** Implement
2f4b0 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f  ation in the pro
2f4c0 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e  xy-lock division
2f4d0 2c 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e  , but used by un
2f4e0 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53  ixOpen().** if S
2f4f0 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
2f500 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65  XY_LOCKING is de
2f510 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
2f520 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66   int proxyTransf
2f530 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78  ormUnixFile(unix
2f540 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61  File*, const cha
2f550 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r*);.#endif../*.
2f560 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  ** Search for an
2f570 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
2f580 63 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73  criptor that was
2f590 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64   opened on the d
2f5a0 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
2f5b0 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20   (not a journal 
2f5c0 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  or master-journa
2f5d0 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69  l file) identifi
2f5e0 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a  ed by pathname.*
2f5f0 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c  * zPath with SQL
2f600 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
2f610 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73  gs matching thos
2f620 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
2f630 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
2f640 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2f650 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20  ion..**.** Such 
2f660 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
2f670 72 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61  r may exist if a
2f680 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2f690 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a  tion was closed.
2f6a0 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63  ** but the assoc
2f6b0 69 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72  iated file descr
2f6c0 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20  iptor could not 
2f6d0 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73  be closed becaus
2f6e0 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  e some.** other 
2f6f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2f700 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
2f710 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67   file is holding
2f720 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a   a file-lock..**
2f730 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e   Refer to commen
2f740 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c  ts in the unixCl
2f750 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ose() function a
2f760 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63  nd the lengthy c
2f770 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69  omment.** descri
2f780 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69  bing "Posix Advi
2f790 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74  sory Locking" at
2f7a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2f7b0 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20  is file for .** 
2f7c0 66 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e  further details.
2f7d0 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34   Also, ticket #4
2f7e0 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  018..**.** If a 
2f7f0 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65  suitable file de
2f800 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e  scriptor is foun
2f810 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65  d, then it is re
2f820 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a  turned. If no.**
2f830 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72   such file descr
2f840 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64  iptor is located
2f850 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  , -1 is returned
2f860 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78  ..*/.static Unix
2f870 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65  UnusedFd *findRe
2f880 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63  usableFd(const c
2f890 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20  har *zPath, int 
2f8a0 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e  flags){.  UnixUn
2f8b0 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
2f8c0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  = 0;..  /* Do no
2f8d0 74 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20  t search for an 
2f8e0 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
2f8f0 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b  riptor on vxwork
2f900 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20  s. Not because. 
2f910 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c   ** vxworks woul
2f920 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72  d not benefit fr
2f930 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69  om the change (i
2f940 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e  t might, we're n
2f950 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62  ot sure),.  ** b
2f960 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61  ut because no wa
2f970 79 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20  y to test it is 
2f980 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
2f990 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65  ble. It is bette
2f9a0 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72  r .  ** not to r
2f9b0 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77  isk breaking vxw
2f9c0 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72  orks support for
2f9d0 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63   the sake of suc
2f9e0 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20  h an obscure .  
2f9f0 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a  ** feature.  */.
2fa00 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
2fa10 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
2fa20 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
2fa30 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
2fa40 73 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c  s of stat() call
2fa50 20 2a 2f 0a 0a 20 20 75 6e 69 78 45 6e 74 65 72   */..  unixEnter
2fa60 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 41  Mutex();..  /* A
2fa70 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79   stat() call may
2fa80 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75   fail for variou
2fa90 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68  s reasons. If th
2faa0 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  is happens, it i
2fab0 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65  s.  ** almost ce
2fac0 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70  rtain that an op
2fad0 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65  en() call on the
2fae0 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20   same path will 
2faf0 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20  also fail..  ** 
2fb00 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
2fb10 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
2fb20 75 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28  urs in the stat(
2fb30 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20  ) call here, it 
2fb40 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20  is.  ** ignored 
2fb50 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e  and -1 is return
2fb60 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
2fb70 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ill try to open 
2fb80 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20  a new file.  ** 
2fb90 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
2fba0 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69  e same path, fai
2fbb0 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  l, and return an
2fbc0 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65   error to SQLite
2fbd0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  **.  ** Even
2fbe0 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74   if a subsequent
2fbf0 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65   open() call doe
2fc00 73 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63  s succeed, the c
2fc10 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20  onsequences of. 
2fc20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e   ** not searchin
2fc30 67 20 66 6f 72 20 61 20 72 65 75 73 61 62 6c 65  g for a reusable
2fc40 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2fc50 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20   are not dire.  
2fc60 2a 2f 0a 20 20 69 66 28 20 69 6e 6f 64 65 4c 69  */.  if( inodeLi
2fc70 73 74 21 3d 30 20 26 26 20 30 3d 3d 6f 73 53 74  st!=0 && 0==osSt
2fc80 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74  at(zPath, &sStat
2fc90 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f  ) ){.    unixIno
2fca0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
2fcb0 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  .    pInode = in
2fcc0 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69  odeList;.    whi
2fcd0 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70  le( pInode && (p
2fce0 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65  Inode->fileId.de
2fcf0 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a  v!=sStat.st_dev.
2fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd10 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e       || pInode->
2fd20 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 28 75 36 34  fileId.ino!=(u64
2fd30 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29  )sStat.st_ino) )
2fd40 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20  {.       pInode 
2fd50 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
2fd60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2fd70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55  Inode ){.      U
2fd80 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70  nixUnusedFd **pp
2fd90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2fda0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
2fdb0 74 68 65 6c 64 28 70 49 6e 6f 64 65 2d 3e 70 4c  theld(pInode->pL
2fdc0 6f 63 6b 4d 75 74 65 78 29 20 29 3b 0a 20 20 20  ockMutex) );.   
2fdd0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
2fde0 5f 65 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70  _enter(pInode->p
2fdf0 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 20 20  LockMutex);.    
2fe00 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65    for(pp=&pInode
2fe10 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26  ->pUnused; *pp &
2fe20 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d  & (*pp)->flags!=
2fe30 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70  flags; pp=&((*pp
2fe40 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20  )->pNext));.    
2fe50 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b    pUnused = *pp;
2fe60 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73  .      if( pUnus
2fe70 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ed ){.        *p
2fe80 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65  p = pUnused->pNe
2fe90 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
2fea0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2feb0 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c  leave(pInode->pL
2fec0 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 20 20 7d  ockMutex);.    }
2fed0 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
2fee0 4d 75 74 65 78 28 29 3b 0a 23 65 6e 64 69 66 20  Mutex();.#endif 
2fef0 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57     /* if !OS_VXW
2ff00 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ORKS */.  return
2ff10 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a   pUnused;.}../*.
2ff20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6d 6f 64 65  ** Find the mode
2ff30 2c 20 75 69 64 20 61 6e 64 20 67 69 64 20 6f 66  , uid and gid of
2ff40 20 66 69 6c 65 20 7a 46 69 6c 65 2e 20 0a 2a 2f   file zFile. .*/
2ff50 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 46  .static int getF
2ff60 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74  ileMode(.  const
2ff70 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 20 20   char *zFile,   
2ff80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2ff90 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 6d 6f 64  le name */.  mod
2ffa0 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20  e_t *pMode,     
2ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ffc0 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73  OUT: Permissions
2ffd0 20 6f 66 20 7a 46 69 6c 65 20 2a 2f 0a 20 20 75   of zFile */.  u
2ffe0 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20  id_t *pUid,     
2fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30000 2a 20 4f 55 54 3a 20 75 69 64 20 6f 66 20 7a 46  * OUT: uid of zF
30010 69 6c 65 2e 20 2a 2f 0a 20 20 67 69 64 5f 74 20  ile. */.  gid_t 
30020 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20  *pGid           
30030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
30040 3a 20 67 69 64 20 6f 66 20 7a 46 69 6c 65 2e 20  : gid of zFile. 
30050 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 73  */.){.  struct s
30060 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
30070 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
30080 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64  t of stat() on d
30090 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
300a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
300b0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 30 3d 3d 6f  E_OK;.  if( 0==o
300c0 73 53 74 61 74 28 7a 46 69 6c 65 2c 20 26 73 53  sStat(zFile, &sS
300d0 74 61 74 29 20 29 7b 0a 20 20 20 20 2a 70 4d 6f  tat) ){.    *pMo
300e0 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f  de = sStat.st_mo
300f0 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 2a  de & 0777;.    *
30100 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f  pUid = sStat.st_
30110 75 69 64 3b 0a 20 20 20 20 2a 70 47 69 64 20 3d  uid;.    *pGid =
30120 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20   sStat.st_gid;. 
30130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
30140 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
30150 54 41 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  TAT;.  }.  retur
30160 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
30170 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30180 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70  called by unixOp
30190 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  en() to determin
301a0 65 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69  e the unix permi
301b0 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65  ssions.** to cre
301c0 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69  ate new files wi
301d0 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  th. If no error 
301e0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c  occurs, then SQL
301f0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
30200 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75  ed.** and a valu
30210 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70  e suitable for p
30220 61 73 73 69 6e 67 20 61 73 20 74 68 65 20 74 68  assing as the th
30230 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ird argument to 
30240 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72  open(2) is.** wr
30250 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e  itten to *pMode.
30260 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
30270 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
30280 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
30290 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
302a0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
302b0 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69  Mode is not modi
302c0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d  fied..**.** In m
302d0 6f 73 74 20 63 61 73 65 73 2c 20 74 68 69 73 20  ost cases, this 
302e0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d  routine sets *pM
302f0 6f 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20  ode to 0, which 
30300 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61  will become.** a
30310 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20  n indication to 
30320 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f  robust_open() to
30330 20 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65   create the file
30340 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45   using.** SQLITE
30350 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
30360 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74  RMISSIONS adjust
30370 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e  ed by the umask.
30380 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 66  .** But if the f
30390 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
303a0 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67   is a WAL or reg
303b0 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
303c0 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
303d0 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65   function querie
303e0 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  s the file-syste
303f0 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73  m for the permis
30400 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a  sions on the .**
30410 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64   corresponding d
30420 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
30430 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20   sets *pMode to 
30440 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e  this value. When
30450 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c  ever .** possibl
30460 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e  e, WAL and journ
30470 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  al files are cre
30480 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ated using the s
30490 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ame permissions 
304a0 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63  .** as the assoc
304b0 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
304c0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
304d0 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
304e0 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e  8_3_NAMES option
304f0 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
30500 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61  n the.** origina
30510 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e  l filename is un
30520 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20  available.  But 
30530 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c  8_3_NAMES is onl
30540 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41  y used for.** FA
30550 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e  T filesystems an
30560 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f  d permissions do
30570 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72   not matter ther
30580 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a  e, so just use.*
30590 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 65  * the default pe
305a0 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  rmissions..*/.st
305b0 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65  atic int findCre
305c0 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63  ateFileMode(.  c
305d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
305e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
305f0 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28  * Path of file (
30600 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20  possibly) being 
30610 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  created */.  int
30620 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
30630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30640 46 6c 61 67 73 20 70 61 73 73 65 64 20 61 73 20  Flags passed as 
30650 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  4th argument to 
30660 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64  xOpen() */.  mod
30670 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20  e_t *pMode,     
30680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30690 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73  OUT: Permissions
306a0 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69   to open file wi
306b0 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70  th */.  uid_t *p
306c0 55 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Uid,            
306d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
306e0 75 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68  uid to set on th
306f0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f  e file */.  gid_
30700 74 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20  t *pGid         
30710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
30720 55 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f  UT: gid to set o
30730 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  n the file */.){
30740 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
30750 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
30760 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
30770 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20  e */.  *pMode = 
30780 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a  0;.  *pUid = 0;.
30790 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69    *pGid = 0;.  i
307a0 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49  f( flags & (SQLI
307b0 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49  TE_OPEN_WAL|SQLI
307c0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
307d0 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61  RNAL) ){.    cha
307e0 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41  r zDb[MAX_PATHNA
307f0 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61  ME+1];     /* Da
30800 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68  tabase file path
30810 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b   */.    int nDb;
30820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30830 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
30840 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69  of valid bytes i
30850 6e 20 7a 44 62 20 2a 2f 0a 0a 20 20 20 20 2f 2a  n zDb */..    /*
30860 20 7a 50 61 74 68 20 69 73 20 61 20 70 61 74 68   zPath is a path
30870 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75   to a WAL or jou
30880 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66  rnal file. The f
30890 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64  ollowing block d
308a0 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68  erives.    ** th
308b0 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 61 73  e path to the as
308c0 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
308d0 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74  e file from zPat
308e0 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61  h. This block ha
308f0 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  ndles.    ** the
30900 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e   following namin
30910 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20  g conventions:. 
30920 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22     **.    **   "
30930 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
30940 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  rnal".    **   "
30950 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c  <path to db>-wal
30960 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
30970 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c  h to db>-journal
30980 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  NN".    **   "<p
30990 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e  ath to db>-walNN
309a0 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ".    **.    ** 
309b0 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65  where NN is a de
309c0 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68  cimal number. Th
309d0 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65  e NN naming sche
309e0 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  mes are .    ** 
309f0 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74  used by the test
30a00 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64  _multiplex.c mod
30a10 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ule..    */.    
30a20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72  nDb = sqlite3Str
30a30 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31  len30(zPath) - 1
30a40 3b 20 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50  ; .    while( zP
30a50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b  ath[nDb]!='-' ){
30a60 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 6e 6f 72  .      /* In nor
30a70 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74  mal operation, t
30a80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30a90 6e 61 6d 65 20 77 69 6c 6c 20 61 6c 77 61 79 73  name will always
30aa0 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 2a   contain.      *
30ab0 2a 20 61 20 27 2d 27 20 63 68 61 72 61 63 74 65  * a '-' characte
30ac0 72 2e 20 20 48 6f 77 65 76 65 72 20 69 6e 20 38  r.  However in 8
30ad0 2b 33 20 66 69 6c 65 6e 61 6d 65 20 6d 6f 64 65  +3 filename mode
30ae0 2c 20 6f 72 20 69 66 20 61 20 63 6f 72 72 75 70  , or if a corrup
30af0 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  t.      ** rollb
30b00 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 70 65 63  ack journal spec
30b10 69 66 69 65 73 20 61 20 6d 61 73 74 65 72 20 6a  ifies a master j
30b20 6f 75 72 6e 61 6c 20 77 69 74 68 20 61 20 67 6f  ournal with a go
30b30 6f 66 79 20 6e 61 6d 65 2c 20 74 68 65 6e 0a 20  ofy name, then. 
30b40 20 20 20 20 20 2a 2a 20 74 68 65 20 27 2d 27 20       ** the '-' 
30b50 6d 69 67 68 74 20 62 65 20 6d 69 73 73 69 6e 67  might be missing
30b60 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e  . */.      if( n
30b70 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e  Db==0 || zPath[n
30b80 44 62 5d 3d 3d 27 2e 27 20 29 20 72 65 74 75 72  Db]=='.' ) retur
30b90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
30ba0 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a     nDb--;.    }.
30bb0 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20      memcpy(zDb, 
30bc0 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20  zPath, nDb);.   
30bd0 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27   zDb[nDb] = '\0'
30be0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74 46  ;..    rc = getF
30bf0 69 6c 65 4d 6f 64 65 28 7a 44 62 2c 20 70 4d 6f  ileMode(zDb, pMo
30c00 64 65 2c 20 70 55 69 64 2c 20 70 47 69 64 29 3b  de, pUid, pGid);
30c10 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
30c20 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
30c30 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29  _DELETEONCLOSE )
30c40 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30  {.    *pMode = 0
30c50 36 30 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  600;.  }else if(
30c60 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
30c70 4f 50 45 4e 5f 55 52 49 20 29 7b 0a 20 20 20 20  OPEN_URI ){.    
30c80 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
30c90 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
30ca0 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
30cb0 77 61 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  was opened using
30cc0 20 61 20 55 52 49 0a 20 20 20 20 2a 2a 20 66 69   a URI.    ** fi
30cd0 6c 65 6e 61 6d 65 2c 20 63 68 65 63 6b 20 66 6f  lename, check fo
30ce0 72 20 74 68 65 20 22 6d 6f 64 65 6f 66 22 20 70  r the "modeof" p
30cf0 61 72 61 6d 65 74 65 72 2e 20 49 66 20 70 72 65  arameter. If pre
30d00 73 65 6e 74 2c 20 69 6e 74 65 72 70 72 65 74 0a  sent, interpret.
30d10 20 20 20 20 2a 2a 20 69 74 73 20 76 61 6c 75 65      ** its value
30d20 20 61 73 20 61 20 66 69 6c 65 6e 61 6d 65 20 61   as a filename a
30d30 6e 64 20 74 72 79 20 74 6f 20 63 6f 70 79 20 74  nd try to copy t
30d40 68 65 20 6d 6f 64 65 2c 20 75 69 64 20 61 6e 64  he mode, uid and
30d50 20 67 69 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a   gid from.    **
30d60 20 74 68 61 74 20 66 69 6c 65 2e 20 20 2a 2f 0a   that file.  */.
30d70 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
30d80 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  z = sqlite3_uri_
30d90 70 61 72 61 6d 65 74 65 72 28 7a 50 61 74 68 2c  parameter(zPath,
30da0 20 22 6d 6f 64 65 6f 66 22 29 3b 0a 20 20 20 20   "modeof");.    
30db0 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 72  if( z ){.      r
30dc0 63 20 3d 20 67 65 74 46 69 6c 65 4d 6f 64 65 28  c = getFileMode(
30dd0 7a 2c 20 70 4d 6f 64 65 2c 20 70 55 69 64 2c 20  z, pMode, pUid, 
30de0 70 47 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pGid);.    }.  }
30df0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30e00 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
30e10 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a  file zPath..** .
30e20 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74  ** Previously, t
30e30 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79  he SQLite OS lay
30e40 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75  er used three fu
30e50 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65  nctions in place
30e60 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a   of this.** one:
30e70 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  .**.**     sqlit
30e80 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
30e90 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e();.**     sqli
30ea0 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
30eb0 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  y();.**     sqli
30ec0 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
30ed0 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73  ve();.**.** Thes
30ee0 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f  e calls correspo
30ef0 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd to the follow
30f00 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
30f10 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
30f20 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29       ReadWrite()
30f30 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49   ->     (READWRI
30f40 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20  TE | CREATE).** 
30f50 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20      ReadOnly()  
30f60 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59  ->     (READONLY
30f70 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78  ) .**     OpenEx
30f80 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45  clusive() -> (RE
30f90 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
30fa0 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a   | EXCLUSIVE).**
30fb0 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e  .** The old Open
30fc0 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65  Exclusive() acce
30fd0 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61  pted a boolean a
30fe0 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c  rgument - "delFl
30ff0 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c  ag". If.** true,
31000 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f   the file was co
31010 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61  nfigured to be a
31020 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
31030 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  eted when the.**
31040 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f   file handle clo
31050 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20  sed. To achieve 
31060 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20  the same effect 
31070 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a  using this new .
31080 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64  ** interface, ad
31090 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c  d the DELETEONCL
310a0 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73  OSE flag to thos
310b0 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76  e specified abov
310c0 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78  e for .** OpenEx
310d0 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74  clusive()..*/.st
310e0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
310f0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
31100 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
31110 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72    /* The VFS for
31120 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20 74   which this is t
31130 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20  he xOpen method 
31140 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
31150 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
31160 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66    /* Pathname of
31170 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e   file to be open
31180 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
31190 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  file *pFile,    
311a0 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
311b0 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62   descriptor to b
311c0 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20  e filled in */. 
311d0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
311e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
311f0 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20   Input flags to 
31200 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e  control the open
31210 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ing */.  int *pO
31220 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  utFlags         
31230 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
31240 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 74  flags returned t
31250 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f  o SQLite core */
31260 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
31270 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  p = (unixFile *)
31280 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20  pFile;.  int fd 
31290 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
312a0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
312b0 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72  descriptor retur
312c0 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f  ned by open() */
312d0 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
312e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
312f0 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
31300 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a  ss to open() */.
31310 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
31320 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
31330 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
31340 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
31350 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20  t noLock;       
31360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31370 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63  True to omit loc
31380 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  king primitives 
31390 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
313a0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
313b0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
313c0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
313d0 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 3d   int ctrlFlags =
313e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
313f0 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c  /* UNIXFILE_* fl
31400 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73  ags */..  int is
31410 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c  Exclusive  = (fl
31420 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
31430 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  N_EXCLUSIVE);.  
31440 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
31450 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
31460 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
31470 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73  CLOSE);.  int is
31480 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c  Create     = (fl
31490 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
314a0 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74  N_CREATE);.  int
314b0 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20   isReadonly   = 
314c0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
314d0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
314e0 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74    int isReadWrit
314f0 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
31500 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
31510 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  ITE);.#if SQLITE
31520 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
31530 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75  STYLE.  int isAu
31540 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67  toProxy  = (flag
31550 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
31560 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64  AUTOPROXY);.#end
31570 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
31580 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
31590 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
315a0 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63  NG_STYLE.  struc
315b0 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
315c0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
315d0 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74   creating a mast
315e0 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20  er or main-file 
315f0 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75  journal, this fu
31600 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e  nction will open
31610 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73  .  ** a file-des
31620 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64  criptor on the d
31630 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68  irectory too. Th
31640 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69  e first time uni
31650 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20  xSync().  ** is 
31660 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63  called the direc
31670 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
31680 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79  ptor will be fsy
31690 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65  nc()ed and close
316a0 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ()d..  */.  int 
316b0 69 73 4e 65 77 4a 72 6e 6c 20 3d 20 28 69 73 43  isNewJrnl = (isC
316c0 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20  reate && (.     
316d0 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45     eType==SQLITE
316e0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
316f0 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
31700 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
31710 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _MAIN_JOURNAL . 
31720 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
31730 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
31740 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67  ));..  /* If arg
31750 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61  ument zPath is a
31760 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74   NULL pointer, t
31770 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
31780 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e  required to open
31790 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  .  ** a temporar
317a0 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73  y file. Use this
317b0 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65   buffer to store
317c0 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69   the file name i
317d0 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a  n..  */.  char z
317e0 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Tmpname[MAX_PATH
317f0 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74  NAME+2];.  const
31800 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a   char *zName = z
31810 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  Path;..  /* Chec
31820 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
31830 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
31840 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rue: .  **.  ** 
31850 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e    (a) Exactly on
31860 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49  e of the READWRI
31870 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20  TE and READONLY 
31880 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65  flags must be se
31890 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28  t, and .  **   (
318a0 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20  b) if CREATE is 
318b0 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52  set, then READWR
318c0 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ITE must also be
318d0 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
318e0 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56   (c) if EXCLUSIV
318f0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
31900 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
31910 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28  be set..  **   (
31920 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c  d) if DELETEONCL
31930 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  OSE is set, then
31940 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
31950 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  o be set..  */. 
31960 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f   assert((isReado
31970 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  nly==0 || isRead
31980 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73  Write==0) && (is
31990 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52  ReadWrite || isR
319a0 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73  eadonly));.  ass
319b0 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20  ert(isCreate==0 
319c0 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b  || isReadWrite);
319d0 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c  .  assert(isExcl
319e0 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72  usive==0 || isCr
319f0 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
31a00 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69  isDelete==0 || i
31a10 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
31a20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69  The main DB, mai
31a30 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66  n journal, WAL f
31a40 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  ile and master j
31a50 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
31a60 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63   .  ** automatic
31a70 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f  ally deleted. No
31a80 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20  r are they ever 
31a90 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
31aa0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
31ab0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
31ac0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
31ad0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
31ae0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  B );.  assert( (
31af0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
31b00 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
31b10 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
31b20 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
31b30 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
31b40 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
31b50 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
31b60 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b  ASTER_JOURNAL );
31b70 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
31b80 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
31b90 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
31ba0 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20  _OPEN_WAL );..  
31bb0 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
31bc0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68  he upper layer h
31bd0 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68  as set one of th
31be0 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c  e "file-type" fl
31bf0 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ags. */.  assert
31c00 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
31c10 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20  OPEN_MAIN_DB    
31c20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
31c30 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
31c40 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
31c50 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
31c60 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  IN_JOURNAL || eT
31c70 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
31c80 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _TEMP_JOURNAL . 
31c90 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
31ca0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
31cb0 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
31cc0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
31cd0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
31ce0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
31cf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
31d00 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70  SIENT_DB || eTyp
31d10 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
31d20 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 65  AL.  );..  /* De
31d30 74 65 63 74 20 61 20 70 69 64 20 63 68 61 6e 67  tect a pid chang
31d40 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  e and reset the 
31d50 50 52 4e 47 2e 20 20 54 68 65 72 65 20 69 73 20  PRNG.  There is 
31d60 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
31d70 0a 20 20 2a 2a 20 68 65 72 65 20 73 75 63 68 20  .  ** here such 
31d80 74 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65  that two or more
31d90 20 74 68 72 65 61 64 73 20 61 6c 6c 20 74 72 79   threads all try
31da0 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ing to open data
31db0 62 61 73 65 73 20 61 74 0a 20 20 2a 2a 20 74 68  bases at.  ** th
31dc0 65 20 73 61 6d 65 20 69 6e 73 74 61 6e 74 20 6d  e same instant m
31dd0 69 67 68 74 20 61 6c 6c 20 72 65 73 65 74 20 74  ight all reset t
31de0 68 65 20 50 52 4e 47 2e 20 20 42 75 74 20 6d 75  he PRNG.  But mu
31df0 6c 74 69 70 6c 65 20 72 65 73 65 74 73 0a 20 20  ltiple resets.  
31e00 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65 73 73 2e  ** are harmless.
31e10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 61 6e 64  .  */.  if( rand
31e20 6f 6d 6e 65 73 73 50 69 64 21 3d 6f 73 47 65 74  omnessPid!=osGet
31e30 70 69 64 28 30 29 20 29 7b 0a 20 20 20 20 72 61  pid(0) ){.    ra
31e40 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73  ndomnessPid = os
31e50 47 65 74 70 69 64 28 30 29 3b 0a 20 20 20 20 73  Getpid(0);.    s
31e60 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
31e70 73 28 30 2c 30 29 3b 0a 20 20 7d 0a 20 20 6d 65  s(0,0);.  }.  me
31e80 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
31e90 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20  f(unixFile));.. 
31ea0 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
31eb0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
31ec0 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65  ){.    UnixUnuse
31ed0 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20  dFd *pUnused;.  
31ee0 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
31ef0 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65  ReusableFd(zName
31f00 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
31f10 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
31f20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
31f30 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >fd;.    }else{.
31f40 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
31f50 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
31f60 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64  (sizeof(*pUnused
31f70 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ));.      if( !p
31f80 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
31f90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31fa0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
31fb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d    }.    }.    p-
31fc0 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
31fd0 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
31fe0 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  .    /* Database
31ff0 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64   filenames are d
32000 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
32010 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72  nated if they ar
32020 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49  e not.    ** URI
32030 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  s with parameter
32040 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20  s.  Hence, they 
32050 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61  can always be pa
32060 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ssed into.    **
32070 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
32080 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20  ameter(). */.   
32090 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
320a0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
320b0 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c  I) || zName[strl
320c0 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20  en(zName)+1]==0 
320d0 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  );..  }else if( 
320e0 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a  !zName ){.    /*
320f0 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c   If zName is NUL
32100 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  L, the upper lay
32110 65 72 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  er is requesting
32120 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f   a temp file. */
32130 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65  .    assert(isDe
32140 6c 65 74 65 20 26 26 20 21 69 73 4e 65 77 4a 72  lete && !isNewJr
32150 6e 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e  nl);.    rc = un
32160 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56  ixGetTempname(pV
32170 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
32180 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
32190 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
321a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
321b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
321c0 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
321d0 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
321e0 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
321f0 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79  enames are alway
32200 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  s double-zero te
32210 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20  rminated.    ** 
32220 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69 74  for use by sqlit
32230 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
32240 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (). */.    asser
32250 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28  t( zName[strlen(
32260 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  zName)+1]==0 );.
32270 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d    }..  /* Determ
32280 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ine the value of
32290 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
322a0 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50  eter passed to P
322b0 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20  OSIX function.  
322c0 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65  ** open(). These
322d0 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61   must be calcula
322e0 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e  ted even if open
322f0 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
32300 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d  , as.  ** they m
32310 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
32320 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
32330 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64   handle and used
32340 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63   by the .  ** 'c
32350 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69  onch file' locki
32360 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74  ng functions lat
32370 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  er on.  */.  if(
32380 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f   isReadonly )  o
32390 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
323a0 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65  ONLY;.  if( isRe
323b0 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c  adWrite ) openFl
323c0 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20  ags |= O_RDWR;. 
323d0 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20   if( isCreate ) 
323e0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
323f0 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69  O_CREAT;.  if( i
32400 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65  sExclusive ) ope
32410 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43  nFlags |= (O_EXC
32420 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20  L|O_NOFOLLOW);. 
32430 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
32440 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
32450 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c  ARY);..  if( fd<
32460 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20  0 ){.    mode_t 
32470 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20  openMode;       
32480 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73         /* Permis
32490 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20  sions to create 
324a0 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20  file with */.   
324b0 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20   uid_t uid;     
324c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
324d0 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68 65  * Userid for the
324e0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64   file */.    gid
324f0 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20 20 20  _t gid;         
32500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72             /* Gr
32510 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20 66 69  oupid for the fi
32520 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  le */.    rc = f
32530 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
32540 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20  e(zName, flags, 
32550 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c  &openMode, &uid,
32560 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20   &gid);.    if( 
32570 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32580 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
32590 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  p->pPreallocated
325a0 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20  Unused );.      
325b0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
325c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c  QLITE_OPEN_WAL |
325d0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
325e0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
325f0 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  L );.      retur
32600 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
32610 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
32620 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
32630 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
32640 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
32650 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c  X   %-3d %s 0%o\
32660 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f  n", fd, zName, o
32670 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20  penFlags));.    
32680 61 73 73 65 72 74 28 20 21 69 73 45 78 63 6c 75  assert( !isExclu
32690 73 69 76 65 20 7c 7c 20 28 6f 70 65 6e 46 6c 61  sive || (openFla
326a0 67 73 20 26 20 4f 5f 43 52 45 41 54 29 21 3d 30  gs & O_CREAT)!=0
326b0 20 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30   );.    if( fd<0
326c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
326d0 4e 65 77 4a 72 6e 6c 20 26 26 20 65 72 72 6e 6f  NewJrnl && errno
326e0 3d 3d 45 41 43 43 45 53 20 26 26 20 6f 73 41 63  ==EACCES && osAc
326f0 63 65 73 73 28 7a 4e 61 6d 65 2c 20 46 5f 4f 4b  cess(zName, F_OK
32700 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
32710 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 63 72 65  If unable to cre
32720 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65  ate a journal be
32730 63 61 75 73 65 20 74 68 65 20 64 69 72 65 63 74  cause the direct
32740 6f 72 79 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  ory is not.     
32750 20 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2c 20     ** writable, 
32760 63 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72  change the error
32770 20 63 6f 64 65 20 74 6f 20 69 6e 64 69 63 61 74   code to indicat
32780 65 20 74 68 61 74 2e 20 2a 2f 0a 20 20 20 20 20  e that. */.     
32790 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
327a0 45 41 44 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52  EADONLY_DIRECTOR
327b0 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  Y;.      }else i
327c0 66 28 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52  f( errno!=EISDIR
327d0 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65 20   && isReadWrite 
327e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  ){.        /* Fa
327f0 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  iled to open the
32800 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77   file for read/w
32810 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79  rite access. Try
32820 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20   read-only. */. 
32830 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
32840 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ~(SQLITE_OPEN_RE
32850 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
32860 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20  PEN_CREATE);.   
32870 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26       openFlags &
32880 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  = ~(O_RDWR|O_CRE
32890 41 54 29 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  AT);.        fla
328a0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
328b0 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
328c0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
328d0 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20   O_RDONLY;.     
328e0 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20     isReadonly = 
328f0 31 3b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20  1;.        fd = 
32900 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d  robust_open(zNam
32910 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70  e, openFlags, op
32920 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  enMode);.      }
32930 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
32940 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  d<0 ){.      int
32950 20 72 63 32 20 3d 20 75 6e 69 78 4c 6f 67 45 72   rc2 = unixLogEr
32960 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
32970 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
32980 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
32990 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
329a0 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
329b0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
329c0 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  nished;.    }.. 
329d0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72     /* If this pr
329e0 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67  ocess is running
329f0 20 61 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20   as root and if 
32a00 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72  creating a new r
32a10 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a  ollback.    ** j
32a20 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69  ournal or WAL fi
32a30 6c 65 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65  le, set the owne
32a40 72 73 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75  rship of the jou
32a50 72 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62  rnal or WAL to b
32a60 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d  e.    ** the sam
32a70 65 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61  e as the origina
32a80 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  l database..    
32a90 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  */.    if( flags
32aa0 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
32ab0 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  WAL|SQLITE_OPEN_
32ac0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b  MAIN_JOURNAL) ){
32ad0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 46 63 68  .      robustFch
32ae0 6f 77 6e 28 66 64 2c 20 75 69 64 2c 20 67 69 64  own(fd, uid, gid
32af0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  );.    }.  }.  a
32b00 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a  ssert( fd>=0 );.
32b10 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
32b20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  ){.    *pOutFlag
32b30 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
32b40 20 20 69 66 28 20 70 2d 3e 70 50 72 65 61 6c 6c    if( p->pPreall
32b50 6f 63 61 74 65 64 55 6e 75 73 65 64 20 29 7b 0a  ocatedUnused ){.
32b60 20 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63      p->pPrealloc
32b70 61 74 65 64 55 6e 75 73 65 64 2d 3e 66 64 20 3d  atedUnused->fd =
32b80 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65   fd;.    p->pPre
32b90 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 2d  allocatedUnused-
32ba0 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
32bb0 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c    }..  if( isDel
32bc0 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  ete ){.#if OS_VX
32bd0 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20  WORKS.    zPath 
32be0 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 69 66 20 64  = zName;.#elif d
32bf0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e  efined(SQLITE_UN
32c00 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45  LINK_AFTER_CLOSE
32c10 29 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 73 71  ).    zPath = sq
32c20 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
32c30 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
32c40 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 7b 0a  if( zPath==0 ){.
32c50 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
32c60 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(p, fd, __LINE
32c70 5f 5f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  __);.      retur
32c80 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
32c90 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  KPT;.    }.#else
32ca0 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e  .    osUnlink(zN
32cb0 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ame);.#endif.  }
32cc0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
32cd0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
32ce0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e  .  else{.    p->
32cf0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e  openFlags = open
32d00 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69  Flags;.  }.#endi
32d10 66 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64  f.  .#if defined
32d20 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53  (__APPLE__) || S
32d30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
32d40 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28  KING_STYLE.  if(
32d50 20 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73   fstatfs(fd, &fs
32d60 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
32d70 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
32d80 6f 28 70 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  o(p, errno);.   
32d90 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
32da0 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
32db0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32dc0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
32dd0 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73    }.  if (0 == s
32de0 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20  trncmp("msdos", 
32df0 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
32e00 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28  ame, 5)) {.    (
32e10 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
32e20 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51  )->fsFlags |= SQ
32e30 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
32e40 4d 53 44 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20  MSDOS;.  }.  if 
32e50 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65  (0 == strncmp("e
32e60 78 66 61 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  xfat", fsInfo.f_
32e70 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
32e80 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
32e90 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
32ea0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
32eb0 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
32ec0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
32ed0 65 74 20 75 70 20 61 70 70 72 6f 70 72 69 61 74  et up appropriat
32ee0 65 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20  e ctrlFlags */. 
32ef0 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 20   if( isDelete ) 
32f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
32f10 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
32f20 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69  FILE_DELETE;.  i
32f30 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
32f40 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
32f50 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
32f60 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 6e 6f 4c  LE_RDONLY;.  noL
32f70 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c  ock = eType!=SQL
32f80 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
32f90 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29  ;.  if( noLock )
32fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32fb0 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
32fc0 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a  NIXFILE_NOLOCK;.
32fd0 20 20 69 66 28 20 69 73 4e 65 77 4a 72 6e 6c 20    if( isNewJrnl 
32fe0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
32ff0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
33000 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20  XFILE_DIRSYNC;. 
33010 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
33020 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63  ITE_OPEN_URI ) c
33030 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
33040 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53  FILE_URI;..#if S
33050 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
33060 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53  KING_STYLE.#if S
33070 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
33080 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41  XY_LOCKING.  isA
33090 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65  utoProxy = 1;.#e
330a0 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75 74  ndif.  if( isAut
330b0 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68  oProxy && (zPath
330c0 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c  !=NULL) && (!noL
330d0 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f  ock) && pVfs->xO
330e0 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  pen ){.    char 
330f0 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65  *envforce = gete
33100 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45  nv("SQLITE_FORCE
33110 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29  _PROXY_LOCKING")
33120 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f  ;.    int usePro
33130 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  xy = 0;..    /* 
33140 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
33150 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65  XY_LOCKING==1 me
33160 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73  ans force always
33170 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65   use proxy, 0 me
33180 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65  ans .    ** neve
33190 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c  r use proxy, NUL
331a0 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78  L means use prox
331b0 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20  y for non-local 
331c0 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a  files only.  */.
331d0 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65      if( envforce
331e0 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  !=NULL ){.      
331f0 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28  useProxy = atoi(
33200 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20  envforce)>0;.   
33210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 73   }else{.      us
33220 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66  eProxy = !(fsInf
33230 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f  o.f_flags&MNT_LO
33240 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  CAL);.    }.    
33250 69 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a  if( useProxy ){.
33260 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49        rc = fillI
33270 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
33280 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
33290 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20  , ctrlFlags);.  
332a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
332b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
332c0 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73   rc = proxyTrans
332d0 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e  formUnixFile((un
332e0 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22  ixFile*)pFile, "
332f0 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20  :auto:");.      
33300 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33310 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
33320 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73   /* Use unixClos
33330 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68  e to clean up th
33340 65 20 72 65 73 6f 75 72 63 65 73 20 61 64 64 65  e resources adde
33350 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46  d in fillInUnixF
33360 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ile .          *
33370 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20  * and clear all 
33380 74 68 65 20 73 74 72 75 63 74 75 72 65 27 73 20  the structure's 
33390 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65  references.  Spe
333a0 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20  cifically, .    
333b0 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e        ** pFile->
333c0 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65  pMethods will be
333d0 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33   NULL so sqlite3
333e0 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20  OsClose will be 
333f0 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20  a no-op .       
33400 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
33410 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29  unixClose(pFile)
33420 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
33430 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
33440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
33450 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
33460 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  d;.    }.  }.#en
33470 64 69 66 0a 20 20 0a 20 20 61 73 73 65 72 74 28  dif.  .  assert(
33480 20 7a 50 61 74 68 3d 3d 30 20 7c 7c 20 7a 50 61   zPath==0 || zPa
33490 74 68 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20  th[0]=='/' .    
334a0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
334b0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
334c0 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
334d0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
334e0 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 29 3b 0a  N_JOURNAL .  );.
334f0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
33500 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
33510 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74  pFile, zPath, ct
33520 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f  rlFlags);..open_
33530 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20  finished:.  if( 
33540 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33550 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
33560 65 28 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74  e(p->pPreallocat
33570 65 64 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20  edUnused);.  }. 
33580 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
33590 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
335a0 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20   file at zPath. 
335b0 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61  If the dirSync a
335c0 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
335d0 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20   fsync().** the 
335e0 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
335f0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
33600 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
33610 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73   unixDelete(.  s
33620 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
33630 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20  sed,     /* VFS 
33640 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
33650 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d  as the xDelete m
33660 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
33670 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
33680 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
33690 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
336a0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53  ed */.  int dirS
336b0 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
336c0 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73    /* If true, fs
336d0 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20  ync() directory 
336e0 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66  after deleting f
336f0 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
33700 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
33710 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
33720 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
33730 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
33740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
33750 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66  RR_DELETE);.  if
33760 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68  ( osUnlink(zPath
33770 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69  )==(-1) ){.    i
33780 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  f( errno==ENOENT
33790 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
337a0 20 20 20 20 20 20 20 20 7c 7c 20 6f 73 41 63 63          || osAcc
337b0 65 73 73 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a  ess(zPath,0)!=0.
337c0 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20  #endif.    ){.  
337d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
337e0 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
337f0 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  NT;.    }else{. 
33800 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
33810 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
33820 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c  ERR_DELETE, "unl
33830 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ink", zPath);.  
33840 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
33850 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  c;.  }.#ifndef S
33860 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
33870 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72  RSYNC.  if( (dir
33880 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a  Sync & 1)!=0 ){.
33890 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
338a0 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
338b0 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
338c0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
338d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
338e0 20 69 66 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28   if( full_fsync(
338f0 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20  fd,0,0) ){.     
33900 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
33910 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
33920 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73  R_DIR_FSYNC, "fs
33930 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ync", zPath);.  
33940 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75      }.      robu
33950 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
33960 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
33970 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
33980 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  rt( rc==SQLITE_C
33990 41 4e 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20  ANTOPEN );.     
339a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
339b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
339c0 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
339d0 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  ../*.** Test the
339e0 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 6f 72   existence of or
339f0 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
33a00 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74  ons of file zPat
33a10 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70  h. The.** test p
33a20 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73  erformed depends
33a30 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
33a40 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
33a50 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
33a60 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31  EXISTS: Return 1
33a70 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   if the file exi
33a80 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  sts.**     SQLIT
33a90 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
33aa0 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  TE: Return 1 if 
33ab0 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
33ac0 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a   and writable..*
33ad0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
33ae0 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65  ESS_READONLY: Re
33af0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
33b00 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a  le is readable..
33b10 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  **.** Otherwise 
33b20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
33b30 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65  tic int unixAcce
33b40 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
33b50 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a  s *NotUsed,   /*
33b60 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e   The VFS contain
33b70 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73  ing this xAccess
33b80 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
33b90 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
33ba0 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
33bb0 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d  the file to exam
33bc0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ine */.  int fla
33bd0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
33be0 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77   /* What do we w
33bf0 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f  ant to learn abo
33c00 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c  ut the zPath fil
33c10 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  e? */.  int *pRe
33c20 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
33c30 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20  /* Write result 
33c40 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a  boolean here */.
33c50 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
33c60 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
33c70 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
33c80 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
33c90 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29  _IOERR_ACCESS; )
33ca0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
33cb0 4f 75 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Out!=0 );..  /* 
33cc0 54 68 65 20 73 70 65 63 20 73 61 79 73 20 74 68  The spec says th
33cd0 65 72 65 20 61 72 65 20 74 68 72 65 65 20 70 6f  ere are three po
33ce0 73 73 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f  ssible values fo
33cf0 72 20 66 6c 61 67 73 2e 20 20 42 75 74 20 6f 6e  r flags.  But on
33d00 6c 79 0a 20 20 2a 2a 20 74 77 6f 20 6f 66 20 74  ly.  ** two of t
33d10 68 65 6d 20 61 72 65 20 61 63 74 75 61 6c 6c 79  hem are actually
33d20 20 75 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72   used */.  asser
33d30 74 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  t( flags==SQLITE
33d40 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 7c  _ACCESS_EXISTS |
33d50 7c 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  | flags==SQLITE_
33d60 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
33d70 20 29 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73   );..  if( flags
33d80 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  ==SQLITE_ACCESS_
33d90 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 73 74  EXISTS ){.    st
33da0 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
33db0 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 30     *pResOut = (0
33dc0 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20  ==osStat(zPath, 
33dd0 26 62 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f  &buf) && buf.st_
33de0 73 69 7a 65 3e 30 29 3b 0a 20 20 7d 65 6c 73 65  size>0);.  }else
33df0 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d  {.    *pResOut =
33e00 20 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c   osAccess(zPath,
33e10 20 57 5f 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b 0a   W_OK|R_OK)==0;.
33e20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
33e30 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
33e40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
33e50 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  kFullPathname(. 
33e60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
33e70 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
33e80 20 2f 2a 20 49 6e 70 75 74 20 70 61 74 68 20 2a   /* Input path *
33e90 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20  /.  char *zOut, 
33ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33eb0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
33ec0 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ffer */.  int nO
33ed0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
33ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
33ef0 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 62  ocated size of b
33f00 75 66 66 65 72 20 7a 4f 75 74 20 2a 2f 0a 29 7b  uffer zOut */.){
33f10 0a 20 20 69 6e 74 20 6e 50 61 74 68 20 3d 20 73  .  int nPath = s
33f20 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
33f30 50 61 74 68 29 3b 0a 20 20 69 6e 74 20 69 4f 66  Path);.  int iOf
33f40 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 50 61  f = 0;.  if( zPa
33f50 74 68 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20  th[0]!='/' ){.  
33f60 20 20 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a    if( osGetcwd(z
33f70 4f 75 74 2c 20 6e 4f 75 74 2d 32 29 3d 3d 30 20  Out, nOut-2)==0 
33f80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
33f90 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
33fa0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
33fb0 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61  T, "getcwd", zPa
33fc0 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  th);.    }.    i
33fd0 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Off = sqlite3Str
33fe0 6c 65 6e 33 30 28 7a 4f 75 74 29 3b 0a 20 20 20  len30(zOut);.   
33ff0 20 7a 4f 75 74 5b 69 4f 66 66 2b 2b 5d 20 3d 20   zOut[iOff++] = 
34000 27 2f 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  '/';.  }.  if( (
34010 69 4f 66 66 2b 6e 50 61 74 68 2b 31 29 3e 6e 4f  iOff+nPath+1)>nO
34020 75 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 51 4c  ut ){.    /* SQL
34030 69 74 65 20 61 73 73 75 6d 65 73 20 74 68 61 74  ite assumes that
34040 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29   xFullPathname()
34050 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 73 20   nul-terminates 
34060 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
34070 72 0a 20 20 20 20 2a 2a 20 65 76 65 6e 20 69 66  r.    ** even if
34080 20 69 74 20 72 65 74 75 72 6e 73 20 61 6e 20 65   it returns an e
34090 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 7a 4f  rror.  */.    zO
340a0 75 74 5b 69 4f 66 66 5d 20 3d 20 27 5c 30 27 3b  ut[iOff] = '\0';
340b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
340c0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
340d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
340e0 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 69 4f  snprintf(nOut-iO
340f0 66 66 2c 20 26 7a 4f 75 74 5b 69 4f 66 66 5d 2c  ff, &zOut[iOff],
34100 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20   "%s", zPath);. 
34110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34120 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  K;.}../*.** Turn
34130 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
34140 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
34150 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72   pathname. The r
34160 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20  elative path.** 
34170 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e  is stored as a n
34180 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
34190 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66  ring in the buff
341a0 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
341b0 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a  .** zPath. .**.*
341c0 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f  * zOut points to
341d0 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
341e0 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66  least sqlite3_vf
341f0 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  s.mxPathname byt
34200 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20  es .** (in this 
34210 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41  case, MAX_PATHNA
34220 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66  ME bytes). The f
34230 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74  ull-path is writ
34240 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62  ten to.** this b
34250 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74  uffer before ret
34260 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
34270 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61  c int unixFullPa
34280 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
34290 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
342a0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
342b0 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
342c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
342d0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
342e0 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
342f0 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
34300 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  ath */.  int nOu
34310 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
34320 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
34330 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
34340 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
34350 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
34360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
34370 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
34380 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ){.#if !defined(
34390 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 29 20 7c  HAVE_READLINK) |
343a0 7c 20 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f  | !defined(HAVE_
343b0 4c 53 54 41 54 29 0a 20 20 72 65 74 75 72 6e 20  LSTAT).  return 
343c0 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a  mkFullPathname(z
343d0 50 61 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74  Path, zOut, nOut
343e0 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  );.#else.  int r
343f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
34400 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
34410 74 20 6e 4c 69 6e 6b 20 3d 20 31 3b 20 20 20 20  t nLink = 1;    
34420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
34430 75 6d 62 65 72 20 6f 66 20 73 79 6d 62 6f 6c 69  umber of symboli
34440 63 20 6c 69 6e 6b 73 20 66 6f 6c 6c 6f 77 65 64  c links followed
34450 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 6f 6e   so far */.  con
34460 73 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a  st char *zIn = z
34470 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Path;      /* In
34480 70 75 74 20 70 61 74 68 20 66 6f 72 20 65 61 63  put path for eac
34490 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c  h iteration of l
344a0 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  oop */.  char *z
344b0 44 65 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  Del = 0;..  asse
344c0 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  rt( pVfs->mxPath
344d0 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41  name==MAX_PATHNA
344e0 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ME );.  UNUSED_P
344f0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
34500 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
34510 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
34520 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
34530 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
34540 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
34550 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
34560 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
34570 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
34580 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
34590 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
345a0 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
345b0 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
345c0 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
345d0 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
345e0 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
345f0 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
34600 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
34610 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
34620 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
34630 29 3b 0a 0a 20 20 64 6f 20 7b 0a 0a 20 20 20 20  );..  do {..    
34640 2f 2a 20 43 61 6c 6c 20 73 74 61 74 28 29 20 6f  /* Call stat() o
34650 6e 20 70 61 74 68 20 7a 49 6e 2e 20 53 65 74 20  n path zIn. Set 
34660 62 4c 69 6e 6b 20 74 6f 20 74 72 75 65 20 69 66  bLink to true if
34670 20 74 68 65 20 70 61 74 68 20 69 73 20 61 20 73   the path is a s
34680 79 6d 62 6f 6c 69 63 0a 20 20 20 20 2a 2a 20 6c  ymbolic.    ** l
34690 69 6e 6b 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  ink, or false ot
346a0 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a 20 20 20  herwise.  */.   
346b0 20 69 6e 74 20 62 4c 69 6e 6b 20 3d 20 30 3b 0a   int bLink = 0;.
346c0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
346d0 62 75 66 3b 0a 20 20 20 20 69 66 28 20 6f 73 4c  buf;.    if( osL
346e0 73 74 61 74 28 7a 49 6e 2c 20 26 62 75 66 29 21  stat(zIn, &buf)!
346f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
34700 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
34710 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
34720 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
34730 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
34740 20 22 6c 73 74 61 74 22 2c 20 7a 49 6e 29 3b 0a   "lstat", zIn);.
34750 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34760 65 7b 0a 20 20 20 20 20 20 62 4c 69 6e 6b 20 3d  e{.      bLink =
34770 20 53 5f 49 53 4c 4e 4b 28 62 75 66 2e 73 74 5f   S_ISLNK(buf.st_
34780 6d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  mode);.    }..  
34790 20 20 69 66 28 20 62 4c 69 6e 6b 20 29 7b 0a 20    if( bLink ){. 
347a0 20 20 20 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30       if( zDel==0
347b0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c   ){.        zDel
347c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
347d0 63 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  c(nOut);.       
347e0 20 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29 20 72   if( zDel==0 ) r
347f0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
34800 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
34810 73 65 20 69 66 28 20 2b 2b 6e 4c 69 6e 6b 3e 53  se if( ++nLink>S
34820 51 4c 49 54 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e  QLITE_MAX_SYMLIN
34830 4b 53 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  KS ){.        rc
34840 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
34850 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EN_BKPT;.      }
34860 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
34870 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34880 20 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 52       nByte = osR
34890 65 61 64 6c 69 6e 6b 28 7a 49 6e 2c 20 7a 44 65  eadlink(zIn, zDe
348a0 6c 2c 20 6e 4f 75 74 2d 31 29 3b 0a 20 20 20 20  l, nOut-1);.    
348b0 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 30 20      if( nByte<0 
348c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
348d0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
348e0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
348f0 4b 50 54 2c 20 22 72 65 61 64 6c 69 6e 6b 22 2c  KPT, "readlink",
34900 20 7a 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d   zIn);.        }
34910 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
34920 69 66 28 20 7a 44 65 6c 5b 30 5d 21 3d 27 2f 27  if( zDel[0]!='/'
34930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34940 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  int n;.         
34950 20 20 20 66 6f 72 28 6e 20 3d 20 73 71 6c 69 74     for(n = sqlit
34960 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 6e 29 3b  e3Strlen30(zIn);
34970 20 6e 3e 30 20 26 26 20 7a 49 6e 5b 6e 2d 31 5d   n>0 && zIn[n-1]
34980 21 3d 27 2f 27 3b 20 6e 2d 2d 29 3b 0a 20 20 20  !='/'; n--);.   
34990 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 42 79           if( nBy
349a0 74 65 2b 6e 2b 31 3e 6e 4f 75 74 20 29 7b 0a 20  te+n+1>nOut ){. 
349b0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
349c0 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
349d0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  N_BKPT;.        
349e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
349f0 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65           memmove
34a00 28 26 7a 44 65 6c 5b 6e 5d 2c 20 7a 44 65 6c 2c  (&zDel[n], zDel,
34a10 20 6e 42 79 74 65 2b 31 29 3b 0a 20 20 20 20 20   nByte+1);.     
34a20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
34a30 7a 44 65 6c 2c 20 7a 49 6e 2c 20 6e 29 3b 0a 20  zDel, zIn, n);. 
34a40 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
34a50 74 65 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20  te += n;.       
34a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
34a70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 44 65   }.          zDe
34a80 6c 5b 6e 42 79 74 65 5d 20 3d 20 27 5c 30 27 3b  l[nByte] = '\0';
34a90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34aa0 20 7d 0a 0a 20 20 20 20 20 20 7a 49 6e 20 3d 20   }..      zIn = 
34ab0 7a 44 65 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  zDel;.    }..   
34ac0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
34ad0 49 54 45 5f 4f 4b 20 7c 7c 20 7a 49 6e 21 3d 7a  ITE_OK || zIn!=z
34ae0 4f 75 74 20 7c 7c 20 7a 49 6e 5b 30 5d 3d 3d 27  Out || zIn[0]=='
34af0 2f 27 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  /' );.    if( rc
34b00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
34b10 49 6e 21 3d 7a 4f 75 74 20 29 7b 0a 20 20 20 20  In!=zOut ){.    
34b20 20 20 72 63 20 3d 20 6d 6b 46 75 6c 6c 50 61 74    rc = mkFullPat
34b30 68 6e 61 6d 65 28 7a 49 6e 2c 20 7a 4f 75 74 2c  hname(zIn, zOut,
34b40 20 6e 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20   nOut);.    }.  
34b50 20 20 69 66 28 20 62 4c 69 6e 6b 3d 3d 30 20 29    if( bLink==0 )
34b60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 49 6e 20   break;.    zIn 
34b70 3d 20 7a 4f 75 74 3b 0a 20 20 7d 77 68 69 6c 65  = zOut;.  }while
34b80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34b90 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
34ba0 65 65 28 7a 44 65 6c 29 3b 0a 20 20 72 65 74 75  ee(zDel);.  retu
34bb0 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 20 20 20  rn rc;.#endif   
34bc0 2f 2a 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b  /* HAVE_READLINK
34bd0 20 26 26 20 48 41 56 45 5f 4c 53 54 41 54 20 2a   && HAVE_LSTAT *
34be0 2f 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  /.}...#ifndef SQ
34bf0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
34c00 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
34c10 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
34c20 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
34c30 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
34c40 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
34c50 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
34c60 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
34c70 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
34c80 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  d library..*/.#i
34c90 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e  nclude <dlfcn.h>
34ca0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
34cb0 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ixDlOpen(sqlite3
34cc0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63  _vfs *NotUsed, c
34cd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
34ce0 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  name){.  UNUSED_
34cf0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
34d00 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f  d);.  return dlo
34d10 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52  pen(zFilename, R
34d20 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47  TLD_NOW | RTLD_G
34d30 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LOBAL);.}../*.**
34d40 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
34d50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65  is function imme
34d60 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20  diately after a 
34d70 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79  call to unixDlSy
34d80 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c  m() or.** unixDl
34d90 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65  Open() fails (re
34da0 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69  turns a null poi
34db0 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65  nter). If a more
34dc0 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a   detailed error.
34dd0 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76  ** message is av
34de0 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77  ailable, it is w
34df0 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75  ritten to zBufOu
34e00 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d  t. If no error m
34e10 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61  essage.** is ava
34e20 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20  ilable, zBufOut 
34e30 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
34e40 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73  ed and SQLite us
34e50 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20  es a default.** 
34e60 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
34e70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
34e80 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ixDlError(sqlite
34e90 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
34ea0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
34eb0 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73  zBufOut){.  cons
34ec0 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20  t char *zErr;.  
34ed0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
34ee0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69  (NotUsed);.  uni
34ef0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
34f00 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28   zErr = dlerror(
34f10 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
34f20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
34f30 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
34f40 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29  Out, "%s", zErr)
34f50 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
34f60 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74  eMutex();.}.stat
34f70 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c  ic void (*unixDl
34f80 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
34f90 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
34fa0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53  p, const char*zS
34fb0 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a  ym))(void){.  /*
34fc0 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20   .  ** GCC with 
34fd0 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
34fe0 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64   says that C90 d
34ff0 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
35000 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a  void* to be.  **
35010 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69   cast into a poi
35020 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
35030 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65  on.  And yet the
35040 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29   library dlsym()
35050 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65   routine.  ** re
35060 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68  turns a void* wh
35070 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ich is really a 
35080 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
35090 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64  ction.  So how d
350a0 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c  o we.  ** use dl
350b0 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61  sym() with -peda
350c0 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a  ntic-errors?.  *
350d0 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20  *.  ** Variable 
350e0 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e  x below is defin
350f0 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74  ed to be a point
35100 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
35110 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72   taking.  ** par
35120 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e  ameters void* an
35130 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e  d const char* an
35140 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f  d returning a po
35150 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
35160 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69  ion..  ** We ini
35170 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73  tialize x by ass
35180 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e  igning it a poin
35190 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d  ter to the dlsym
351a0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  () function..  *
351b0 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65  * (That assignme
351c0 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61  nt requires a ca
351d0 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61  st.)  Then we ca
351e0 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ll the function 
351f0 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e  that.  ** x poin
35200 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20  ts to.  .  **.  
35210 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f  ** This work-aro
35220 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20  und is unlikely 
35230 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  to work correctl
35240 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20  y on any system 
35250 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72  where.  ** you r
35260 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73  eally cannot cas
35270 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  t a function poi
35280 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e  nter into void*.
35290 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74    But then, on t
352a0 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61  he.  ** other ha
352b0 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c  nd, dlsym() will
352c0 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63   not work on suc
352d0 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65  h a system eithe
352e0 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20  r, so we have.  
352f0 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f  ** not really lo
35300 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a  st anything..  *
35310 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28  /.  void (*(*x)(
35320 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
35330 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55  *))(void);.  UNU
35340 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
35350 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76  tUsed);.  x = (v
35360 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63  oid(*(*)(void*,c
35370 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
35380 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75  d))dlsym;.  retu
35390 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29  rn (*x)(p, zSym)
353a0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
353b0 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69  unixDlClose(sqli
353c0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
353d0 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
353e0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
353f0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
35400 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65   dlclose(pHandle
35410 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
35420 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
35430 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
35440 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
35450 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20  fine unixDlOpen 
35460 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
35470 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  xDlError 0.  #de
35480 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20  fine unixDlSym  
35490 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
354a0 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  xDlClose 0.#endi
354b0 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e  f../*.** Write n
354c0 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
354d0 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20  dom data to the 
354e0 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20  supplied buffer 
354f0 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
35500 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65  int unixRandomne
35510 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
35520 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
35530 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
35540 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
35550 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61  ER(NotUsed);.  a
35560 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42  ssert((size_t)nB
35570 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65  uf>=(sizeof(time
35580 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  _t)+sizeof(int))
35590 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  );..  /* We have
355a0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
355b0 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
355c0 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
355d0 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
355e0 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
355f0 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
35600 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
35610 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
35620 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
35630 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
35640 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
35650 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
35660 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
35670 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
35680 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
35690 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
356a0 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
356b0 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
356c0 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
356d0 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
356e0 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
356f0 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
35700 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
35710 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
35720 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
35730 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
35740 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
35750 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
35760 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
35770 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
35780 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
35790 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
357a0 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
357b0 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
357c0 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
357d0 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
357e0 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
357f0 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
35800 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
35810 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20  Buf, 0, nBuf);. 
35820 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d   randomnessPid =
35830 20 6f 73 47 65 74 70 69 64 28 30 29 3b 20 20 0a   osGetpid(0);  .
35840 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
35850 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
35860 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
35870 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20  T_RANDOMNESS).  
35880 7b 0a 20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f  {.    int fd, go
35890 74 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  t;.    fd = robu
358a0 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72  st_open("/dev/ur
358b0 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59  andom", O_RDONLY
358c0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64  , 0);.    if( fd
358d0 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
358e0 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
358f0 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
35900 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
35910 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 6d  eof(t));.      m
35920 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65  emcpy(&zBuf[size
35930 6f 66 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e  of(t)], &randomn
35940 65 73 73 50 69 64 2c 20 73 69 7a 65 6f 66 28 72  essPid, sizeof(r
35950 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a  andomnessPid));.
35960 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
35970 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 72  zeof(t)+sizeof(r
35980 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28  andomnessPid)<=(
35990 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20  size_t)nBuf );. 
359a0 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65       nBuf = size
359b0 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 72  of(t) + sizeof(r
359c0 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20  andomnessPid);. 
359d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
359e0 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64  do{ got = osRead
359f0 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29  (fd, zBuf, nBuf)
35a00 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  ; }while( got<0 
35a10 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
35a20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
35a30 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c  close(0, fd, __L
35a40 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20  INE__);.    }.  
35a50 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
35a60 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n nBuf;.}.../*.*
35a70 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
35a80 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
35a90 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
35aa0 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a  f time slept..**
35ab0 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
35ac0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
35ad0 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77  icroseconds we w
35ae0 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a  ant to sleep..**
35af0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
35b00 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
35b10 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
35b20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c  of sleep actuall
35b30 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66  y.** requested f
35b40 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  rom the underlyi
35b50 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ng operating sys
35b60 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68  tem, a number wh
35b70 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
35b80 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
35b90 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67  equal to the arg
35ba0 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c  ument, but not l
35bb0 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20  ess.** than the 
35bc0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
35bd0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65  tic int unixSlee
35be0 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  p(sqlite3_vfs *N
35bf0 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72  otUsed, int micr
35c00 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f  oseconds){.#if O
35c10 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
35c20 63 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a  ct timespec sp;.
35c30 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d  .  sp.tv_sec = m
35c40 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30  icroseconds / 10
35c50 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e  00000;.  sp.tv_n
35c60 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  sec = (microseco
35c70 6e 64 73 20 25 20 31 30 30 30 30 30 30 29 20 2a  nds % 1000000) *
35c80 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65   1000;.  nanosle
35c90 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20  ep(&sp, NULL);. 
35ca0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
35cb0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
35cc0 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
35cd0 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  s;.#elif defined
35ce0 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26  (HAVE_USLEEP) &&
35cf0 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75   HAVE_USLEEP.  u
35d00 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e  sleep(microsecon
35d10 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ds);.  UNUSED_PA
35d20 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
35d30 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f  ;.  return micro
35d40 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20  seconds;.#else. 
35d50 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28   int seconds = (
35d60 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39  microseconds+999
35d70 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20  999)/1000000;.  
35d80 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a  sleep(seconds);.
35d90 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
35da0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
35db0 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30  eturn seconds*10
35dc0 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  00000;.#endif.}.
35dd0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
35de0 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
35df0 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
35e00 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e  ero value, is in
35e10 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20  terpreted as.** 
35e20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
35e30 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
35e40 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20   and is used to 
35e50 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
35e60 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75  f.** sqlite3OsCu
35e70 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69  rrentTime() duri
35e80 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  ng testing..*/.#
35e90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
35ea0 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
35eb0 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20  rrent_time = 0; 
35ec0 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20   /* Fake system 
35ed0 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20  time in seconds 
35ee0 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23  since 1970. */.#
35ef0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
35f00 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
35f10 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
35f20 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
35f30 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  e).  Write into 
35f40 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75  *piNow.** the cu
35f50 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
35f60 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
35f70 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73  Day number times
35f80 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e   86_400_000.  In
35f90 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  .** other words,
35fa0 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   write into *piN
35fb0 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ow the number of
35fc0 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69   milliseconds si
35fd0 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a  nce the Julian.*
35fe0 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20  * epoch of noon 
35ff0 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20  in Greenwich on 
36000 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31  November 24, 471
36010 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20  4 B.C according 
36020 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70  to the.** prolep
36030 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61  tic Gregorian ca
36040 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  lendar..**.** On
36050 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
36060 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74   SQLITE_OK.  Ret
36070 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
36080 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
36090 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74   date .** cannot
360a0 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
360b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
360c0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71  rentTimeInt64(sq
360d0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
360e0 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ed, sqlite3_int6
360f0 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61  4 *piNow){.  sta
36100 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
36110 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
36120 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
36130 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
36140 30 30 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  000;.  int rc = 
36150 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64  SQLITE_OK;.#if d
36160 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44  efined(NO_GETTOD
36170 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20  ).  time_t t;.  
36180 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e  time(&t);.  *piN
36190 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69  ow = ((sqlite3_i
361a0 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75  nt64)t)*1000 + u
361b0 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20  nixEpoch;.#elif 
361c0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
361d0 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f  uct timespec sNo
361e0 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69  w;.  clock_getti
361f0 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d  me(CLOCK_REALTIM
36200 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69  E, &sNow);.  *pi
36210 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20  Now = unixEpoch 
36220 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  + 1000*(sqlite3_
36230 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65  int64)sNow.tv_se
36240 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63  c + sNow.tv_nsec
36250 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a  /1000000;.#else.
36260 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
36270 20 73 4e 6f 77 3b 0a 20 20 28 76 6f 69 64 29 67   sNow;.  (void)g
36280 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f  ettimeofday(&sNo
36290 77 2c 20 30 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f  w, 0);  /* Canno
362a0 74 20 66 61 69 6c 20 67 69 76 65 6e 20 76 61 6c  t fail given val
362b0 69 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  id arguments */.
362c0 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45    *piNow = unixE
362d0 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c  poch + 1000*(sql
362e0 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e  ite3_int64)sNow.
362f0 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76  tv_sec + sNow.tv
36300 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64  _usec/1000;.#end
36310 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
36320 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
36330 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
36340 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
36350 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
36360 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
36370 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
36380 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
36390 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
363a0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
363b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
363c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
363d0 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
363e0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
363f0 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
36400 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
36410 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
36420 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
36430 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
36440 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
36450 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
36460 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
36470 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
36480 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
36490 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
364a0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
364b0 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
364c0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
364d0 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a  otUsed, double *
364e0 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65  prNow){.  sqlite
364f0 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20  3_int64 i = 0;. 
36500 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45   int rc;.  UNUSE
36510 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
36520 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69  sed);.  rc = uni
36530 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
36540 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e  4(0, &i);.  *prN
36550 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e  ow = i/86400000.
36560 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
36570 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
36580 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
36590 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
365a0 20 54 68 65 20 78 47 65 74 4c 61 73 74 45 72 72   The xGetLastErr
365b0 6f 72 28 29 20 6d 65 74 68 6f 64 20 69 73 20 64  or() method is d
365c0 65 73 69 67 6e 65 64 20 74 6f 20 72 65 74 75 72  esigned to retur
365d0 6e 20 61 20 62 65 74 74 65 72 0a 2a 2a 20 6c 6f  n a better.** lo
365e0 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65  w-level error me
365f0 73 73 61 67 65 20 77 68 65 6e 20 6f 70 65 72 61  ssage when opera
36600 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62  ting-system prob
36610 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20  lems come up.** 
36620 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70  during SQLite op
36630 65 72 61 74 69 6f 6e 2e 20 20 4f 6e 6c 79 20 74  eration.  Only t
36640 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75 72  he integer retur
36650 6e 20 63 6f 64 65 20 69 73 20 63 75 72 72 65 6e  n code is curren
36660 74 6c 79 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a  tly.** used..*/.
36670 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
36680 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
36690 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
366a0 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20  , int NotUsed2, 
366b0 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b  char *NotUsed3){
366c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
366d0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
366e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
366f0 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e  (NotUsed2);.  UN
36700 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
36710 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75  otUsed3);.  retu
36720 72 6e 20 65 72 72 6e 6f 3b 0a 7d 0a 0a 0a 2f 2a  rn errno;.}.../*
36730 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
36740 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
36750 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
36760 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
36770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36780 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
36790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
367a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
367b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
367c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
367d0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
367e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
367f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36820 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
36830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
36840 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67  in Proxy Locking
36850 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
36860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36870 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  *.**.** Proxy lo
36880 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72  cking is a "uber
36890 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22  -locking-method"
368a0 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20   in this sense: 
368b0 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20   It uses the.** 
368c0 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65  other locking me
368d0 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61  thods on seconda
368e0 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20  ry lock files.  
368f0 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
36900 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72   a.** meta-layer
36910 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65   over top of the
36920 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
36930 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  ng implemented a
36940 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  bove.  For.** th
36950 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
36960 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
36970 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79  lements of proxy
36980 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65   locking is defe
36990 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61  rred.** until la
369a0 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28  te in the file (
369b0 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20  here) after all 
369c0 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f  of the other I/O
369d0 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a   methods have.**
369e0 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20   been defined - 
369f0 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d  so that the prim
36a00 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  itive locking me
36a10 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61  thods are availa
36a20 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63  ble.** as servic
36a30 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20  es to help with 
36a40 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
36a50 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  on of proxy lock
36a60 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a  ing..**.****.**.
36a70 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c  ** The default l
36a80 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69  ocking schemes i
36a90 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74  n SQLite use byt
36aa0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e  e-range locks on
36ab0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
36ac0 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e   file to coordin
36ad0 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72  ate safe, concur
36ae0 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d  rent access by m
36af0 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a  ultiple readers.
36b00 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b  ** and writers [
36b10 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
36b20 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c  g/lockingv3.html
36b30 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c  ].  The five fil
36b40 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61  e locking.** sta
36b50 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50  tes (UNLOCKED, P
36b60 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20  ENDING, SHARED, 
36b70 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53  RESERVED, EXCLUS
36b80 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  IVE) are impleme
36b90 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58  nted.** as POSIX
36ba0 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f   read & write lo
36bb0 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73  cks over fixed s
36bc0 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20  et of locations 
36bd0 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20  (via fsctl),.** 
36be0 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f  on AFP and SMB o
36bf0 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79  nly exclusive by
36c00 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
36c10 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61  re available via
36c20 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f   fsctl.** with _
36c30 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
36c40 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
36c50 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20  ckPB2) to track 
36c60 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65  the same 5 state
36c70 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74  s..** To simulat
36c80 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74  e a F_RDLCK on t
36c90 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c  he shared range,
36ca0 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d   on AFP a random
36cb0 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  ly selected.** a
36cc0 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68  ddress in the sh
36cd0 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
36ce0 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44  ken for a SHARED
36cf0 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72   lock, the entir
36d00 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67  e.** shared rang
36d10 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
36d20 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
36d30 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45  ):.**.**      PE
36d40 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20  NDING_BYTE      
36d50 20 20 30 78 34 30 30 30 30 30 30 30 0a 2a 2a 20    0x40000000.** 
36d60 20 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59       RESERVED_BY
36d70 54 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30  TE       0x40000
36d80 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  001.**      SHAR
36d90 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20  ED_RANGE        
36da0 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78  0x40000002 -> 0x
36db0 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54  40000200.**.** T
36dc0 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f  his works well o
36dd0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65  n the local file
36de0 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f   system, but sho
36df0 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78  ws a nearly 100x
36e00 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20  .** slowdown in 
36e10 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65  read performance
36e20 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20   on AFP because 
36e30 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64  the AFP client d
36e40 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72  isables.** the r
36e50 65 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62  ead cache when b
36e60 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
36e70 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e  are present.  En
36e80 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a  abling the read.
36e90 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73  ** cache exposes
36ea0 20 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e   a cache coheren
36eb0 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20  cy problem that 
36ec0 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c  is present on al
36ed0 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72  l OS X.** suppor
36ee0 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65  ted network file
36ef0 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61   systems.  NFS a
36f00 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65  nd AFP both obse
36f10 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65  rve the.** close
36f20 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69  -to-open semanti
36f30 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  cs for ensuring 
36f40 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a  cache coherency.
36f50 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73  ** [http://nfs.s
36f60 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23  ourceforge.net/#
36f70 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64  faq_a8], which d
36f80 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76  oes not effectiv
36f90 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74  ely.** address t
36fa0 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  he requirements 
36fb0 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64  for concurrent d
36fc0 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62  atabase access b
36fd0 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65  y multiple.** re
36fe0 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
36ff0 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77  s.** [http://www
37000 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69  .nabble.com/SQLi
37010 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d  te-on-NFS-cache-
37020 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35  coherency-td1565
37030 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a  5701.html]..**.*
37040 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65  * To address the
37050 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64   performance and
37060 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
37070 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66   issues, proxy f
37080 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63  ile locking.** c
37090 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64  hanges the way d
370a0 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69  atabase access i
370b0 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20  s controlled by 
370c0 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20  limiting access 
370d0 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68  to a.** single h
370e0 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e  ost at a time an
370f0 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f  d moving file lo
37100 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64  cks off of the d
37110 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
37120 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79  and onto a proxy
37130 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63   file on the loc
37140 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  al file system. 
37150 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67   .**.**.** Using
37160 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20   proxy locks.** 
37170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37180 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a  -.**.** C APIs.*
37190 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  *.**  sqlite3_fi
371a0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
371b0 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43  bname, SQLITE_FC
371c0 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_SET_LOCKPROX
371d0 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20  YFILE,.**       
371e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
371f0 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22  <proxy_path> | "
37200 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71  :auto:");.**  sq
37210 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
37220 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
37230 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f  QLITE_FCNTL_GET_
37240 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a  LOCKPROXYFILE,.*
37250 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
37260 20 20 20 20 20 20 20 20 26 3c 70 72 6f 78 79 5f          &<proxy_
37270 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a  path>);.**.**.**
37280 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a   SQL pragmas.**.
37290 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
372a0 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
372b0 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74  _file=<proxy_pat
372c0 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20  h> | :auto:.**  
372d0 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
372e0 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
372f0 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69  e.**.** Specifyi
37300 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e  ng ":auto:" mean
37310 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20  s that if there 
37320 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20  is a conch file 
37330 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a  with a matching.
37340 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74  ** host ID in it
37350 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68  , the proxy path
37360 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   in the conch fi
37370 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c  le will be used,
37380 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20   otherwise.** a 
37390 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64  proxy path based
373a0 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74   on the user's t
373b0 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20  emp dir.** (via 
373c0 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
373d0 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
373e0 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75  ,...)) will be u
373f0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61  sed and the.** a
37400 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  ctual proxy file
37410 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74   name is generat
37420 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65  ed from the name
37430 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65   and path of the
37440 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
37450 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  e.  For example:
37460 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72  .**.**       For
37470 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22   database path "
37480 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62  /Users/me/foo.db
37490 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  " .**       The 
374a0 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
374b0 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69  e "<tmpdir>/sqli
374c0 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f  teplocks/_Users_
374d0 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22  me_foo.db:auto:"
374e0 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c  ).**.** Once a l
374f0 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e  ock proxy is con
37500 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61  figured for a da
37510 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
37520 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a  n, it can not.**
37530 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77   be removed, how
37540 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73  ever it may be s
37550 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66  witched to a dif
37560 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74  ferent proxy pat
37570 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f  h via.** the abo
37580 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e  ve APIs (assumin
37590 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  g the conch file
375a0 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65   is not being he
375b0 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a  ld by another.**
375c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70   connection or p
375d0 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a  rocess). .**.**.
375e0 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63  ** How proxy loc
375f0 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d  king works.** --
37600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37610 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  -----.**.** Prox
37620 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72  y file locking r
37630 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20  elies primarily 
37640 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f  on two new suppo
37650 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a  rting files: .**
37660 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66  .**   *  conch f
37670 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63  ile to limit acc
37680 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
37690 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69  ase file to a si
376a0 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20  ngle host.**    
376b0 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a    at a time.**.*
376c0 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c  *   *  proxy fil
376d0 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72  e to act as a pr
376e0 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69  oxy for the advi
376f0 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61  sory locks norma
37700 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65  lly.**      take
37710 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
37720 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63  e.**.** The conc
37730 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20  h file - to use 
37740 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71  a proxy file, sq
37750 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20  lite must first 
37760 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22  "hold the conch"
37770 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e  .** by taking an
37780 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68   sqlite-style sh
37790 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
377a0 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61   conch file, rea
377b0 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  ding the.** cont
377c0 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69  ents and compari
377d0 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e  ng the host's un
377e0 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65  ique host ID (se
377f0 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63  e below) and loc
37800 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20  k.** proxy path 
37810 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75  against the valu
37820 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
37830 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e   conch.  The con
37840 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74  ch file is.** st
37850 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ored in the same
37860 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68   directory as th
37870 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
37880 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  and the file nam
37890 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65  e.** is patterne
378a0 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61  d after the data
378b0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
378c0 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d  s ".<databasenam
378d0 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66  e>-conch"..** If
378e0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
378f0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
37900 6f 72 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20  or its contents 
37910 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  do not match the
37920 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f  .** host ID and/
37930 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74  or proxy path, t
37940 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  hen the lock is 
37950 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20  escalated to an 
37960 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63  exclusive.** loc
37970 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20  k and the conch 
37980 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73  file contents is
37990 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
379a0 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72  e host ID and pr
379b0 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20  oxy.** path and 
379c0 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e  the lock is down
379d0 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61 72  graded to a shar
379e0 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20  ed lock again.  
379f0 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20  If the conch.** 
37a00 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  is held by anoth
37a10 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74 68  er process (with
37a20 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c   a shared lock),
37a30 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
37a40 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c  ock.** will fail
37a50 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59   and SQLITE_BUSY
37a60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
37a70 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
37a80 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79  le - a single-by
37a90 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  te file used for
37aa0 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69   all advisory fi
37ab0 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d  le locks.** norm
37ac0 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68  ally taken on th
37ad0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
37ae0 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66     This allows f
37af0 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a  or safe sharing.
37b00 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
37b10 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74  se file for mult
37b20 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64  iple readers and
37b30 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20   writers on the 
37b40 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68  same.** host (th
37b50 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20  e conch ensures 
37b60 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73  that they all us
37b70 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c  e the same local
37b80 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a   lock file)..**.
37b90 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74 68  ** Requesting th
37ba0 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65  e lock proxy doe
37bb0 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c  s not immediatel
37bc0 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68  y take the conch
37bd0 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  , it is.** only 
37be0 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66  taken when the f
37bf0 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f 20  irst request to 
37c00 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66 69  lock database fi
37c10 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a  le is made.  .**
37c20 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
37c30 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74  e semantics of t
37c40 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c  he traditional l
37c50 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c  ocking behavior,
37c60 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e   where.** openin
37c70 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  g a connection t
37c80 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
37c90 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20  e does not take 
37ca0 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a  a lock on it..**
37cb0 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   The shared lock
37cc0 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c   and an open fil
37cd0 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
37ce0 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69   maintained unti
37cf0 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63  l .** the connec
37d00 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tion to the data
37d10 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20  base is closed. 
37d20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
37d30 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f   file and the lo
37d40 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65  ck file are neve
37d50 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65  r deleted so the
37d60 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74  y only need.** t
37d70 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68 65  o be created the
37d80 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 79   first time they
37d90 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a   are used..**.**
37da0 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   Configuration o
37db0 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  ptions.** ------
37dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
37dd0 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52  **.**  SQLITE_PR
37de0 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
37df0 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44  NG.**.**       D
37e00 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 63  atabase files ac
37e10 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f  cessed on non-lo
37e20 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73  cal file systems
37e30 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75   are.**       au
37e40 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66  tomatically conf
37e50 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79  igured for proxy
37e60 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66   locking, lock f
37e70 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  iles are.**     
37e80 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69    named automati
37e90 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20  cally using the 
37ea0 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a  same logic as.**
37eb0 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f         PRAGMA lo
37ec0 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a  ck_proxy_file=":
37ed0 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a  auto:".**    .**
37ee0 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44    SQLITE_PROXY_D
37ef0 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  EBUG.**.**      
37f00 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67   Enables the log
37f10 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65  ging of error me
37f20 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f  ssages during ho
37f30 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20  st id file.**   
37f40 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e      retrieval an
37f50 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a  d creation.**.**
37f60 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a    LOCKPROXYDIR.*
37f70 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72  *.**       Overr
37f80 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c 74  ides the default
37f90 20 64 69 72 65 63 74 6f 72 79 20 75 73 65 64 20   directory used 
37fa0 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66  for lock proxy f
37fb0 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  iles that.**    
37fc0 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74     are named aut
37fd0 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74  omatically via t
37fe0 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74  he ":auto:" sett
37ff0 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ing.**.**  SQLIT
38000 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
38010 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a  IR_PERMISSIONS.*
38020 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69  *.**       Permi
38030 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68  ssions to use wh
38040 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64 69  en creating a di
38050 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72  rectory for stor
38060 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
38070 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
38080 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  s, only used whe
38090 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69  n LOCKPROXYDIR i
380a0 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20  s not set..**   
380b0 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d   .**    .** As m
380c0 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20  entioned above, 
380d0 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69  when compiled wi
380e0 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  th SQLITE_PREFER
380f0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a  _PROXY_LOCKING,.
38100 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  ** setting the e
38110 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
38120 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45  ble SQLITE_FORCE
38130 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74  _PROXY_LOCKING t
38140 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63  o 1 will.** forc
38150 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
38160 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
38170 76 65 72 79 20 64 61 74 61 62 61 73 65 20 66 69  very database fi
38180 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30  le opened, and 0
38190 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  .** will force a
381a0 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c  utomatic proxy l
381b0 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73  ocking to be dis
381c0 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61  abled for all da
381d0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20  tabase.** files 
381e0 28 65 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c  (explicitly call
381f0 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 46  ing the SQLITE_F
38200 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_SET_LOCKPRO
38210 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72  XYFILE pragma or
38220 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f  .** sqlite_file_
38230 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e  control API is n
38240 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53  ot affected by S
38250 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
38260 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a  Y_LOCKING)..*/..
38270 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  /*.** Proxy lock
38280 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
38290 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20  lable on MacOSX 
382a0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
382b0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
382c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
382d0 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a  ING_STYLE../*.**
382e0 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   The proxyLockin
382f0 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65  gContext has the
38300 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73   path and file s
38310 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68  tructures for th
38320 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64  e remote .** and
38330 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c   local proxy fil
38340 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65  es in it.*/.type
38350 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79  def struct proxy
38360 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70  LockingContext p
38370 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
38380 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79  xt;.struct proxy
38390 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
383a0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
383b0 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  chFile;         
383c0 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69  /* Open conch fi
383d0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f  le */.  char *co
383e0 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20  nchFilePath;    
383f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
38400 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  the conch file *
38410 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f  /.  unixFile *lo
38420 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20  ckProxy;        
38430 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c   /* Open proxy l
38440 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
38450 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74  ar *lockProxyPat
38460 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  h;         /* Na
38470 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20  me of the proxy 
38480 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
38490 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
384a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
384b0 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ame of the open 
384c0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  file */.  int co
384d0 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20  nchHeld;        
384e0 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74         /* 1 if t
384f0 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64  he conch is held
38500 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73  , -1 if lockless
38510 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73   */.  int nFails
38520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
38530 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
38540 63 6f 6e 63 68 20 74 61 6b 69 6e 67 20 66 61 69  conch taking fai
38550 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  lures */.  void 
38560 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  *oldLockingConte
38570 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  xt;     /* Origi
38580 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65  nal lockingconte
38590 78 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e  xt to restore on
385a0 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69   close */.  sqli
385b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63  te3_io_methods c
385c0 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64  onst *pOldMethod
385d0 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
385e0 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f  l I/O methods fo
385f0 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d